]> git.openstreetmap.org Git - rails.git/blob - vendor/assets/iD/iD.js
Merge remote-tracking branch 'upstream/pull/2080'
[rails.git] / vendor / assets / iD / iD.js
1 (function () {
2   var version = "4.13.0";
3
4   function ascending(a, b) {
5     return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;
6   }
7
8   function 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 ascending(f(d), x);
37     };
38   }
39
40   var ascendingBisect = bisector(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 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 = 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 quantile(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(ascending);
325     return Math.ceil((max - min) / (2 * (quantile(values, 0.75) - quantile(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 quantile(numbers.sort(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 = 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$1;
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$1(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 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 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 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 = 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 = 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 d3_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), mouse, this, arguments);
1883       if (!gesture) return;
1884       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       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 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] = 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 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] = 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: 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 interpolate(a, b) {
2737     var t = typeof b, c;
2738     return b == null || t === "boolean" ? constant$3(b)
2739         : (t === "number" ? interpolateNumber
2740         : t === "string" ? ((c = color(b)) ? (b = c, interpolateRgb) : interpolateString)
2741         : b instanceof color ? 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         : 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: interpolateNumber(xa, xb)}, {i: i - 2, x: 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: 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: 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: interpolateNumber(xa, xb)}, {i: i - 2, x: 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 timeout$1(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 timeout$1(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       timeout$1(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$1(a, b) {
3412     var c;
3413     return (typeof b === "number" ? interpolateNumber
3414         : b instanceof color ? interpolateRgb
3415         : (c = color(b)) ? (b = c, 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$1;
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$$1) {
3655     var name = this._name,
3656         id = this._id;
3657
3658     if (typeof select$$1 !== "function") select$$1 = selector(select$$1);
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$$1.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$$1) {
3674     var name = this._name,
3675         id = this._id;
3676
3677     if (typeof select$$1 !== "function") select$$1 = selectorAll(select$$1);
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$$1.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$1;
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             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 = 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 = 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 = 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 = 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 = 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 = 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 = 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(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 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     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$1;
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$1[0] = lambda0$1, range$1[1] = lambda1;
7029     }
7030   };
7031
7032   function boundsPoint(lambda, phi) {
7033     ranges.push(range$1 = [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$1 = [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$1[0] = lambda0$1, range$1[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$1[0] = lambda0$1, range$1[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     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$1 = 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     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 length$1(object) {
8341     lengthSum.reset();
8342     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 length$1(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 = 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 = 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 range(ceil(X0 / DX) * DX, X1, DX).map(X)
8459           .concat(range(ceil(Y0 / DY) * DY, Y1, DY).map(Y))
8460           .concat(range(ceil(x0 / dx) * dx, x1, dx).filter(function(x) { return abs(x % DX) > epsilon$2; }).map(x))
8461           .concat(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$2(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         geoStream(object, projectionStream(contextStream));
8897       }
8898       return contextStream.result();
8899     }
8900
8901     path.area = function(object) {
8902       geoStream(object, projectionStream(areaStream$1));
8903       return areaStream$1.result();
8904     };
8905
8906     path.measure = function(object) {
8907       geoStream(object, projectionStream(lengthStream$1));
8908       return lengthStream$1.result();
8909     };
8910
8911     path.bounds = function(object) {
8912       geoStream(object, projectionStream(boundsStream$1));
8913       return boundsStream$1.result();
8914     };
8915
8916     path.centroid = function(object) {
8917       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     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,
9326           (lower48Point.point(x, y), point)
9327           || (alaskaPoint.point(x, y), point)
9328           || (hawaiiPoint.point(x, y), point);
9329     }
9330
9331     albersUsa.invert = function(coordinates) {
9332       var k = lower48.scale(),
9333           t = lower48.translate(),
9334           x = (coordinates[0] - t[0]) / k,
9335           y = (coordinates[1] - t[1]) / k;
9336       return (y >= 0.120 && y < 0.234 && x >= -0.425 && x < -0.214 ? alaska
9337           : y >= 0.166 && y < 0.234 && x >= -0.214 && x < -0.115 ? hawaii
9338           : lower48).invert(coordinates);
9339     };
9340
9341     albersUsa.stream = function(stream) {
9342       return cache && cacheStream === stream ? cache : cache = multiplex([lower48.stream(cacheStream = stream), alaska.stream(stream), hawaii.stream(stream)]);
9343     };
9344
9345     albersUsa.precision = function(_) {
9346       if (!arguments.length) return lower48.precision();
9347       lower48.precision(_), alaska.precision(_), hawaii.precision(_);
9348       return reset();
9349     };
9350
9351     albersUsa.scale = function(_) {
9352       if (!arguments.length) return lower48.scale();
9353       lower48.scale(_), alaska.scale(_ * 0.35), hawaii.scale(_);
9354       return albersUsa.translate(lower48.translate());
9355     };
9356
9357     albersUsa.translate = function(_) {
9358       if (!arguments.length) return lower48.translate();
9359       var k = lower48.scale(), x = +_[0], y = +_[1];
9360
9361       lower48Point = lower48
9362           .translate(_)
9363           .clipExtent([[x - 0.455 * k, y - 0.238 * k], [x + 0.455 * k, y + 0.238 * k]])
9364           .stream(pointStream);
9365
9366       alaskaPoint = alaska
9367           .translate([x - 0.307 * k, y + 0.201 * k])
9368           .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]])
9369           .stream(pointStream);
9370
9371       hawaiiPoint = hawaii
9372           .translate([x - 0.205 * k, y + 0.212 * k])
9373           .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]])
9374           .stream(pointStream);
9375
9376       return reset();
9377     };
9378
9379     albersUsa.fitExtent = function(extent, object) {
9380       return fitExtent(albersUsa, extent, object);
9381     };
9382
9383     albersUsa.fitSize = function(size, object) {
9384       return fitSize(albersUsa, size, object);
9385     };
9386
9387     albersUsa.fitWidth = function(width, object) {
9388       return fitWidth(albersUsa, width, object);
9389     };
9390
9391     albersUsa.fitHeight = function(height, object) {
9392       return fitHeight(albersUsa, height, object);
9393     };
9394
9395     function reset() {
9396       cache = cacheStream = null;
9397       return albersUsa;
9398     }
9399
9400     return albersUsa.scale(1070);
9401   }
9402
9403   function azimuthalRaw(scale) {
9404     return function(x, y) {
9405       var cx = cos$1(x),
9406           cy = cos$1(y),
9407           k = scale(cx * cy);
9408       return [
9409         k * cy * sin$1(x),
9410         k * sin$1(y)
9411       ];
9412     }
9413   }
9414
9415   function azimuthalInvert(angle) {
9416     return function(x, y) {
9417       var z = sqrt(x * x + y * y),
9418           c = angle(z),
9419           sc = sin$1(c),
9420           cc = cos$1(c);
9421       return [
9422         atan2(x * sc, z * cc),
9423         asin(z && y * sc / z)
9424       ];
9425     }
9426   }
9427
9428   var azimuthalEqualAreaRaw = azimuthalRaw(function(cxcy) {
9429     return sqrt(2 / (1 + cxcy));
9430   });
9431
9432   azimuthalEqualAreaRaw.invert = azimuthalInvert(function(z) {
9433     return 2 * asin(z / 2);
9434   });
9435
9436   function azimuthalEqualArea() {
9437     return projection(azimuthalEqualAreaRaw)
9438         .scale(124.75)
9439         .clipAngle(180 - 1e-3);
9440   }
9441
9442   var azimuthalEquidistantRaw = azimuthalRaw(function(c) {
9443     return (c = acos(c)) && c / sin$1(c);
9444   });
9445
9446   azimuthalEquidistantRaw.invert = azimuthalInvert(function(z) {
9447     return z;
9448   });
9449
9450   function azimuthalEquidistant() {
9451     return projection(azimuthalEquidistantRaw)
9452         .scale(79.4188)
9453         .clipAngle(180 - 1e-3);
9454   }
9455
9456   function mercatorRaw(lambda, phi) {
9457     return [lambda, log(tan((halfPi$2 + phi) / 2))];
9458   }
9459
9460   mercatorRaw.invert = function(x, y) {
9461     return [x, 2 * atan(exp(y)) - halfPi$2];
9462   };
9463
9464   function mercator() {
9465     return mercatorProjection(mercatorRaw)
9466         .scale(961 / tau$3);
9467   }
9468
9469   function mercatorProjection(project) {
9470     var m = projection(project),
9471         center = m.center,
9472         scale = m.scale,
9473         translate = m.translate,
9474         clipExtent = m.clipExtent,
9475         x0 = null, y0, x1, y1; // clip extent
9476
9477     m.scale = function(_) {
9478       return arguments.length ? (scale(_), reclip()) : scale();
9479     };
9480
9481     m.translate = function(_) {
9482       return arguments.length ? (translate(_), reclip()) : translate();
9483     };
9484
9485     m.center = function(_) {
9486       return arguments.length ? (center(_), reclip()) : center();
9487     };
9488
9489     m.clipExtent = function(_) {
9490       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]];
9491     };
9492
9493     function reclip() {
9494       var k = pi$3 * scale(),
9495           t = m(rotation(m.rotate()).invert([0, 0]));
9496       return clipExtent(x0 == null
9497           ? [[t[0] - k, t[1] - k], [t[0] + k, t[1] + k]] : project === mercatorRaw
9498           ? [[Math.max(t[0] - k, x0), y0], [Math.min(t[0] + k, x1), y1]]
9499           : [[x0, Math.max(t[1] - k, y0)], [x1, Math.min(t[1] + k, y1)]]);
9500     }
9501
9502     return reclip();
9503   }
9504
9505   function tany(y) {
9506     return tan((halfPi$2 + y) / 2);
9507   }
9508
9509   function conicConformalRaw(y0, y1) {
9510     var cy0 = cos$1(y0),
9511         n = y0 === y1 ? sin$1(y0) : log(cy0 / cos$1(y1)) / log(tany(y1) / tany(y0)),
9512         f = cy0 * pow(tany(y0), n) / n;
9513
9514     if (!n) return mercatorRaw;
9515
9516     function project(x, y) {
9517       if (f > 0) { if (y < -halfPi$2 + epsilon$2) y = -halfPi$2 + epsilon$2; }
9518       else { if (y > halfPi$2 - epsilon$2) y = halfPi$2 - epsilon$2; }
9519       var r = f / pow(tany(y), n);
9520       return [r * sin$1(n * x), f - r * cos$1(n * x)];
9521     }
9522
9523     project.invert = function(x, y) {
9524       var fy = f - y, r = sign(n) * sqrt(x * x + fy * fy);
9525       return [atan2(x, abs(fy)) / n * sign(fy), 2 * atan(pow(f / r, 1 / n)) - halfPi$2];
9526     };
9527
9528     return project;
9529   }
9530
9531   function conicConformal() {
9532     return conicProjection(conicConformalRaw)
9533         .scale(109.5)
9534         .parallels([30, 30]);
9535   }
9536
9537   function equirectangularRaw(lambda, phi) {
9538     return [lambda, phi];
9539   }
9540
9541   equirectangularRaw.invert = equirectangularRaw;
9542
9543   function equirectangular() {
9544     return projection(equirectangularRaw)
9545         .scale(152.63);
9546   }
9547
9548   function conicEquidistantRaw(y0, y1) {
9549     var cy0 = cos$1(y0),
9550         n = y0 === y1 ? sin$1(y0) : (cy0 - cos$1(y1)) / (y1 - y0),
9551         g = cy0 / n + y0;
9552
9553     if (abs(n) < epsilon$2) return equirectangularRaw;
9554
9555     function project(x, y) {
9556       var gy = g - y, nx = n * x;
9557       return [gy * sin$1(nx), g - gy * cos$1(nx)];
9558     }
9559
9560     project.invert = function(x, y) {
9561       var gy = g - y;
9562       return [atan2(x, abs(gy)) / n * sign(gy), g - sign(n) * sqrt(x * x + gy * gy)];
9563     };
9564
9565     return project;
9566   }
9567
9568   function conicEquidistant() {
9569     return conicProjection(conicEquidistantRaw)
9570         .scale(131.154)
9571         .center([0, 13.9389]);
9572   }
9573
9574   function gnomonicRaw(x, y) {
9575     var cy = cos$1(y), k = cos$1(x) * cy;
9576     return [cy * sin$1(x) / k, sin$1(y) / k];
9577   }
9578
9579   gnomonicRaw.invert = azimuthalInvert(atan);
9580
9581   function gnomonic() {
9582     return projection(gnomonicRaw)
9583         .scale(144.049)
9584         .clipAngle(60);
9585   }
9586
9587   function scaleTranslate(kx, ky, tx, ty) {
9588     return kx === 1 && ky === 1 && tx === 0 && ty === 0 ? identity$4 : transformer({
9589       point: function(x, y) {
9590         this.stream.point(x * kx + tx, y * ky + ty);
9591       }
9592     });
9593   }
9594
9595   function d3_geoIdentity() {
9596     var k = 1, tx = 0, ty = 0, sx = 1, sy = 1, transform = identity$4, // scale, translate and reflect
9597         x0 = null, y0, x1, y1, // clip extent
9598         postclip = identity$4,
9599         cache,
9600         cacheStream,
9601         projection;
9602
9603     function reset() {
9604       cache = cacheStream = null;
9605       return projection;
9606     }
9607
9608     return projection = {
9609       stream: function(stream) {
9610         return cache && cacheStream === stream ? cache : cache = transform(postclip(cacheStream = stream));
9611       },
9612       postclip: function(_) {
9613         return arguments.length ? (postclip = _, x0 = y0 = x1 = y1 = null, reset()) : postclip;
9614       },
9615       clipExtent: function(_) {
9616         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]];
9617       },
9618       scale: function(_) {
9619         return arguments.length ? (transform = scaleTranslate((k = +_) * sx, k * sy, tx, ty), reset()) : k;
9620       },
9621       translate: function(_) {
9622         return arguments.length ? (transform = scaleTranslate(k * sx, k * sy, tx = +_[0], ty = +_[1]), reset()) : [tx, ty];
9623       },
9624       reflectX: function(_) {
9625         return arguments.length ? (transform = scaleTranslate(k * (sx = _ ? -1 : 1), k * sy, tx, ty), reset()) : sx < 0;
9626       },
9627       reflectY: function(_) {
9628         return arguments.length ? (transform = scaleTranslate(k * sx, k * (sy = _ ? -1 : 1), tx, ty), reset()) : sy < 0;
9629       },
9630       fitExtent: function(extent, object) {
9631         return fitExtent(projection, extent, object);
9632       },
9633       fitSize: function(size, object) {
9634         return fitSize(projection, size, object);
9635       },
9636       fitWidth: function(width, object) {
9637         return fitWidth(projection, width, object);
9638       },
9639       fitHeight: function(height, object) {
9640         return fitHeight(projection, height, object);
9641       }
9642     };
9643   }
9644
9645   function naturalEarth1Raw(lambda, phi) {
9646     var phi2 = phi * phi, phi4 = phi2 * phi2;
9647     return [
9648       lambda * (0.8707 - 0.131979 * phi2 + phi4 * (-0.013791 + phi4 * (0.003971 * phi2 - 0.001529 * phi4))),
9649       phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4)))
9650     ];
9651   }
9652
9653   naturalEarth1Raw.invert = function(x, y) {
9654     var phi = y, i = 25, delta;
9655     do {
9656       var phi2 = phi * phi, phi4 = phi2 * phi2;
9657       phi -= delta = (phi * (1.007226 + phi2 * (0.015085 + phi4 * (-0.044475 + 0.028874 * phi2 - 0.005916 * phi4))) - y) /
9658           (1.007226 + phi2 * (0.015085 * 3 + phi4 * (-0.044475 * 7 + 0.028874 * 9 * phi2 - 0.005916 * 11 * phi4)));
9659     } while (abs(delta) > epsilon$2 && --i > 0);
9660     return [
9661       x / (0.8707 + (phi2 = phi * phi) * (-0.131979 + phi2 * (-0.013791 + phi2 * phi2 * phi2 * (0.003971 - 0.001529 * phi2)))),
9662       phi
9663     ];
9664   };
9665
9666   function naturalEarth1() {
9667     return projection(naturalEarth1Raw)
9668         .scale(175.295);
9669   }
9670
9671   function orthographicRaw(x, y) {
9672     return [cos$1(y) * sin$1(x), sin$1(y)];
9673   }
9674
9675   orthographicRaw.invert = azimuthalInvert(asin);
9676
9677   function orthographic() {
9678     return projection(orthographicRaw)
9679         .scale(249.5)
9680         .clipAngle(90 + epsilon$2);
9681   }
9682
9683   function stereographicRaw(x, y) {
9684     var cy = cos$1(y), k = 1 + cos$1(x) * cy;
9685     return [cy * sin$1(x) / k, sin$1(y) / k];
9686   }
9687
9688   stereographicRaw.invert = azimuthalInvert(function(z) {
9689     return 2 * atan(z);
9690   });
9691
9692   function stereographic() {
9693     return projection(stereographicRaw)
9694         .scale(250)
9695         .clipAngle(142);
9696   }
9697
9698   function transverseMercatorRaw(lambda, phi) {
9699     return [log(tan((halfPi$2 + phi) / 2)), -lambda];
9700   }
9701
9702   transverseMercatorRaw.invert = function(x, y) {
9703     return [-y, 2 * atan(exp(x)) - halfPi$2];
9704   };
9705
9706   function transverseMercator() {
9707     var m = mercatorProjection(transverseMercatorRaw),
9708         center = m.center,
9709         rotate = m.rotate;
9710
9711     m.center = function(_) {
9712       return arguments.length ? center([-_[1], _[0]]) : (_ = center(), [_[1], -_[0]]);
9713     };
9714
9715     m.rotate = function(_) {
9716       return arguments.length ? rotate([_[0], _[1], _.length > 2 ? _[2] + 90 : 90]) : (_ = rotate(), [_[0], _[1], _[2] - 90]);
9717     };
9718
9719     return rotate([0, 0, 90])
9720         .scale(159.155);
9721   }
9722
9723   function defaultSeparation(a, b) {
9724     return a.parent === b.parent ? 1 : 2;
9725   }
9726
9727   function meanX(children) {
9728     return children.reduce(meanXReduce, 0) / children.length;
9729   }
9730
9731   function meanXReduce(x, c) {
9732     return x + c.x;
9733   }
9734
9735   function maxY(children) {
9736     return 1 + children.reduce(maxYReduce, 0);
9737   }
9738
9739   function maxYReduce(y, c) {
9740     return Math.max(y, c.y);
9741   }
9742
9743   function leafLeft(node) {
9744     var children;
9745     while (children = node.children) node = children[0];
9746     return node;
9747   }
9748
9749   function leafRight(node) {
9750     var children;
9751     while (children = node.children) node = children[children.length - 1];
9752     return node;
9753   }
9754
9755   function cluster() {
9756     var separation = defaultSeparation,
9757         dx = 1,
9758         dy = 1,
9759         nodeSize = false;
9760
9761     function cluster(root) {
9762       var previousNode,
9763           x = 0;
9764
9765       // First walk, computing the initial x & y values.
9766       root.eachAfter(function(node) {
9767         var children = node.children;
9768         if (children) {
9769           node.x = meanX(children);
9770           node.y = maxY(children);
9771         } else {
9772           node.x = previousNode ? x += separation(node, previousNode) : 0;
9773           node.y = 0;
9774           previousNode = node;
9775         }
9776       });
9777
9778       var left = leafLeft(root),
9779           right = leafRight(root),
9780           x0 = left.x - separation(left, right) / 2,
9781           x1 = right.x + separation(right, left) / 2;
9782
9783       // Second walk, normalizing x & y to the desired size.
9784       return root.eachAfter(nodeSize ? function(node) {
9785         node.x = (node.x - root.x) * dx;
9786         node.y = (root.y - node.y) * dy;
9787       } : function(node) {
9788         node.x = (node.x - x0) / (x1 - x0) * dx;
9789         node.y = (1 - (root.y ? node.y / root.y : 1)) * dy;
9790       });
9791     }
9792
9793     cluster.separation = function(x) {
9794       return arguments.length ? (separation = x, cluster) : separation;
9795     };
9796
9797     cluster.size = function(x) {
9798       return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? null : [dx, dy]);
9799     };
9800
9801     cluster.nodeSize = function(x) {
9802       return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], cluster) : (nodeSize ? [dx, dy] : null);
9803     };
9804
9805     return cluster;
9806   }
9807
9808   function count(node) {
9809     var sum = 0,
9810         children = node.children,
9811         i = children && children.length;
9812     if (!i) sum = 1;
9813     else while (--i >= 0) sum += children[i].value;
9814     node.value = sum;
9815   }
9816
9817   function node_count() {
9818     return this.eachAfter(count);
9819   }
9820
9821   function node_each(callback) {
9822     var node = this, current, next = [node], children, i, n;
9823     do {
9824       current = next.reverse(), next = [];
9825       while (node = current.pop()) {
9826         callback(node), children = node.children;
9827         if (children) for (i = 0, n = children.length; i < n; ++i) {
9828           next.push(children[i]);
9829         }
9830       }
9831     } while (next.length);
9832     return this;
9833   }
9834
9835   function node_eachBefore(callback) {
9836     var node = this, nodes = [node], children, i;
9837     while (node = nodes.pop()) {
9838       callback(node), children = node.children;
9839       if (children) for (i = children.length - 1; i >= 0; --i) {
9840         nodes.push(children[i]);
9841       }
9842     }
9843     return this;
9844   }
9845
9846   function node_eachAfter(callback) {
9847     var node = this, nodes = [node], next = [], children, i, n;
9848     while (node = nodes.pop()) {
9849       next.push(node), children = node.children;
9850       if (children) for (i = 0, n = children.length; i < n; ++i) {
9851         nodes.push(children[i]);
9852       }
9853     }
9854     while (node = next.pop()) {
9855       callback(node);
9856     }
9857     return this;
9858   }
9859
9860   function node_sum(value) {
9861     return this.eachAfter(function(node) {
9862       var sum = +value(node.data) || 0,
9863           children = node.children,
9864           i = children && children.length;
9865       while (--i >= 0) sum += children[i].value;
9866       node.value = sum;
9867     });
9868   }
9869
9870   function node_sort(compare) {
9871     return this.eachBefore(function(node) {
9872       if (node.children) {
9873         node.children.sort(compare);
9874       }
9875     });
9876   }
9877
9878   function node_path(end) {
9879     var start = this,
9880         ancestor = leastCommonAncestor(start, end),
9881         nodes = [start];
9882     while (start !== ancestor) {
9883       start = start.parent;
9884       nodes.push(start);
9885     }
9886     var k = nodes.length;
9887     while (end !== ancestor) {
9888       nodes.splice(k, 0, end);
9889       end = end.parent;
9890     }
9891     return nodes;
9892   }
9893
9894   function leastCommonAncestor(a, b) {
9895     if (a === b) return a;
9896     var aNodes = a.ancestors(),
9897         bNodes = b.ancestors(),
9898         c = null;
9899     a = aNodes.pop();
9900     b = bNodes.pop();
9901     while (a === b) {
9902       c = a;
9903       a = aNodes.pop();
9904       b = bNodes.pop();
9905     }
9906     return c;
9907   }
9908
9909   function node_ancestors() {
9910     var node = this, nodes = [node];
9911     while (node = node.parent) {
9912       nodes.push(node);
9913     }
9914     return nodes;
9915   }
9916
9917   function node_descendants() {
9918     var nodes = [];
9919     this.each(function(node) {
9920       nodes.push(node);
9921     });
9922     return nodes;
9923   }
9924
9925   function node_leaves() {
9926     var leaves = [];
9927     this.eachBefore(function(node) {
9928       if (!node.children) {
9929         leaves.push(node);
9930       }
9931     });
9932     return leaves;
9933   }
9934
9935   function node_links() {
9936     var root = this, links = [];
9937     root.each(function(node) {
9938       if (node !== root) { // Don’t include the root’s parent, if any.
9939         links.push({source: node.parent, target: node});
9940       }
9941     });
9942     return links;
9943   }
9944
9945   function hierarchy(data, children) {
9946     var root = new Node(data),
9947         valued = +data.value && (root.value = data.value),
9948         node,
9949         nodes = [root],
9950         child,
9951         childs,
9952         i,
9953         n;
9954
9955     if (children == null) children = defaultChildren;
9956
9957     while (node = nodes.pop()) {
9958       if (valued) node.value = +node.data.value;
9959       if ((childs = children(node.data)) && (n = childs.length)) {
9960         node.children = new Array(n);
9961         for (i = n - 1; i >= 0; --i) {
9962           nodes.push(child = node.children[i] = new Node(childs[i]));
9963           child.parent = node;
9964           child.depth = node.depth + 1;
9965         }
9966       }
9967     }
9968
9969     return root.eachBefore(computeHeight);
9970   }
9971
9972   function node_copy() {
9973     return hierarchy(this).eachBefore(copyData);
9974   }
9975
9976   function defaultChildren(d) {
9977     return d.children;
9978   }
9979
9980   function copyData(node) {
9981     node.data = node.data.data;
9982   }
9983
9984   function computeHeight(node) {
9985     var height = 0;
9986     do node.height = height;
9987     while ((node = node.parent) && (node.height < ++height));
9988   }
9989
9990   function Node(data) {
9991     this.data = data;
9992     this.depth =
9993     this.height = 0;
9994     this.parent = null;
9995   }
9996
9997   Node.prototype = hierarchy.prototype = {
9998     constructor: Node,
9999     count: node_count,
10000     each: node_each,
10001     eachAfter: node_eachAfter,
10002     eachBefore: node_eachBefore,
10003     sum: node_sum,
10004     sort: node_sort,
10005     path: node_path,
10006     ancestors: node_ancestors,
10007     descendants: node_descendants,
10008     leaves: node_leaves,
10009     links: node_links,
10010     copy: node_copy
10011   };
10012
10013   var slice$3 = Array.prototype.slice;
10014
10015   function shuffle$1(array) {
10016     var m = array.length,
10017         t,
10018         i;
10019
10020     while (m) {
10021       i = Math.random() * m-- | 0;
10022       t = array[m];
10023       array[m] = array[i];
10024       array[i] = t;
10025     }
10026
10027     return array;
10028   }
10029
10030   function enclose(circles) {
10031     var i = 0, n = (circles = shuffle$1(slice$3.call(circles))).length, B = [], p, e;
10032
10033     while (i < n) {
10034       p = circles[i];
10035       if (e && enclosesWeak(e, p)) ++i;
10036       else e = encloseBasis(B = extendBasis(B, p)), i = 0;
10037     }
10038
10039     return e;
10040   }
10041
10042   function extendBasis(B, p) {
10043     var i, j;
10044
10045     if (enclosesWeakAll(p, B)) return [p];
10046
10047     // If we get here then B must have at least one element.
10048     for (i = 0; i < B.length; ++i) {
10049       if (enclosesNot(p, B[i])
10050           && enclosesWeakAll(encloseBasis2(B[i], p), B)) {
10051         return [B[i], p];
10052       }
10053     }
10054
10055     // If we get here then B must have at least two elements.
10056     for (i = 0; i < B.length - 1; ++i) {
10057       for (j = i + 1; j < B.length; ++j) {
10058         if (enclosesNot(encloseBasis2(B[i], B[j]), p)
10059             && enclosesNot(encloseBasis2(B[i], p), B[j])
10060             && enclosesNot(encloseBasis2(B[j], p), B[i])
10061             && enclosesWeakAll(encloseBasis3(B[i], B[j], p), B)) {
10062           return [B[i], B[j], p];
10063         }
10064       }
10065     }
10066
10067     // If we get here then something is very wrong.
10068     throw new Error;
10069   }
10070
10071   function enclosesNot(a, b) {
10072     var dr = a.r - b.r, dx = b.x - a.x, dy = b.y - a.y;
10073     return dr < 0 || dr * dr < dx * dx + dy * dy;
10074   }
10075
10076   function enclosesWeak(a, b) {
10077     var dr = a.r - b.r + 1e-6, dx = b.x - a.x, dy = b.y - a.y;
10078     return dr > 0 && dr * dr > dx * dx + dy * dy;
10079   }
10080
10081   function enclosesWeakAll(a, B) {
10082     for (var i = 0; i < B.length; ++i) {
10083       if (!enclosesWeak(a, B[i])) {
10084         return false;
10085       }
10086     }
10087     return true;
10088   }
10089
10090   function encloseBasis(B) {
10091     switch (B.length) {
10092       case 1: return encloseBasis1(B[0]);
10093       case 2: return encloseBasis2(B[0], B[1]);
10094       case 3: return encloseBasis3(B[0], B[1], B[2]);
10095     }
10096   }
10097
10098   function encloseBasis1(a) {
10099     return {
10100       x: a.x,
10101       y: a.y,
10102       r: a.r
10103     };
10104   }
10105
10106   function encloseBasis2(a, b) {
10107     var x1 = a.x, y1 = a.y, r1 = a.r,
10108         x2 = b.x, y2 = b.y, r2 = b.r,
10109         x21 = x2 - x1, y21 = y2 - y1, r21 = r2 - r1,
10110         l = Math.sqrt(x21 * x21 + y21 * y21);
10111     return {
10112       x: (x1 + x2 + x21 / l * r21) / 2,
10113       y: (y1 + y2 + y21 / l * r21) / 2,
10114       r: (l + r1 + r2) / 2
10115     };
10116   }
10117
10118   function encloseBasis3(a, b, c) {
10119     var x1 = a.x, y1 = a.y, r1 = a.r,
10120         x2 = b.x, y2 = b.y, r2 = b.r,
10121         x3 = c.x, y3 = c.y, r3 = c.r,
10122         a2 = x1 - x2,
10123         a3 = x1 - x3,
10124         b2 = y1 - y2,
10125         b3 = y1 - y3,
10126         c2 = r2 - r1,
10127         c3 = r3 - r1,
10128         d1 = x1 * x1 + y1 * y1 - r1 * r1,
10129         d2 = d1 - x2 * x2 - y2 * y2 + r2 * r2,
10130         d3 = d1 - x3 * x3 - y3 * y3 + r3 * r3,
10131         ab = a3 * b2 - a2 * b3,
10132         xa = (b2 * d3 - b3 * d2) / (ab * 2) - x1,
10133         xb = (b3 * c2 - b2 * c3) / ab,
10134         ya = (a3 * d2 - a2 * d3) / (ab * 2) - y1,
10135         yb = (a2 * c3 - a3 * c2) / ab,
10136         A = xb * xb + yb * yb - 1,
10137         B = 2 * (r1 + xa * xb + ya * yb),
10138         C = xa * xa + ya * ya - r1 * r1,
10139         r = -(A ? (B + Math.sqrt(B * B - 4 * A * C)) / (2 * A) : C / B);
10140     return {
10141       x: x1 + xa + xb * r,
10142       y: y1 + ya + yb * r,
10143       r: r
10144     };
10145   }
10146
10147   function place(a, b, c) {
10148     var ax = a.x,
10149         ay = a.y,
10150         da = b.r + c.r,
10151         db = a.r + c.r,
10152         dx = b.x - ax,
10153         dy = b.y - ay,
10154         dc = dx * dx + dy * dy;
10155     if (dc) {
10156       var x = 0.5 + ((db *= db) - (da *= da)) / (2 * dc),
10157           y = Math.sqrt(Math.max(0, 2 * da * (db + dc) - (db -= dc) * db - da * da)) / (2 * dc);
10158       c.x = ax + x * dx + y * dy;
10159       c.y = ay + x * dy - y * dx;
10160     } else {
10161       c.x = ax + db;
10162       c.y = ay;
10163     }
10164   }
10165
10166   function intersects(a, b) {
10167     var dx = b.x - a.x,
10168         dy = b.y - a.y,
10169         dr = a.r + b.r;
10170     return dr * dr - 1e-6 > dx * dx + dy * dy;
10171   }
10172
10173   function score(node) {
10174     var a = node._,
10175         b = node.next._,
10176         ab = a.r + b.r,
10177         dx = (a.x * b.r + b.x * a.r) / ab,
10178         dy = (a.y * b.r + b.y * a.r) / ab;
10179     return dx * dx + dy * dy;
10180   }
10181
10182   function Node$1(circle) {
10183     this._ = circle;
10184     this.next = null;
10185     this.previous = null;
10186   }
10187
10188   function packEnclose(circles) {
10189     if (!(n = circles.length)) return 0;
10190
10191     var a, b, c, n, aa, ca, i, j, k, sj, sk;
10192
10193     // Place the first circle.
10194     a = circles[0], a.x = 0, a.y = 0;
10195     if (!(n > 1)) return a.r;
10196
10197     // Place the second circle.
10198     b = circles[1], a.x = -b.r, b.x = a.r, b.y = 0;
10199     if (!(n > 2)) return a.r + b.r;
10200
10201     // Place the third circle.
10202     place(b, a, c = circles[2]);
10203
10204     // Initialize the front-chain using the first three circles a, b and c.
10205     a = new Node$1(a), b = new Node$1(b), c = new Node$1(c);
10206     a.next = c.previous = b;
10207     b.next = a.previous = c;
10208     c.next = b.previous = a;
10209
10210     // Attempt to place each remaining circle…
10211     pack: for (i = 3; i < n; ++i) {
10212       place(a._, b._, c = circles[i]), c = new Node$1(c);
10213
10214       // Find the closest intersecting circle on the front-chain, if any.
10215       // “Closeness” is determined by linear distance along the front-chain.
10216       // “Ahead” or “behind” is likewise determined by linear distance.
10217       j = b.next, k = a.previous, sj = b._.r, sk = a._.r;
10218       do {
10219         if (sj <= sk) {
10220           if (intersects(j._, c._)) {
10221             b = j, a.next = b, b.previous = a, --i;
10222             continue pack;
10223           }
10224           sj += j._.r, j = j.next;
10225         } else {
10226           if (intersects(k._, c._)) {
10227             a = k, a.next = b, b.previous = a, --i;
10228             continue pack;
10229           }
10230           sk += k._.r, k = k.previous;
10231         }
10232       } while (j !== k.next);
10233
10234       // Success! Insert the new circle c between a and b.
10235       c.previous = a, c.next = b, a.next = b.previous = b = c;
10236
10237       // Compute the new closest circle pair to the centroid.
10238       aa = score(a);
10239       while ((c = c.next) !== b) {
10240         if ((ca = score(c)) < aa) {
10241           a = c, aa = ca;
10242         }
10243       }
10244       b = a.next;
10245     }
10246
10247     // Compute the enclosing circle of the front chain.
10248     a = [b._], c = b; while ((c = c.next) !== b) a.push(c._); c = enclose(a);
10249
10250     // Translate the circles to put the enclosing circle around the origin.
10251     for (i = 0; i < n; ++i) a = circles[i], a.x -= c.x, a.y -= c.y;
10252
10253     return c.r;
10254   }
10255
10256   function siblings(circles) {
10257     packEnclose(circles);
10258     return circles;
10259   }
10260
10261   function optional(f) {
10262     return f == null ? null : required(f);
10263   }
10264
10265   function required(f) {
10266     if (typeof f !== "function") throw new Error;
10267     return f;
10268   }
10269
10270   function constantZero() {
10271     return 0;
10272   }
10273
10274   function constant$8(x) {
10275     return function() {
10276       return x;
10277     };
10278   }
10279
10280   function defaultRadius$1(d) {
10281     return Math.sqrt(d.value);
10282   }
10283
10284   function index$1() {
10285     var radius = null,
10286         dx = 1,
10287         dy = 1,
10288         padding = constantZero;
10289
10290     function pack(root) {
10291       root.x = dx / 2, root.y = dy / 2;
10292       if (radius) {
10293         root.eachBefore(radiusLeaf(radius))
10294             .eachAfter(packChildren(padding, 0.5))
10295             .eachBefore(translateChild(1));
10296       } else {
10297         root.eachBefore(radiusLeaf(defaultRadius$1))
10298             .eachAfter(packChildren(constantZero, 1))
10299             .eachAfter(packChildren(padding, root.r / Math.min(dx, dy)))
10300             .eachBefore(translateChild(Math.min(dx, dy) / (2 * root.r)));
10301       }
10302       return root;
10303     }
10304
10305     pack.radius = function(x) {
10306       return arguments.length ? (radius = optional(x), pack) : radius;
10307     };
10308
10309     pack.size = function(x) {
10310       return arguments.length ? (dx = +x[0], dy = +x[1], pack) : [dx, dy];
10311     };
10312
10313     pack.padding = function(x) {
10314       return arguments.length ? (padding = typeof x === "function" ? x : constant$8(+x), pack) : padding;
10315     };
10316
10317     return pack;
10318   }
10319
10320   function radiusLeaf(radius) {
10321     return function(node) {
10322       if (!node.children) {
10323         node.r = Math.max(0, +radius(node) || 0);
10324       }
10325     };
10326   }
10327
10328   function packChildren(padding, k) {
10329     return function(node) {
10330       if (children = node.children) {
10331         var children,
10332             i,
10333             n = children.length,
10334             r = padding(node) * k || 0,
10335             e;
10336
10337         if (r) for (i = 0; i < n; ++i) children[i].r += r;
10338         e = packEnclose(children);
10339         if (r) for (i = 0; i < n; ++i) children[i].r -= r;
10340         node.r = e + r;
10341       }
10342     };
10343   }
10344
10345   function translateChild(k) {
10346     return function(node) {
10347       var parent = node.parent;
10348       node.r *= k;
10349       if (parent) {
10350         node.x = parent.x + k * node.x;
10351         node.y = parent.y + k * node.y;
10352       }
10353     };
10354   }
10355
10356   function roundNode(node) {
10357     node.x0 = Math.round(node.x0);
10358     node.y0 = Math.round(node.y0);
10359     node.x1 = Math.round(node.x1);
10360     node.y1 = Math.round(node.y1);
10361   }
10362
10363   function treemapDice(parent, x0, y0, x1, y1) {
10364     var nodes = parent.children,
10365         node,
10366         i = -1,
10367         n = nodes.length,
10368         k = parent.value && (x1 - x0) / parent.value;
10369
10370     while (++i < n) {
10371       node = nodes[i], node.y0 = y0, node.y1 = y1;
10372       node.x0 = x0, node.x1 = x0 += node.value * k;
10373     }
10374   }
10375
10376   function partition() {
10377     var dx = 1,
10378         dy = 1,
10379         padding = 0,
10380         round = false;
10381
10382     function partition(root) {
10383       var n = root.height + 1;
10384       root.x0 =
10385       root.y0 = padding;
10386       root.x1 = dx;
10387       root.y1 = dy / n;
10388       root.eachBefore(positionNode(dy, n));
10389       if (round) root.eachBefore(roundNode);
10390       return root;
10391     }
10392
10393     function positionNode(dy, n) {
10394       return function(node) {
10395         if (node.children) {
10396           treemapDice(node, node.x0, dy * (node.depth + 1) / n, node.x1, dy * (node.depth + 2) / n);
10397         }
10398         var x0 = node.x0,
10399             y0 = node.y0,
10400             x1 = node.x1 - padding,
10401             y1 = node.y1 - padding;
10402         if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10403         if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10404         node.x0 = x0;
10405         node.y0 = y0;
10406         node.x1 = x1;
10407         node.y1 = y1;
10408       };
10409     }
10410
10411     partition.round = function(x) {
10412       return arguments.length ? (round = !!x, partition) : round;
10413     };
10414
10415     partition.size = function(x) {
10416       return arguments.length ? (dx = +x[0], dy = +x[1], partition) : [dx, dy];
10417     };
10418
10419     partition.padding = function(x) {
10420       return arguments.length ? (padding = +x, partition) : padding;
10421     };
10422
10423     return partition;
10424   }
10425
10426   var keyPrefix$1 = "$", // Protect against keys like “__proto__”.
10427       preroot = {depth: -1},
10428       ambiguous = {};
10429
10430   function defaultId(d) {
10431     return d.id;
10432   }
10433
10434   function defaultParentId(d) {
10435     return d.parentId;
10436   }
10437
10438   function stratify() {
10439     var id = defaultId,
10440         parentId = defaultParentId;
10441
10442     function stratify(data) {
10443       var d,
10444           i,
10445           n = data.length,
10446           root,
10447           parent,
10448           node,
10449           nodes = new Array(n),
10450           nodeId,
10451           nodeKey,
10452           nodeByKey = {};
10453
10454       for (i = 0; i < n; ++i) {
10455         d = data[i], node = nodes[i] = new Node(d);
10456         if ((nodeId = id(d, i, data)) != null && (nodeId += "")) {
10457           nodeKey = keyPrefix$1 + (node.id = nodeId);
10458           nodeByKey[nodeKey] = nodeKey in nodeByKey ? ambiguous : node;
10459         }
10460       }
10461
10462       for (i = 0; i < n; ++i) {
10463         node = nodes[i], nodeId = parentId(data[i], i, data);
10464         if (nodeId == null || !(nodeId += "")) {
10465           if (root) throw new Error("multiple roots");
10466           root = node;
10467         } else {
10468           parent = nodeByKey[keyPrefix$1 + nodeId];
10469           if (!parent) throw new Error("missing: " + nodeId);
10470           if (parent === ambiguous) throw new Error("ambiguous: " + nodeId);
10471           if (parent.children) parent.children.push(node);
10472           else parent.children = [node];
10473           node.parent = parent;
10474         }
10475       }
10476
10477       if (!root) throw new Error("no root");
10478       root.parent = preroot;
10479       root.eachBefore(function(node) { node.depth = node.parent.depth + 1; --n; }).eachBefore(computeHeight);
10480       root.parent = null;
10481       if (n > 0) throw new Error("cycle");
10482
10483       return root;
10484     }
10485
10486     stratify.id = function(x) {
10487       return arguments.length ? (id = required(x), stratify) : id;
10488     };
10489
10490     stratify.parentId = function(x) {
10491       return arguments.length ? (parentId = required(x), stratify) : parentId;
10492     };
10493
10494     return stratify;
10495   }
10496
10497   function defaultSeparation$1(a, b) {
10498     return a.parent === b.parent ? 1 : 2;
10499   }
10500
10501   // function radialSeparation(a, b) {
10502   //   return (a.parent === b.parent ? 1 : 2) / a.depth;
10503   // }
10504
10505   // This function is used to traverse the left contour of a subtree (or
10506   // subforest). It returns the successor of v on this contour. This successor is
10507   // either given by the leftmost child of v or by the thread of v. The function
10508   // returns null if and only if v is on the highest level of its subtree.
10509   function nextLeft(v) {
10510     var children = v.children;
10511     return children ? children[0] : v.t;
10512   }
10513
10514   // This function works analogously to nextLeft.
10515   function nextRight(v) {
10516     var children = v.children;
10517     return children ? children[children.length - 1] : v.t;
10518   }
10519
10520   // Shifts the current subtree rooted at w+. This is done by increasing
10521   // prelim(w+) and mod(w+) by shift.
10522   function moveSubtree(wm, wp, shift) {
10523     var change = shift / (wp.i - wm.i);
10524     wp.c -= change;
10525     wp.s += shift;
10526     wm.c += change;
10527     wp.z += shift;
10528     wp.m += shift;
10529   }
10530
10531   // All other shifts, applied to the smaller subtrees between w- and w+, are
10532   // performed by this function. To prepare the shifts, we have to adjust
10533   // change(w+), shift(w+), and change(w-).
10534   function executeShifts(v) {
10535     var shift = 0,
10536         change = 0,
10537         children = v.children,
10538         i = children.length,
10539         w;
10540     while (--i >= 0) {
10541       w = children[i];
10542       w.z += shift;
10543       w.m += shift;
10544       shift += w.s + (change += w.c);
10545     }
10546   }
10547
10548   // If vi-’s ancestor is a sibling of v, returns vi-’s ancestor. Otherwise,
10549   // returns the specified (default) ancestor.
10550   function nextAncestor(vim, v, ancestor) {
10551     return vim.a.parent === v.parent ? vim.a : ancestor;
10552   }
10553
10554   function TreeNode(node, i) {
10555     this._ = node;
10556     this.parent = null;
10557     this.children = null;
10558     this.A = null; // default ancestor
10559     this.a = this; // ancestor
10560     this.z = 0; // prelim
10561     this.m = 0; // mod
10562     this.c = 0; // change
10563     this.s = 0; // shift
10564     this.t = null; // thread
10565     this.i = i; // number
10566   }
10567
10568   TreeNode.prototype = Object.create(Node.prototype);
10569
10570   function treeRoot(root) {
10571     var tree = new TreeNode(root, 0),
10572         node,
10573         nodes = [tree],
10574         child,
10575         children,
10576         i,
10577         n;
10578
10579     while (node = nodes.pop()) {
10580       if (children = node._.children) {
10581         node.children = new Array(n = children.length);
10582         for (i = n - 1; i >= 0; --i) {
10583           nodes.push(child = node.children[i] = new TreeNode(children[i], i));
10584           child.parent = node;
10585         }
10586       }
10587     }
10588
10589     (tree.parent = new TreeNode(null, 0)).children = [tree];
10590     return tree;
10591   }
10592
10593   // Node-link tree diagram using the Reingold-Tilford "tidy" algorithm
10594   function tree() {
10595     var separation = defaultSeparation$1,
10596         dx = 1,
10597         dy = 1,
10598         nodeSize = null;
10599
10600     function tree(root) {
10601       var t = treeRoot(root);
10602
10603       // Compute the layout using Buchheim et al.’s algorithm.
10604       t.eachAfter(firstWalk), t.parent.m = -t.z;
10605       t.eachBefore(secondWalk);
10606
10607       // If a fixed node size is specified, scale x and y.
10608       if (nodeSize) root.eachBefore(sizeNode);
10609
10610       // If a fixed tree size is specified, scale x and y based on the extent.
10611       // Compute the left-most, right-most, and depth-most nodes for extents.
10612       else {
10613         var left = root,
10614             right = root,
10615             bottom = root;
10616         root.eachBefore(function(node) {
10617           if (node.x < left.x) left = node;
10618           if (node.x > right.x) right = node;
10619           if (node.depth > bottom.depth) bottom = node;
10620         });
10621         var s = left === right ? 1 : separation(left, right) / 2,
10622             tx = s - left.x,
10623             kx = dx / (right.x + s + tx),
10624             ky = dy / (bottom.depth || 1);
10625         root.eachBefore(function(node) {
10626           node.x = (node.x + tx) * kx;
10627           node.y = node.depth * ky;
10628         });
10629       }
10630
10631       return root;
10632     }
10633
10634     // Computes a preliminary x-coordinate for v. Before that, FIRST WALK is
10635     // applied recursively to the children of v, as well as the function
10636     // APPORTION. After spacing out the children by calling EXECUTE SHIFTS, the
10637     // node v is placed to the midpoint of its outermost children.
10638     function firstWalk(v) {
10639       var children = v.children,
10640           siblings = v.parent.children,
10641           w = v.i ? siblings[v.i - 1] : null;
10642       if (children) {
10643         executeShifts(v);
10644         var midpoint = (children[0].z + children[children.length - 1].z) / 2;
10645         if (w) {
10646           v.z = w.z + separation(v._, w._);
10647           v.m = v.z - midpoint;
10648         } else {
10649           v.z = midpoint;
10650         }
10651       } else if (w) {
10652         v.z = w.z + separation(v._, w._);
10653       }
10654       v.parent.A = apportion(v, w, v.parent.A || siblings[0]);
10655     }
10656
10657     // Computes all real x-coordinates by summing up the modifiers recursively.
10658     function secondWalk(v) {
10659       v._.x = v.z + v.parent.m;
10660       v.m += v.parent.m;
10661     }
10662
10663     // The core of the algorithm. Here, a new subtree is combined with the
10664     // previous subtrees. Threads are used to traverse the inside and outside
10665     // contours of the left and right subtree up to the highest common level. The
10666     // vertices used for the traversals are vi+, vi-, vo-, and vo+, where the
10667     // superscript o means outside and i means inside, the subscript - means left
10668     // subtree and + means right subtree. For summing up the modifiers along the
10669     // contour, we use respective variables si+, si-, so-, and so+. Whenever two
10670     // nodes of the inside contours conflict, we compute the left one of the
10671     // greatest uncommon ancestors using the function ANCESTOR and call MOVE
10672     // SUBTREE to shift the subtree and prepare the shifts of smaller subtrees.
10673     // Finally, we add a new thread (if necessary).
10674     function apportion(v, w, ancestor) {
10675       if (w) {
10676         var vip = v,
10677             vop = v,
10678             vim = w,
10679             vom = vip.parent.children[0],
10680             sip = vip.m,
10681             sop = vop.m,
10682             sim = vim.m,
10683             som = vom.m,
10684             shift;
10685         while (vim = nextRight(vim), vip = nextLeft(vip), vim && vip) {
10686           vom = nextLeft(vom);
10687           vop = nextRight(vop);
10688           vop.a = v;
10689           shift = vim.z + sim - vip.z - sip + separation(vim._, vip._);
10690           if (shift > 0) {
10691             moveSubtree(nextAncestor(vim, v, ancestor), v, shift);
10692             sip += shift;
10693             sop += shift;
10694           }
10695           sim += vim.m;
10696           sip += vip.m;
10697           som += vom.m;
10698           sop += vop.m;
10699         }
10700         if (vim && !nextRight(vop)) {
10701           vop.t = vim;
10702           vop.m += sim - sop;
10703         }
10704         if (vip && !nextLeft(vom)) {
10705           vom.t = vip;
10706           vom.m += sip - som;
10707           ancestor = v;
10708         }
10709       }
10710       return ancestor;
10711     }
10712
10713     function sizeNode(node) {
10714       node.x *= dx;
10715       node.y = node.depth * dy;
10716     }
10717
10718     tree.separation = function(x) {
10719       return arguments.length ? (separation = x, tree) : separation;
10720     };
10721
10722     tree.size = function(x) {
10723       return arguments.length ? (nodeSize = false, dx = +x[0], dy = +x[1], tree) : (nodeSize ? null : [dx, dy]);
10724     };
10725
10726     tree.nodeSize = function(x) {
10727       return arguments.length ? (nodeSize = true, dx = +x[0], dy = +x[1], tree) : (nodeSize ? [dx, dy] : null);
10728     };
10729
10730     return tree;
10731   }
10732
10733   function treemapSlice(parent, x0, y0, x1, y1) {
10734     var nodes = parent.children,
10735         node,
10736         i = -1,
10737         n = nodes.length,
10738         k = parent.value && (y1 - y0) / parent.value;
10739
10740     while (++i < n) {
10741       node = nodes[i], node.x0 = x0, node.x1 = x1;
10742       node.y0 = y0, node.y1 = y0 += node.value * k;
10743     }
10744   }
10745
10746   var phi = (1 + Math.sqrt(5)) / 2;
10747
10748   function squarifyRatio(ratio, parent, x0, y0, x1, y1) {
10749     var rows = [],
10750         nodes = parent.children,
10751         row,
10752         nodeValue,
10753         i0 = 0,
10754         i1 = 0,
10755         n = nodes.length,
10756         dx, dy,
10757         value = parent.value,
10758         sumValue,
10759         minValue,
10760         maxValue,
10761         newRatio,
10762         minRatio,
10763         alpha,
10764         beta;
10765
10766     while (i0 < n) {
10767       dx = x1 - x0, dy = y1 - y0;
10768
10769       // Find the next non-empty node.
10770       do sumValue = nodes[i1++].value; while (!sumValue && i1 < n);
10771       minValue = maxValue = sumValue;
10772       alpha = Math.max(dy / dx, dx / dy) / (value * ratio);
10773       beta = sumValue * sumValue * alpha;
10774       minRatio = Math.max(maxValue / beta, beta / minValue);
10775
10776       // Keep adding nodes while the aspect ratio maintains or improves.
10777       for (; i1 < n; ++i1) {
10778         sumValue += nodeValue = nodes[i1].value;
10779         if (nodeValue < minValue) minValue = nodeValue;
10780         if (nodeValue > maxValue) maxValue = nodeValue;
10781         beta = sumValue * sumValue * alpha;
10782         newRatio = Math.max(maxValue / beta, beta / minValue);
10783         if (newRatio > minRatio) { sumValue -= nodeValue; break; }
10784         minRatio = newRatio;
10785       }
10786
10787       // Position and record the row orientation.
10788       rows.push(row = {value: sumValue, dice: dx < dy, children: nodes.slice(i0, i1)});
10789       if (row.dice) treemapDice(row, x0, y0, x1, value ? y0 += dy * sumValue / value : y1);
10790       else treemapSlice(row, x0, y0, value ? x0 += dx * sumValue / value : x1, y1);
10791       value -= sumValue, i0 = i1;
10792     }
10793
10794     return rows;
10795   }
10796
10797   var squarify = (function custom(ratio) {
10798
10799     function squarify(parent, x0, y0, x1, y1) {
10800       squarifyRatio(ratio, parent, x0, y0, x1, y1);
10801     }
10802
10803     squarify.ratio = function(x) {
10804       return custom((x = +x) > 1 ? x : 1);
10805     };
10806
10807     return squarify;
10808   })(phi);
10809
10810   function index$2() {
10811     var tile = squarify,
10812         round = false,
10813         dx = 1,
10814         dy = 1,
10815         paddingStack = [0],
10816         paddingInner = constantZero,
10817         paddingTop = constantZero,
10818         paddingRight = constantZero,
10819         paddingBottom = constantZero,
10820         paddingLeft = constantZero;
10821
10822     function treemap(root) {
10823       root.x0 =
10824       root.y0 = 0;
10825       root.x1 = dx;
10826       root.y1 = dy;
10827       root.eachBefore(positionNode);
10828       paddingStack = [0];
10829       if (round) root.eachBefore(roundNode);
10830       return root;
10831     }
10832
10833     function positionNode(node) {
10834       var p = paddingStack[node.depth],
10835           x0 = node.x0 + p,
10836           y0 = node.y0 + p,
10837           x1 = node.x1 - p,
10838           y1 = node.y1 - p;
10839       if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10840       if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10841       node.x0 = x0;
10842       node.y0 = y0;
10843       node.x1 = x1;
10844       node.y1 = y1;
10845       if (node.children) {
10846         p = paddingStack[node.depth + 1] = paddingInner(node) / 2;
10847         x0 += paddingLeft(node) - p;
10848         y0 += paddingTop(node) - p;
10849         x1 -= paddingRight(node) - p;
10850         y1 -= paddingBottom(node) - p;
10851         if (x1 < x0) x0 = x1 = (x0 + x1) / 2;
10852         if (y1 < y0) y0 = y1 = (y0 + y1) / 2;
10853         tile(node, x0, y0, x1, y1);
10854       }
10855     }
10856
10857     treemap.round = function(x) {
10858       return arguments.length ? (round = !!x, treemap) : round;
10859     };
10860
10861     treemap.size = function(x) {
10862       return arguments.length ? (dx = +x[0], dy = +x[1], treemap) : [dx, dy];
10863     };
10864
10865     treemap.tile = function(x) {
10866       return arguments.length ? (tile = required(x), treemap) : tile;
10867     };
10868
10869     treemap.padding = function(x) {
10870       return arguments.length ? treemap.paddingInner(x).paddingOuter(x) : treemap.paddingInner();
10871     };
10872
10873     treemap.paddingInner = function(x) {
10874       return arguments.length ? (paddingInner = typeof x === "function" ? x : constant$8(+x), treemap) : paddingInner;
10875     };
10876
10877     treemap.paddingOuter = function(x) {
10878       return arguments.length ? treemap.paddingTop(x).paddingRight(x).paddingBottom(x).paddingLeft(x) : treemap.paddingTop();
10879     };
10880
10881     treemap.paddingTop = function(x) {
10882       return arguments.length ? (paddingTop = typeof x === "function" ? x : constant$8(+x), treemap) : paddingTop;
10883     };
10884
10885     treemap.paddingRight = function(x) {
10886       return arguments.length ? (paddingRight = typeof x === "function" ? x : constant$8(+x), treemap) : paddingRight;
10887     };
10888
10889     treemap.paddingBottom = function(x) {
10890       return arguments.length ? (paddingBottom = typeof x === "function" ? x : constant$8(+x), treemap) : paddingBottom;
10891     };
10892
10893     treemap.paddingLeft = function(x) {
10894       return arguments.length ? (paddingLeft = typeof x === "function" ? x : constant$8(+x), treemap) : paddingLeft;
10895     };
10896
10897     return treemap;
10898   }
10899
10900   function binary(parent, x0, y0, x1, y1) {
10901     var nodes = parent.children,
10902         i, n = nodes.length,
10903         sum, sums = new Array(n + 1);
10904
10905     for (sums[0] = sum = i = 0; i < n; ++i) {
10906       sums[i + 1] = sum += nodes[i].value;
10907     }
10908
10909     partition(0, n, parent.value, x0, y0, x1, y1);
10910
10911     function partition(i, j, value, x0, y0, x1, y1) {
10912       if (i >= j - 1) {
10913         var node = nodes[i];
10914         node.x0 = x0, node.y0 = y0;
10915         node.x1 = x1, node.y1 = y1;
10916         return;
10917       }
10918
10919       var valueOffset = sums[i],
10920           valueTarget = (value / 2) + valueOffset,
10921           k = i + 1,
10922           hi = j - 1;
10923
10924       while (k < hi) {
10925         var mid = k + hi >>> 1;
10926         if (sums[mid] < valueTarget) k = mid + 1;
10927         else hi = mid;
10928       }
10929
10930       if ((valueTarget - sums[k - 1]) < (sums[k] - valueTarget) && i + 1 < k) --k;
10931
10932       var valueLeft = sums[k] - valueOffset,
10933           valueRight = value - valueLeft;
10934
10935       if ((x1 - x0) > (y1 - y0)) {
10936         var xk = (x0 * valueRight + x1 * valueLeft) / value;
10937         partition(i, k, valueLeft, x0, y0, xk, y1);
10938         partition(k, j, valueRight, xk, y0, x1, y1);
10939       } else {
10940         var yk = (y0 * valueRight + y1 * valueLeft) / value;
10941         partition(i, k, valueLeft, x0, y0, x1, yk);
10942         partition(k, j, valueRight, x0, yk, x1, y1);
10943       }
10944     }
10945   }
10946
10947   function sliceDice(parent, x0, y0, x1, y1) {
10948     (parent.depth & 1 ? treemapSlice : treemapDice)(parent, x0, y0, x1, y1);
10949   }
10950
10951   var resquarify = (function custom(ratio) {
10952
10953     function resquarify(parent, x0, y0, x1, y1) {
10954       if ((rows = parent._squarify) && (rows.ratio === ratio)) {
10955         var rows,
10956             row,
10957             nodes,
10958             i,
10959             j = -1,
10960             n,
10961             m = rows.length,
10962             value = parent.value;
10963
10964         while (++j < m) {
10965           row = rows[j], nodes = row.children;
10966           for (i = row.value = 0, n = nodes.length; i < n; ++i) row.value += nodes[i].value;
10967           if (row.dice) treemapDice(row, x0, y0, x1, y0 += (y1 - y0) * row.value / value);
10968           else treemapSlice(row, x0, y0, x0 += (x1 - x0) * row.value / value, y1);
10969           value -= row.value;
10970         }
10971       } else {
10972         parent._squarify = rows = squarifyRatio(ratio, parent, x0, y0, x1, y1);
10973         rows.ratio = ratio;
10974       }
10975     }
10976
10977     resquarify.ratio = function(x) {
10978       return custom((x = +x) > 1 ? x : 1);
10979     };
10980
10981     return resquarify;
10982   })(phi);
10983
10984   function d3_polygonArea(polygon) {
10985     var i = -1,
10986         n = polygon.length,
10987         a,
10988         b = polygon[n - 1],
10989         area = 0;
10990
10991     while (++i < n) {
10992       a = b;
10993       b = polygon[i];
10994       area += a[1] * b[0] - a[0] * b[1];
10995     }
10996
10997     return area / 2;
10998   }
10999
11000   function d3_polygonCentroid(polygon) {
11001     var i = -1,
11002         n = polygon.length,
11003         x = 0,
11004         y = 0,
11005         a,
11006         b = polygon[n - 1],
11007         c,
11008         k = 0;
11009
11010     while (++i < n) {
11011       a = b;
11012       b = polygon[i];
11013       k += c = a[0] * b[1] - b[0] * a[1];
11014       x += (a[0] + b[0]) * c;
11015       y += (a[1] + b[1]) * c;
11016     }
11017
11018     return k *= 3, [x / k, y / k];
11019   }
11020
11021   // Returns the 2D cross product of AB and AC vectors, i.e., the z-component of
11022   // the 3D cross product in a quadrant I Cartesian coordinate system (+x is
11023   // right, +y is up). Returns a positive value if ABC is counter-clockwise,
11024   // negative if clockwise, and zero if the points are collinear.
11025   function cross$1(a, b, c) {
11026     return (b[0] - a[0]) * (c[1] - a[1]) - (b[1] - a[1]) * (c[0] - a[0]);
11027   }
11028
11029   function lexicographicOrder(a, b) {
11030     return a[0] - b[0] || a[1] - b[1];
11031   }
11032
11033   // Computes the upper convex hull per the monotone chain algorithm.
11034   // Assumes points.length >= 3, is sorted by x, unique in y.
11035   // Returns an array of indices into points in left-to-right order.
11036   function computeUpperHullIndexes(points) {
11037     var n = points.length,
11038         indexes = [0, 1],
11039         size = 2;
11040
11041     for (var i = 2; i < n; ++i) {
11042       while (size > 1 && cross$1(points[indexes[size - 2]], points[indexes[size - 1]], points[i]) <= 0) --size;
11043       indexes[size++] = i;
11044     }
11045
11046     return indexes.slice(0, size); // remove popped points
11047   }
11048
11049   function d3_polygonHull(points) {
11050     if ((n = points.length) < 3) return null;
11051
11052     var i,
11053         n,
11054         sortedPoints = new Array(n),
11055         flippedPoints = new Array(n);
11056
11057     for (i = 0; i < n; ++i) sortedPoints[i] = [+points[i][0], +points[i][1], i];
11058     sortedPoints.sort(lexicographicOrder);
11059     for (i = 0; i < n; ++i) flippedPoints[i] = [sortedPoints[i][0], -sortedPoints[i][1]];
11060
11061     var upperIndexes = computeUpperHullIndexes(sortedPoints),
11062         lowerIndexes = computeUpperHullIndexes(flippedPoints);
11063
11064     // Construct the hull polygon, removing possible duplicate endpoints.
11065     var skipLeft = lowerIndexes[0] === upperIndexes[0],
11066         skipRight = lowerIndexes[lowerIndexes.length - 1] === upperIndexes[upperIndexes.length - 1],
11067         hull = [];
11068
11069     // Add upper hull in right-to-l order.
11070     // Then add lower hull in left-to-right order.
11071     for (i = upperIndexes.length - 1; i >= 0; --i) hull.push(points[sortedPoints[upperIndexes[i]][2]]);
11072     for (i = +skipLeft; i < lowerIndexes.length - skipRight; ++i) hull.push(points[sortedPoints[lowerIndexes[i]][2]]);
11073
11074     return hull;
11075   }
11076
11077   function contains$1(polygon, point) {
11078     var n = polygon.length,
11079         p = polygon[n - 1],
11080         x = point[0], y = point[1],
11081         x0 = p[0], y0 = p[1],
11082         x1, y1,
11083         inside = false;
11084
11085     for (var i = 0; i < n; ++i) {
11086       p = polygon[i], x1 = p[0], y1 = p[1];
11087       if (((y1 > y) !== (y0 > y)) && (x < (x0 - x1) * (y - y1) / (y0 - y1) + x1)) inside = !inside;
11088       x0 = x1, y0 = y1;
11089     }
11090
11091     return inside;
11092   }
11093
11094   function length$2(polygon) {
11095     var i = -1,
11096         n = polygon.length,
11097         b = polygon[n - 1],
11098         xa,
11099         ya,
11100         xb = b[0],
11101         yb = b[1],
11102         perimeter = 0;
11103
11104     while (++i < n) {
11105       xa = xb;
11106       ya = yb;
11107       b = polygon[i];
11108       xb = b[0];
11109       yb = b[1];
11110       xa -= xb;
11111       ya -= yb;
11112       perimeter += Math.sqrt(xa * xa + ya * ya);
11113     }
11114
11115     return perimeter;
11116   }
11117
11118   var slice$4 = [].slice;
11119
11120   var noabort = {};
11121
11122   function Queue(size) {
11123     this._size = size;
11124     this._call =
11125     this._error = null;
11126     this._tasks = [];
11127     this._data = [];
11128     this._waiting =
11129     this._active =
11130     this._ended =
11131     this._start = 0; // inside a synchronous task callback?
11132   }
11133
11134   Queue.prototype = queue.prototype = {
11135     constructor: Queue,
11136     defer: function(callback) {
11137       if (typeof callback !== "function") throw new Error("invalid callback");
11138       if (this._call) throw new Error("defer after await");
11139       if (this._error != null) return this;
11140       var t = slice$4.call(arguments, 1);
11141       t.push(callback);
11142       ++this._waiting, this._tasks.push(t);
11143       poke$1(this);
11144       return this;
11145     },
11146     abort: function() {
11147       if (this._error == null) abort(this, new Error("abort"));
11148       return this;
11149     },
11150     await: function(callback) {
11151       if (typeof callback !== "function") throw new Error("invalid callback");
11152       if (this._call) throw new Error("multiple await");
11153       this._call = function(error, results) { callback.apply(null, [error].concat(results)); };
11154       maybeNotify(this);
11155       return this;
11156     },
11157     awaitAll: function(callback) {
11158       if (typeof callback !== "function") throw new Error("invalid callback");
11159       if (this._call) throw new Error("multiple await");
11160       this._call = callback;
11161       maybeNotify(this);
11162       return this;
11163     }
11164   };
11165
11166   function poke$1(q) {
11167     if (!q._start) {
11168       try { start$1(q); } // let the current task complete
11169       catch (e) {
11170         if (q._tasks[q._ended + q._active - 1]) abort(q, e); // task errored synchronously
11171         else if (!q._data) throw e; // await callback errored synchronously
11172       }
11173     }
11174   }
11175
11176   function start$1(q) {
11177     while (q._start = q._waiting && q._active < q._size) {
11178       var i = q._ended + q._active,
11179           t = q._tasks[i],
11180           j = t.length - 1,
11181           c = t[j];
11182       t[j] = end(q, i);
11183       --q._waiting, ++q._active;
11184       t = c.apply(null, t);
11185       if (!q._tasks[i]) continue; // task finished synchronously
11186       q._tasks[i] = t || noabort;
11187     }
11188   }
11189
11190   function end(q, i) {
11191     return function(e, r) {
11192       if (!q._tasks[i]) return; // ignore multiple callbacks
11193       --q._active, ++q._ended;
11194       q._tasks[i] = null;
11195       if (q._error != null) return; // ignore secondary errors
11196       if (e != null) {
11197         abort(q, e);
11198       } else {
11199         q._data[i] = r;
11200         if (q._waiting) poke$1(q);
11201         else maybeNotify(q);
11202       }
11203     };
11204   }
11205
11206   function abort(q, e) {
11207     var i = q._tasks.length, t;
11208     q._error = e; // ignore active callbacks
11209     q._data = undefined; // allow gc
11210     q._waiting = NaN; // prevent starting
11211
11212     while (--i >= 0) {
11213       if (t = q._tasks[i]) {
11214         q._tasks[i] = null;
11215         if (t.abort) {
11216           try { t.abort(); }
11217           catch (e) { /* ignore */ }
11218         }
11219       }
11220     }
11221
11222     q._active = NaN; // allow notification
11223     maybeNotify(q);
11224   }
11225
11226   function maybeNotify(q) {
11227     if (!q._active && q._call) {
11228       var d = q._data;
11229       q._data = undefined; // allow gc
11230       q._call(q._error, d);
11231     }
11232   }
11233
11234   function queue(concurrency) {
11235     if (concurrency == null) concurrency = Infinity;
11236     else if (!((concurrency = +concurrency) >= 1)) throw new Error("invalid concurrency");
11237     return new Queue(concurrency);
11238   }
11239
11240   function defaultSource$1() {
11241     return Math.random();
11242   }
11243
11244   var uniform = (function sourceRandomUniform(source) {
11245     function randomUniform(min, max) {
11246       min = min == null ? 0 : +min;
11247       max = max == null ? 1 : +max;
11248       if (arguments.length === 1) max = min, min = 0;
11249       else max -= min;
11250       return function() {
11251         return source() * max + min;
11252       };
11253     }
11254
11255     randomUniform.source = sourceRandomUniform;
11256
11257     return randomUniform;
11258   })(defaultSource$1);
11259
11260   var normal = (function sourceRandomNormal(source) {
11261     function randomNormal(mu, sigma) {
11262       var x, r;
11263       mu = mu == null ? 0 : +mu;
11264       sigma = sigma == null ? 1 : +sigma;
11265       return function() {
11266         var y;
11267
11268         // If available, use the second previously-generated uniform random.
11269         if (x != null) y = x, x = null;
11270
11271         // Otherwise, generate a new x and y.
11272         else do {
11273           x = source() * 2 - 1;
11274           y = source() * 2 - 1;
11275           r = x * x + y * y;
11276         } while (!r || r > 1);
11277
11278         return mu + sigma * y * Math.sqrt(-2 * Math.log(r) / r);
11279       };
11280     }
11281
11282     randomNormal.source = sourceRandomNormal;
11283
11284     return randomNormal;
11285   })(defaultSource$1);
11286
11287   var logNormal = (function sourceRandomLogNormal(source) {
11288     function randomLogNormal() {
11289       var randomNormal = normal.source(source).apply(this, arguments);
11290       return function() {
11291         return Math.exp(randomNormal());
11292       };
11293     }
11294
11295     randomLogNormal.source = sourceRandomLogNormal;
11296
11297     return randomLogNormal;
11298   })(defaultSource$1);
11299
11300   var irwinHall = (function sourceRandomIrwinHall(source) {
11301     function randomIrwinHall(n) {
11302       return function() {
11303         for (var sum = 0, i = 0; i < n; ++i) sum += source();
11304         return sum;
11305       };
11306     }
11307
11308     randomIrwinHall.source = sourceRandomIrwinHall;
11309
11310     return randomIrwinHall;
11311   })(defaultSource$1);
11312
11313   var bates = (function sourceRandomBates(source) {
11314     function randomBates(n) {
11315       var randomIrwinHall = irwinHall.source(source)(n);
11316       return function() {
11317         return randomIrwinHall() / n;
11318       };
11319     }
11320
11321     randomBates.source = sourceRandomBates;
11322
11323     return randomBates;
11324   })(defaultSource$1);
11325
11326   var exponential$1 = (function sourceRandomExponential(source) {
11327     function randomExponential(lambda) {
11328       return function() {
11329         return -Math.log(1 - source()) / lambda;
11330       };
11331     }
11332
11333     randomExponential.source = sourceRandomExponential;
11334
11335     return randomExponential;
11336   })(defaultSource$1);
11337
11338   function request(url, callback) {
11339     var request,
11340         event = dispatch("beforesend", "progress", "load", "error"),
11341         mimeType,
11342         headers = map$1(),
11343         xhr = new XMLHttpRequest,
11344         user = null,
11345         password = null,
11346         response,
11347         responseType,
11348         timeout = 0;
11349
11350     // If IE does not support CORS, use XDomainRequest.
11351     if (typeof XDomainRequest !== "undefined"
11352         && !("withCredentials" in xhr)
11353         && /^(http(s)?:)?\/\//.test(url)) xhr = new XDomainRequest;
11354
11355     "onload" in xhr
11356         ? xhr.onload = xhr.onerror = xhr.ontimeout = respond
11357         : xhr.onreadystatechange = function(o) { xhr.readyState > 3 && respond(o); };
11358
11359     function respond(o) {
11360       var status = xhr.status, result;
11361       if (!status && hasResponse(xhr)
11362           || status >= 200 && status < 300
11363           || status === 304) {
11364         if (response) {
11365           try {
11366             result = response.call(request, xhr);
11367           } catch (e) {
11368             event.call("error", request, e);
11369             return;
11370           }
11371         } else {
11372           result = xhr;
11373         }
11374         event.call("load", request, result);
11375       } else {
11376         event.call("error", request, o);
11377       }
11378     }
11379
11380     xhr.onprogress = function(e) {
11381       event.call("progress", request, e);
11382     };
11383
11384     request = {
11385       header: function(name, value) {
11386         name = (name + "").toLowerCase();
11387         if (arguments.length < 2) return headers.get(name);
11388         if (value == null) headers.remove(name);
11389         else headers.set(name, value + "");
11390         return request;
11391       },
11392
11393       // If mimeType is non-null and no Accept header is set, a default is used.
11394       mimeType: function(value) {
11395         if (!arguments.length) return mimeType;
11396         mimeType = value == null ? null : value + "";
11397         return request;
11398       },
11399
11400       // Specifies what type the response value should take;
11401       // for instance, arraybuffer, blob, document, or text.
11402       responseType: function(value) {
11403         if (!arguments.length) return responseType;
11404         responseType = value;
11405         return request;
11406       },
11407
11408       timeout: function(value) {
11409         if (!arguments.length) return timeout;
11410         timeout = +value;
11411         return request;
11412       },
11413
11414       user: function(value) {
11415         return arguments.length < 1 ? user : (user = value == null ? null : value + "", request);
11416       },
11417
11418       password: function(value) {
11419         return arguments.length < 1 ? password : (password = value == null ? null : value + "", request);
11420       },
11421
11422       // Specify how to convert the response content to a specific type;
11423       // changes the callback value on "load" events.
11424       response: function(value) {
11425         response = value;
11426         return request;
11427       },
11428
11429       // Alias for send("GET", …).
11430       get: function(data, callback) {
11431         return request.send("GET", data, callback);
11432       },
11433
11434       // Alias for send("POST", …).
11435       post: function(data, callback) {
11436         return request.send("POST", data, callback);
11437       },
11438
11439       // If callback is non-null, it will be used for error and load events.
11440       send: function(method, data, callback) {
11441         xhr.open(method, url, true, user, password);
11442         if (mimeType != null && !headers.has("accept")) headers.set("accept", mimeType + ",*/*");
11443         if (xhr.setRequestHeader) headers.each(function(value, name) { xhr.setRequestHeader(name, value); });
11444         if (mimeType != null && xhr.overrideMimeType) xhr.overrideMimeType(mimeType);
11445         if (responseType != null) xhr.responseType = responseType;
11446         if (timeout > 0) xhr.timeout = timeout;
11447         if (callback == null && typeof data === "function") callback = data, data = null;
11448         if (callback != null && callback.length === 1) callback = fixCallback(callback);
11449         if (callback != null) request.on("error", callback).on("load", function(xhr) { callback(null, xhr); });
11450         event.call("beforesend", request, xhr);
11451         xhr.send(data == null ? null : data);
11452         return request;
11453       },
11454
11455       abort: function() {
11456         xhr.abort();
11457         return request;
11458       },
11459
11460       on: function() {
11461         var value = event.on.apply(event, arguments);
11462         return value === event ? request : value;
11463       }
11464     };
11465
11466     if (callback != null) {
11467       if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11468       return request.get(callback);
11469     }
11470
11471     return request;
11472   }
11473
11474   function fixCallback(callback) {
11475     return function(error, xhr) {
11476       callback(error == null ? xhr : null);
11477     };
11478   }
11479
11480   function hasResponse(xhr) {
11481     var type = xhr.responseType;
11482     return type && type !== "text"
11483         ? xhr.response // null on error
11484         : xhr.responseText; // "" on error
11485   }
11486
11487   function type$1(defaultMimeType, response) {
11488     return function(url, callback) {
11489       var r = request(url).mimeType(defaultMimeType).response(response);
11490       if (callback != null) {
11491         if (typeof callback !== "function") throw new Error("invalid callback: " + callback);
11492         return r.get(callback);
11493       }
11494       return r;
11495     };
11496   }
11497
11498   var html = type$1("text/html", function(xhr) {
11499     return document.createRange().createContextualFragment(xhr.responseText);
11500   });
11501
11502   var d3_json = type$1("application/json", function(xhr) {
11503     return JSON.parse(xhr.responseText);
11504   });
11505
11506   var d3_text = type$1("text/plain", function(xhr) {
11507     return xhr.responseText;
11508   });
11509
11510   var d3_xml = type$1("application/xml", function(xhr) {
11511     var xml = xhr.responseXML;
11512     if (!xml) throw new Error("parse error");
11513     return xml;
11514   });
11515
11516   function dsv$1(defaultMimeType, parse) {
11517     return function(url, row, callback) {
11518       if (arguments.length < 3) callback = row, row = null;
11519       var r = request(url).mimeType(defaultMimeType);
11520       r.row = function(_) { return arguments.length ? r.response(responseOf(parse, row = _)) : row; };
11521       r.row(row);
11522       return callback ? r.get(callback) : r;
11523     };
11524   }
11525
11526   function responseOf(parse, row) {
11527     return function(request$$1) {
11528       return parse(request$$1.responseText, row);
11529     };
11530   }
11531
11532   var csv$1 = dsv$1("text/csv", csvParse);
11533
11534   var tsv$1 = dsv$1("text/tab-separated-values", tsvParse);
11535
11536   var array$2 = Array.prototype;
11537
11538   var map$2 = array$2.map;
11539   var slice$5 = array$2.slice;
11540
11541   var implicit = {name: "implicit"};
11542
11543   function ordinal(range) {
11544     var index = map$1(),
11545         domain = [],
11546         unknown = implicit;
11547
11548     range = range == null ? [] : slice$5.call(range);
11549
11550     function scale(d) {
11551       var key = d + "", i = index.get(key);
11552       if (!i) {
11553         if (unknown !== implicit) return unknown;
11554         index.set(key, i = domain.push(d));
11555       }
11556       return range[(i - 1) % range.length];
11557     }
11558
11559     scale.domain = function(_) {
11560       if (!arguments.length) return domain.slice();
11561       domain = [], index = map$1();
11562       var i = -1, n = _.length, d, key;
11563       while (++i < n) if (!index.has(key = (d = _[i]) + "")) index.set(key, domain.push(d));
11564       return scale;
11565     };
11566
11567     scale.range = function(_) {
11568       return arguments.length ? (range = slice$5.call(_), scale) : range.slice();
11569     };
11570
11571     scale.unknown = function(_) {
11572       return arguments.length ? (unknown = _, scale) : unknown;
11573     };
11574
11575     scale.copy = function() {
11576       return ordinal()
11577           .domain(domain)
11578           .range(range)
11579           .unknown(unknown);
11580     };
11581
11582     return scale;
11583   }
11584
11585   function band() {
11586     var scale = ordinal().unknown(undefined),
11587         domain = scale.domain,
11588         ordinalRange = scale.range,
11589         range$$1 = [0, 1],
11590         step,
11591         bandwidth,
11592         round = false,
11593         paddingInner = 0,
11594         paddingOuter = 0,
11595         align = 0.5;
11596
11597     delete scale.unknown;
11598
11599     function rescale() {
11600       var n = domain().length,
11601           reverse = range$$1[1] < range$$1[0],
11602           start = range$$1[reverse - 0],
11603           stop = range$$1[1 - reverse];
11604       step = (stop - start) / Math.max(1, n - paddingInner + paddingOuter * 2);
11605       if (round) step = Math.floor(step);
11606       start += (stop - start - step * (n - paddingInner)) * align;
11607       bandwidth = step * (1 - paddingInner);
11608       if (round) start = Math.round(start), bandwidth = Math.round(bandwidth);
11609       var values = range(n).map(function(i) { return start + step * i; });
11610       return ordinalRange(reverse ? values.reverse() : values);
11611     }
11612
11613     scale.domain = function(_) {
11614       return arguments.length ? (domain(_), rescale()) : domain();
11615     };
11616
11617     scale.range = function(_) {
11618       return arguments.length ? (range$$1 = [+_[0], +_[1]], rescale()) : range$$1.slice();
11619     };
11620
11621     scale.rangeRound = function(_) {
11622       return range$$1 = [+_[0], +_[1]], round = true, rescale();
11623     };
11624
11625     scale.bandwidth = function() {
11626       return bandwidth;
11627     };
11628
11629     scale.step = function() {
11630       return step;
11631     };
11632
11633     scale.round = function(_) {
11634       return arguments.length ? (round = !!_, rescale()) : round;
11635     };
11636
11637     scale.padding = function(_) {
11638       return arguments.length ? (paddingInner = paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11639     };
11640
11641     scale.paddingInner = function(_) {
11642       return arguments.length ? (paddingInner = Math.max(0, Math.min(1, _)), rescale()) : paddingInner;
11643     };
11644
11645     scale.paddingOuter = function(_) {
11646       return arguments.length ? (paddingOuter = Math.max(0, Math.min(1, _)), rescale()) : paddingOuter;
11647     };
11648
11649     scale.align = function(_) {
11650       return arguments.length ? (align = Math.max(0, Math.min(1, _)), rescale()) : align;
11651     };
11652
11653     scale.copy = function() {
11654       return band()
11655           .domain(domain())
11656           .range(range$$1)
11657           .round(round)
11658           .paddingInner(paddingInner)
11659           .paddingOuter(paddingOuter)
11660           .align(align);
11661     };
11662
11663     return rescale();
11664   }
11665
11666   function pointish(scale) {
11667     var copy = scale.copy;
11668
11669     scale.padding = scale.paddingOuter;
11670     delete scale.paddingInner;
11671     delete scale.paddingOuter;
11672
11673     scale.copy = function() {
11674       return pointish(copy());
11675     };
11676
11677     return scale;
11678   }
11679
11680   function point$1() {
11681     return pointish(band().paddingInner(1));
11682   }
11683
11684   function constant$9(x) {
11685     return function() {
11686       return x;
11687     };
11688   }
11689
11690   function number$2(x) {
11691     return +x;
11692   }
11693
11694   var unit = [0, 1];
11695
11696   function deinterpolateLinear(a, b) {
11697     return (b -= (a = +a))
11698         ? function(x) { return (x - a) / b; }
11699         : constant$9(b);
11700   }
11701
11702   function deinterpolateClamp(deinterpolate) {
11703     return function(a, b) {
11704       var d = deinterpolate(a = +a, b = +b);
11705       return function(x) { return x <= a ? 0 : x >= b ? 1 : d(x); };
11706     };
11707   }
11708
11709   function reinterpolateClamp(reinterpolate) {
11710     return function(a, b) {
11711       var r = reinterpolate(a = +a, b = +b);
11712       return function(t) { return t <= 0 ? a : t >= 1 ? b : r(t); };
11713     };
11714   }
11715
11716   function bimap(domain, range$$1, deinterpolate, reinterpolate) {
11717     var d0 = domain[0], d1 = domain[1], r0 = range$$1[0], r1 = range$$1[1];
11718     if (d1 < d0) d0 = deinterpolate(d1, d0), r0 = reinterpolate(r1, r0);
11719     else d0 = deinterpolate(d0, d1), r0 = reinterpolate(r0, r1);
11720     return function(x) { return r0(d0(x)); };
11721   }
11722
11723   function polymap(domain, range$$1, deinterpolate, reinterpolate) {
11724     var j = Math.min(domain.length, range$$1.length) - 1,
11725         d = new Array(j),
11726         r = new Array(j),
11727         i = -1;
11728
11729     // Reverse descending domains.
11730     if (domain[j] < domain[0]) {
11731       domain = domain.slice().reverse();
11732       range$$1 = range$$1.slice().reverse();
11733     }
11734
11735     while (++i < j) {
11736       d[i] = deinterpolate(domain[i], domain[i + 1]);
11737       r[i] = reinterpolate(range$$1[i], range$$1[i + 1]);
11738     }
11739
11740     return function(x) {
11741       var i = bisectRight(domain, x, 1, j) - 1;
11742       return r[i](d[i](x));
11743     };
11744   }
11745
11746   function copy(source, target) {
11747     return target
11748         .domain(source.domain())
11749         .range(source.range())
11750         .interpolate(source.interpolate())
11751         .clamp(source.clamp());
11752   }
11753
11754   // deinterpolate(a, b)(x) takes a domain value x in [a,b] and returns the corresponding parameter t in [0,1].
11755   // reinterpolate(a, b)(t) takes a parameter t in [0,1] and returns the corresponding domain value x in [a,b].
11756   function continuous(deinterpolate, reinterpolate) {
11757     var domain = unit,
11758         range$$1 = unit,
11759         interpolate$$1 = interpolate,
11760         clamp = false,
11761         piecewise,
11762         output,
11763         input;
11764
11765     function rescale() {
11766       piecewise = Math.min(domain.length, range$$1.length) > 2 ? polymap : bimap;
11767       output = input = null;
11768       return scale;
11769     }
11770
11771     function scale(x) {
11772       return (output || (output = piecewise(domain, range$$1, clamp ? deinterpolateClamp(deinterpolate) : deinterpolate, interpolate$$1)))(+x);
11773     }
11774
11775     scale.invert = function(y) {
11776       return (input || (input = piecewise(range$$1, domain, deinterpolateLinear, clamp ? reinterpolateClamp(reinterpolate) : reinterpolate)))(+y);
11777     };
11778
11779     scale.domain = function(_) {
11780       return arguments.length ? (domain = map$2.call(_, number$2), rescale()) : domain.slice();
11781     };
11782
11783     scale.range = function(_) {
11784       return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
11785     };
11786
11787     scale.rangeRound = function(_) {
11788       return range$$1 = slice$5.call(_), interpolate$$1 = interpolateRound, rescale();
11789     };
11790
11791     scale.clamp = function(_) {
11792       return arguments.length ? (clamp = !!_, rescale()) : clamp;
11793     };
11794
11795     scale.interpolate = function(_) {
11796       return arguments.length ? (interpolate$$1 = _, rescale()) : interpolate$$1;
11797     };
11798
11799     return rescale();
11800   }
11801
11802   function tickFormat(domain, count, specifier) {
11803     var start = domain[0],
11804         stop = domain[domain.length - 1],
11805         step = tickStep(start, stop, count == null ? 10 : count),
11806         precision;
11807     specifier = formatSpecifier(specifier == null ? ",f" : specifier);
11808     switch (specifier.type) {
11809       case "s": {
11810         var value = Math.max(Math.abs(start), Math.abs(stop));
11811         if (specifier.precision == null && !isNaN(precision = precisionPrefix(step, value))) specifier.precision = precision;
11812         return formatPrefix(specifier, value);
11813       }
11814       case "":
11815       case "e":
11816       case "g":
11817       case "p":
11818       case "r": {
11819         if (specifier.precision == null && !isNaN(precision = precisionRound(step, Math.max(Math.abs(start), Math.abs(stop))))) specifier.precision = precision - (specifier.type === "e");
11820         break;
11821       }
11822       case "f":
11823       case "%": {
11824         if (specifier.precision == null && !isNaN(precision = precisionFixed(step))) specifier.precision = precision - (specifier.type === "%") * 2;
11825         break;
11826       }
11827     }
11828     return format(specifier);
11829   }
11830
11831   function linearish(scale) {
11832     var domain = scale.domain;
11833
11834     scale.ticks = function(count) {
11835       var d = domain();
11836       return ticks(d[0], d[d.length - 1], count == null ? 10 : count);
11837     };
11838
11839     scale.tickFormat = function(count, specifier) {
11840       return tickFormat(domain(), count, specifier);
11841     };
11842
11843     scale.nice = function(count) {
11844       if (count == null) count = 10;
11845
11846       var d = domain(),
11847           i0 = 0,
11848           i1 = d.length - 1,
11849           start = d[i0],
11850           stop = d[i1],
11851           step;
11852
11853       if (stop < start) {
11854         step = start, start = stop, stop = step;
11855         step = i0, i0 = i1, i1 = step;
11856       }
11857
11858       step = tickIncrement(start, stop, count);
11859
11860       if (step > 0) {
11861         start = Math.floor(start / step) * step;
11862         stop = Math.ceil(stop / step) * step;
11863         step = tickIncrement(start, stop, count);
11864       } else if (step < 0) {
11865         start = Math.ceil(start * step) / step;
11866         stop = Math.floor(stop * step) / step;
11867         step = tickIncrement(start, stop, count);
11868       }
11869
11870       if (step > 0) {
11871         d[i0] = Math.floor(start / step) * step;
11872         d[i1] = Math.ceil(stop / step) * step;
11873         domain(d);
11874       } else if (step < 0) {
11875         d[i0] = Math.ceil(start * step) / step;
11876         d[i1] = Math.floor(stop * step) / step;
11877         domain(d);
11878       }
11879
11880       return scale;
11881     };
11882
11883     return scale;
11884   }
11885
11886   function linear$2() {
11887     var scale = continuous(deinterpolateLinear, interpolateNumber);
11888
11889     scale.copy = function() {
11890       return copy(scale, linear$2());
11891     };
11892
11893     return linearish(scale);
11894   }
11895
11896   function identity$5() {
11897     var domain = [0, 1];
11898
11899     function scale(x) {
11900       return +x;
11901     }
11902
11903     scale.invert = scale;
11904
11905     scale.domain = scale.range = function(_) {
11906       return arguments.length ? (domain = map$2.call(_, number$2), scale) : domain.slice();
11907     };
11908
11909     scale.copy = function() {
11910       return identity$5().domain(domain);
11911     };
11912
11913     return linearish(scale);
11914   }
11915
11916   function nice(domain, interval) {
11917     domain = domain.slice();
11918
11919     var i0 = 0,
11920         i1 = domain.length - 1,
11921         x0 = domain[i0],
11922         x1 = domain[i1],
11923         t;
11924
11925     if (x1 < x0) {
11926       t = i0, i0 = i1, i1 = t;
11927       t = x0, x0 = x1, x1 = t;
11928     }
11929
11930     domain[i0] = interval.floor(x0);
11931     domain[i1] = interval.ceil(x1);
11932     return domain;
11933   }
11934
11935   function deinterpolate(a, b) {
11936     return (b = Math.log(b / a))
11937         ? function(x) { return Math.log(x / a) / b; }
11938         : constant$9(b);
11939   }
11940
11941   function reinterpolate(a, b) {
11942     return a < 0
11943         ? function(t) { return -Math.pow(-b, t) * Math.pow(-a, 1 - t); }
11944         : function(t) { return Math.pow(b, t) * Math.pow(a, 1 - t); };
11945   }
11946
11947   function pow10(x) {
11948     return isFinite(x) ? +("1e" + x) : x < 0 ? 0 : x;
11949   }
11950
11951   function powp(base) {
11952     return base === 10 ? pow10
11953         : base === Math.E ? Math.exp
11954         : function(x) { return Math.pow(base, x); };
11955   }
11956
11957   function logp(base) {
11958     return base === Math.E ? Math.log
11959         : base === 10 && Math.log10
11960         || base === 2 && Math.log2
11961         || (base = Math.log(base), function(x) { return Math.log(x) / base; });
11962   }
11963
11964   function reflect(f) {
11965     return function(x) {
11966       return -f(-x);
11967     };
11968   }
11969
11970   function log$1() {
11971     var scale = continuous(deinterpolate, reinterpolate).domain([1, 10]),
11972         domain = scale.domain,
11973         base = 10,
11974         logs = logp(10),
11975         pows = powp(10);
11976
11977     function rescale() {
11978       logs = logp(base), pows = powp(base);
11979       if (domain()[0] < 0) logs = reflect(logs), pows = reflect(pows);
11980       return scale;
11981     }
11982
11983     scale.base = function(_) {
11984       return arguments.length ? (base = +_, rescale()) : base;
11985     };
11986
11987     scale.domain = function(_) {
11988       return arguments.length ? (domain(_), rescale()) : domain();
11989     };
11990
11991     scale.ticks = function(count) {
11992       var d = domain(),
11993           u = d[0],
11994           v = d[d.length - 1],
11995           r;
11996
11997       if (r = v < u) i = u, u = v, v = i;
11998
11999       var i = logs(u),
12000           j = logs(v),
12001           p,
12002           k,
12003           t,
12004           n = count == null ? 10 : +count,
12005           z = [];
12006
12007       if (!(base % 1) && j - i < n) {
12008         i = Math.round(i) - 1, j = Math.round(j) + 1;
12009         if (u > 0) for (; i < j; ++i) {
12010           for (k = 1, p = pows(i); k < base; ++k) {
12011             t = p * k;
12012             if (t < u) continue;
12013             if (t > v) break;
12014             z.push(t);
12015           }
12016         } else for (; i < j; ++i) {
12017           for (k = base - 1, p = pows(i); k >= 1; --k) {
12018             t = p * k;
12019             if (t < u) continue;
12020             if (t > v) break;
12021             z.push(t);
12022           }
12023         }
12024       } else {
12025         z = ticks(i, j, Math.min(j - i, n)).map(pows);
12026       }
12027
12028       return r ? z.reverse() : z;
12029     };
12030
12031     scale.tickFormat = function(count, specifier) {
12032       if (specifier == null) specifier = base === 10 ? ".0e" : ",";
12033       if (typeof specifier !== "function") specifier = format(specifier);
12034       if (count === Infinity) return specifier;
12035       if (count == null) count = 10;
12036       var k = Math.max(1, base * count / scale.ticks().length); // TODO fast estimate?
12037       return function(d) {
12038         var i = d / pows(Math.round(logs(d)));
12039         if (i * base < base - 0.5) i *= base;
12040         return i <= k ? specifier(d) : "";
12041       };
12042     };
12043
12044     scale.nice = function() {
12045       return domain(nice(domain(), {
12046         floor: function(x) { return pows(Math.floor(logs(x))); },
12047         ceil: function(x) { return pows(Math.ceil(logs(x))); }
12048       }));
12049     };
12050
12051     scale.copy = function() {
12052       return copy(scale, log$1().base(base));
12053     };
12054
12055     return scale;
12056   }
12057
12058   function raise$1(x, exponent) {
12059     return x < 0 ? -Math.pow(-x, exponent) : Math.pow(x, exponent);
12060   }
12061
12062   function pow$1() {
12063     var exponent = 1,
12064         scale = continuous(deinterpolate, reinterpolate),
12065         domain = scale.domain;
12066
12067     function deinterpolate(a, b) {
12068       return (b = raise$1(b, exponent) - (a = raise$1(a, exponent)))
12069           ? function(x) { return (raise$1(x, exponent) - a) / b; }
12070           : constant$9(b);
12071     }
12072
12073     function reinterpolate(a, b) {
12074       b = raise$1(b, exponent) - (a = raise$1(a, exponent));
12075       return function(t) { return raise$1(a + b * t, 1 / exponent); };
12076     }
12077
12078     scale.exponent = function(_) {
12079       return arguments.length ? (exponent = +_, domain(domain())) : exponent;
12080     };
12081
12082     scale.copy = function() {
12083       return copy(scale, pow$1().exponent(exponent));
12084     };
12085
12086     return linearish(scale);
12087   }
12088
12089   function sqrt$1() {
12090     return pow$1().exponent(0.5);
12091   }
12092
12093   function quantile$1() {
12094     var domain = [],
12095         range$$1 = [],
12096         thresholds = [];
12097
12098     function rescale() {
12099       var i = 0, n = Math.max(1, range$$1.length);
12100       thresholds = new Array(n - 1);
12101       while (++i < n) thresholds[i - 1] = quantile(domain, i / n);
12102       return scale;
12103     }
12104
12105     function scale(x) {
12106       if (!isNaN(x = +x)) return range$$1[bisectRight(thresholds, x)];
12107     }
12108
12109     scale.invertExtent = function(y) {
12110       var i = range$$1.indexOf(y);
12111       return i < 0 ? [NaN, NaN] : [
12112         i > 0 ? thresholds[i - 1] : domain[0],
12113         i < thresholds.length ? thresholds[i] : domain[domain.length - 1]
12114       ];
12115     };
12116
12117     scale.domain = function(_) {
12118       if (!arguments.length) return domain.slice();
12119       domain = [];
12120       for (var i = 0, n = _.length, d; i < n; ++i) if (d = _[i], d != null && !isNaN(d = +d)) domain.push(d);
12121       domain.sort(ascending);
12122       return rescale();
12123     };
12124
12125     scale.range = function(_) {
12126       return arguments.length ? (range$$1 = slice$5.call(_), rescale()) : range$$1.slice();
12127     };
12128
12129     scale.quantiles = function() {
12130       return thresholds.slice();
12131     };
12132
12133     scale.copy = function() {
12134       return quantile$1()
12135           .domain(domain)
12136           .range(range$$1);
12137     };
12138
12139     return scale;
12140   }
12141
12142   function quantize() {
12143     var x0 = 0,
12144         x1 = 1,
12145         n = 1,
12146         domain = [0.5],
12147         range$$1 = [0, 1];
12148
12149     function scale(x) {
12150       if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12151     }
12152
12153     function rescale() {
12154       var i = -1;
12155       domain = new Array(n);
12156       while (++i < n) domain[i] = ((i + 1) * x1 - (i - n) * x0) / (n + 1);
12157       return scale;
12158     }
12159
12160     scale.domain = function(_) {
12161       return arguments.length ? (x0 = +_[0], x1 = +_[1], rescale()) : [x0, x1];
12162     };
12163
12164     scale.range = function(_) {
12165       return arguments.length ? (n = (range$$1 = slice$5.call(_)).length - 1, rescale()) : range$$1.slice();
12166     };
12167
12168     scale.invertExtent = function(y) {
12169       var i = range$$1.indexOf(y);
12170       return i < 0 ? [NaN, NaN]
12171           : i < 1 ? [x0, domain[0]]
12172           : i >= n ? [domain[n - 1], x1]
12173           : [domain[i - 1], domain[i]];
12174     };
12175
12176     scale.copy = function() {
12177       return quantize()
12178           .domain([x0, x1])
12179           .range(range$$1);
12180     };
12181
12182     return linearish(scale);
12183   }
12184
12185   function threshold() {
12186     var domain = [0.5],
12187         range$$1 = [0, 1],
12188         n = 1;
12189
12190     function scale(x) {
12191       if (x <= x) return range$$1[bisectRight(domain, x, 0, n)];
12192     }
12193
12194     scale.domain = function(_) {
12195       return arguments.length ? (domain = slice$5.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : domain.slice();
12196     };
12197
12198     scale.range = function(_) {
12199       return arguments.length ? (range$$1 = slice$5.call(_), n = Math.min(domain.length, range$$1.length - 1), scale) : range$$1.slice();
12200     };
12201
12202     scale.invertExtent = function(y) {
12203       var i = range$$1.indexOf(y);
12204       return [domain[i - 1], domain[i]];
12205     };
12206
12207     scale.copy = function() {
12208       return threshold()
12209           .domain(domain)
12210           .range(range$$1);
12211     };
12212
12213     return scale;
12214   }
12215
12216   var t0$1 = new Date,
12217       t1$1 = new Date;
12218
12219   function newInterval(floori, offseti, count, field) {
12220
12221     function interval(date) {
12222       return floori(date = new Date(+date)), date;
12223     }
12224
12225     interval.floor = interval;
12226
12227     interval.ceil = function(date) {
12228       return floori(date = new Date(date - 1)), offseti(date, 1), floori(date), date;
12229     };
12230
12231     interval.round = function(date) {
12232       var d0 = interval(date),
12233           d1 = interval.ceil(date);
12234       return date - d0 < d1 - date ? d0 : d1;
12235     };
12236
12237     interval.offset = function(date, step) {
12238       return offseti(date = new Date(+date), step == null ? 1 : Math.floor(step)), date;
12239     };
12240
12241     interval.range = function(start, stop, step) {
12242       var range = [], previous;
12243       start = interval.ceil(start);
12244       step = step == null ? 1 : Math.floor(step);
12245       if (!(start < stop) || !(step > 0)) return range; // also handles Invalid Date
12246       do range.push(previous = new Date(+start)), offseti(start, step), floori(start);
12247       while (previous < start && start < stop);
12248       return range;
12249     };
12250
12251     interval.filter = function(test) {
12252       return newInterval(function(date) {
12253         if (date >= date) while (floori(date), !test(date)) date.setTime(date - 1);
12254       }, function(date, step) {
12255         if (date >= date) {
12256           if (step < 0) while (++step <= 0) {
12257             while (offseti(date, -1), !test(date)) {} // eslint-disable-line no-empty
12258           } else while (--step >= 0) {
12259             while (offseti(date, +1), !test(date)) {} // eslint-disable-line no-empty
12260           }
12261         }
12262       });
12263     };
12264
12265     if (count) {
12266       interval.count = function(start, end) {
12267         t0$1.setTime(+start), t1$1.setTime(+end);
12268         floori(t0$1), floori(t1$1);
12269         return Math.floor(count(t0$1, t1$1));
12270       };
12271
12272       interval.every = function(step) {
12273         step = Math.floor(step);
12274         return !isFinite(step) || !(step > 0) ? null
12275             : !(step > 1) ? interval
12276             : interval.filter(field
12277                 ? function(d) { return field(d) % step === 0; }
12278                 : function(d) { return interval.count(0, d) % step === 0; });
12279       };
12280     }
12281
12282     return interval;
12283   }
12284
12285   var millisecond = newInterval(function() {
12286     // noop
12287   }, function(date, step) {
12288     date.setTime(+date + step);
12289   }, function(start, end) {
12290     return end - start;
12291   });
12292
12293   // An optimized implementation for this simple case.
12294   millisecond.every = function(k) {
12295     k = Math.floor(k);
12296     if (!isFinite(k) || !(k > 0)) return null;
12297     if (!(k > 1)) return millisecond;
12298     return newInterval(function(date) {
12299       date.setTime(Math.floor(date / k) * k);
12300     }, function(date, step) {
12301       date.setTime(+date + step * k);
12302     }, function(start, end) {
12303       return (end - start) / k;
12304     });
12305   };
12306   var milliseconds = millisecond.range;
12307
12308   var durationSecond = 1e3;
12309   var durationMinute = 6e4;
12310   var durationHour = 36e5;
12311   var durationDay = 864e5;
12312   var durationWeek = 6048e5;
12313
12314   var second = newInterval(function(date) {
12315     date.setTime(Math.floor(date / durationSecond) * durationSecond);
12316   }, function(date, step) {
12317     date.setTime(+date + step * durationSecond);
12318   }, function(start, end) {
12319     return (end - start) / durationSecond;
12320   }, function(date) {
12321     return date.getUTCSeconds();
12322   });
12323   var seconds = second.range;
12324
12325   var minute = newInterval(function(date) {
12326     date.setTime(Math.floor(date / durationMinute) * durationMinute);
12327   }, function(date, step) {
12328     date.setTime(+date + step * durationMinute);
12329   }, function(start, end) {
12330     return (end - start) / durationMinute;
12331   }, function(date) {
12332     return date.getMinutes();
12333   });
12334   var minutes = minute.range;
12335
12336   var hour = newInterval(function(date) {
12337     var offset = date.getTimezoneOffset() * durationMinute % durationHour;
12338     if (offset < 0) offset += durationHour;
12339     date.setTime(Math.floor((+date - offset) / durationHour) * durationHour + offset);
12340   }, function(date, step) {
12341     date.setTime(+date + step * durationHour);
12342   }, function(start, end) {
12343     return (end - start) / durationHour;
12344   }, function(date) {
12345     return date.getHours();
12346   });
12347   var hours = hour.range;
12348
12349   var day = newInterval(function(date) {
12350     date.setHours(0, 0, 0, 0);
12351   }, function(date, step) {
12352     date.setDate(date.getDate() + step);
12353   }, function(start, end) {
12354     return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationDay;
12355   }, function(date) {
12356     return date.getDate() - 1;
12357   });
12358   var days = day.range;
12359
12360   function weekday(i) {
12361     return newInterval(function(date) {
12362       date.setDate(date.getDate() - (date.getDay() + 7 - i) % 7);
12363       date.setHours(0, 0, 0, 0);
12364     }, function(date, step) {
12365       date.setDate(date.getDate() + step * 7);
12366     }, function(start, end) {
12367       return (end - start - (end.getTimezoneOffset() - start.getTimezoneOffset()) * durationMinute) / durationWeek;
12368     });
12369   }
12370
12371   var sunday = weekday(0);
12372   var monday = weekday(1);
12373   var tuesday = weekday(2);
12374   var wednesday = weekday(3);
12375   var thursday = weekday(4);
12376   var friday = weekday(5);
12377   var saturday = weekday(6);
12378
12379   var sundays = sunday.range;
12380   var mondays = monday.range;
12381   var tuesdays = tuesday.range;
12382   var wednesdays = wednesday.range;
12383   var thursdays = thursday.range;
12384   var fridays = friday.range;
12385   var saturdays = saturday.range;
12386
12387   var month = newInterval(function(date) {
12388     date.setDate(1);
12389     date.setHours(0, 0, 0, 0);
12390   }, function(date, step) {
12391     date.setMonth(date.getMonth() + step);
12392   }, function(start, end) {
12393     return end.getMonth() - start.getMonth() + (end.getFullYear() - start.getFullYear()) * 12;
12394   }, function(date) {
12395     return date.getMonth();
12396   });
12397   var months = month.range;
12398
12399   var year = newInterval(function(date) {
12400     date.setMonth(0, 1);
12401     date.setHours(0, 0, 0, 0);
12402   }, function(date, step) {
12403     date.setFullYear(date.getFullYear() + step);
12404   }, function(start, end) {
12405     return end.getFullYear() - start.getFullYear();
12406   }, function(date) {
12407     return date.getFullYear();
12408   });
12409
12410   // An optimized implementation for this simple case.
12411   year.every = function(k) {
12412     return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12413       date.setFullYear(Math.floor(date.getFullYear() / k) * k);
12414       date.setMonth(0, 1);
12415       date.setHours(0, 0, 0, 0);
12416     }, function(date, step) {
12417       date.setFullYear(date.getFullYear() + step * k);
12418     });
12419   };
12420   var years = year.range;
12421
12422   var utcMinute = newInterval(function(date) {
12423     date.setUTCSeconds(0, 0);
12424   }, function(date, step) {
12425     date.setTime(+date + step * durationMinute);
12426   }, function(start, end) {
12427     return (end - start) / durationMinute;
12428   }, function(date) {
12429     return date.getUTCMinutes();
12430   });
12431   var utcMinutes = utcMinute.range;
12432
12433   var utcHour = newInterval(function(date) {
12434     date.setUTCMinutes(0, 0, 0);
12435   }, function(date, step) {
12436     date.setTime(+date + step * durationHour);
12437   }, function(start, end) {
12438     return (end - start) / durationHour;
12439   }, function(date) {
12440     return date.getUTCHours();
12441   });
12442   var utcHours = utcHour.range;
12443
12444   var utcDay = newInterval(function(date) {
12445     date.setUTCHours(0, 0, 0, 0);
12446   }, function(date, step) {
12447     date.setUTCDate(date.getUTCDate() + step);
12448   }, function(start, end) {
12449     return (end - start) / durationDay;
12450   }, function(date) {
12451     return date.getUTCDate() - 1;
12452   });
12453   var utcDays = utcDay.range;
12454
12455   function utcWeekday(i) {
12456     return newInterval(function(date) {
12457       date.setUTCDate(date.getUTCDate() - (date.getUTCDay() + 7 - i) % 7);
12458       date.setUTCHours(0, 0, 0, 0);
12459     }, function(date, step) {
12460       date.setUTCDate(date.getUTCDate() + step * 7);
12461     }, function(start, end) {
12462       return (end - start) / durationWeek;
12463     });
12464   }
12465
12466   var utcSunday = utcWeekday(0);
12467   var utcMonday = utcWeekday(1);
12468   var utcTuesday = utcWeekday(2);
12469   var utcWednesday = utcWeekday(3);
12470   var utcThursday = utcWeekday(4);
12471   var utcFriday = utcWeekday(5);
12472   var utcSaturday = utcWeekday(6);
12473
12474   var utcSundays = utcSunday.range;
12475   var utcMondays = utcMonday.range;
12476   var utcTuesdays = utcTuesday.range;
12477   var utcWednesdays = utcWednesday.range;
12478   var utcThursdays = utcThursday.range;
12479   var utcFridays = utcFriday.range;
12480   var utcSaturdays = utcSaturday.range;
12481
12482   var utcMonth = newInterval(function(date) {
12483     date.setUTCDate(1);
12484     date.setUTCHours(0, 0, 0, 0);
12485   }, function(date, step) {
12486     date.setUTCMonth(date.getUTCMonth() + step);
12487   }, function(start, end) {
12488     return end.getUTCMonth() - start.getUTCMonth() + (end.getUTCFullYear() - start.getUTCFullYear()) * 12;
12489   }, function(date) {
12490     return date.getUTCMonth();
12491   });
12492   var utcMonths = utcMonth.range;
12493
12494   var utcYear = newInterval(function(date) {
12495     date.setUTCMonth(0, 1);
12496     date.setUTCHours(0, 0, 0, 0);
12497   }, function(date, step) {
12498     date.setUTCFullYear(date.getUTCFullYear() + step);
12499   }, function(start, end) {
12500     return end.getUTCFullYear() - start.getUTCFullYear();
12501   }, function(date) {
12502     return date.getUTCFullYear();
12503   });
12504
12505   // An optimized implementation for this simple case.
12506   utcYear.every = function(k) {
12507     return !isFinite(k = Math.floor(k)) || !(k > 0) ? null : newInterval(function(date) {
12508       date.setUTCFullYear(Math.floor(date.getUTCFullYear() / k) * k);
12509       date.setUTCMonth(0, 1);
12510       date.setUTCHours(0, 0, 0, 0);
12511     }, function(date, step) {
12512       date.setUTCFullYear(date.getUTCFullYear() + step * k);
12513     });
12514   };
12515   var utcYears = utcYear.range;
12516
12517   function localDate(d) {
12518     if (0 <= d.y && d.y < 100) {
12519       var date = new Date(-1, d.m, d.d, d.H, d.M, d.S, d.L);
12520       date.setFullYear(d.y);
12521       return date;
12522     }
12523     return new Date(d.y, d.m, d.d, d.H, d.M, d.S, d.L);
12524   }
12525
12526   function utcDate(d) {
12527     if (0 <= d.y && d.y < 100) {
12528       var date = new Date(Date.UTC(-1, d.m, d.d, d.H, d.M, d.S, d.L));
12529       date.setUTCFullYear(d.y);
12530       return date;
12531     }
12532     return new Date(Date.UTC(d.y, d.m, d.d, d.H, d.M, d.S, d.L));
12533   }
12534
12535   function newYear(y) {
12536     return {y: y, m: 0, d: 1, H: 0, M: 0, S: 0, L: 0};
12537   }
12538
12539   function formatLocale$1(locale) {
12540     var locale_dateTime = locale.dateTime,
12541         locale_date = locale.date,
12542         locale_time = locale.time,
12543         locale_periods = locale.periods,
12544         locale_weekdays = locale.days,
12545         locale_shortWeekdays = locale.shortDays,
12546         locale_months = locale.months,
12547         locale_shortMonths = locale.shortMonths;
12548
12549     var periodRe = formatRe(locale_periods),
12550         periodLookup = formatLookup(locale_periods),
12551         weekdayRe = formatRe(locale_weekdays),
12552         weekdayLookup = formatLookup(locale_weekdays),
12553         shortWeekdayRe = formatRe(locale_shortWeekdays),
12554         shortWeekdayLookup = formatLookup(locale_shortWeekdays),
12555         monthRe = formatRe(locale_months),
12556         monthLookup = formatLookup(locale_months),
12557         shortMonthRe = formatRe(locale_shortMonths),
12558         shortMonthLookup = formatLookup(locale_shortMonths);
12559
12560     var formats = {
12561       "a": formatShortWeekday,
12562       "A": formatWeekday,
12563       "b": formatShortMonth,
12564       "B": formatMonth,
12565       "c": null,
12566       "d": formatDayOfMonth,
12567       "e": formatDayOfMonth,
12568       "f": formatMicroseconds,
12569       "H": formatHour24,
12570       "I": formatHour12,
12571       "j": formatDayOfYear,
12572       "L": formatMilliseconds,
12573       "m": formatMonthNumber,
12574       "M": formatMinutes,
12575       "p": formatPeriod,
12576       "Q": formatUnixTimestamp,
12577       "s": formatUnixTimestampSeconds,
12578       "S": formatSeconds,
12579       "u": formatWeekdayNumberMonday,
12580       "U": formatWeekNumberSunday,
12581       "V": formatWeekNumberISO,
12582       "w": formatWeekdayNumberSunday,
12583       "W": formatWeekNumberMonday,
12584       "x": null,
12585       "X": null,
12586       "y": formatYear,
12587       "Y": formatFullYear,
12588       "Z": formatZone,
12589       "%": formatLiteralPercent
12590     };
12591
12592     var utcFormats = {
12593       "a": formatUTCShortWeekday,
12594       "A": formatUTCWeekday,
12595       "b": formatUTCShortMonth,
12596       "B": formatUTCMonth,
12597       "c": null,
12598       "d": formatUTCDayOfMonth,
12599       "e": formatUTCDayOfMonth,
12600       "f": formatUTCMicroseconds,
12601       "H": formatUTCHour24,
12602       "I": formatUTCHour12,
12603       "j": formatUTCDayOfYear,
12604       "L": formatUTCMilliseconds,
12605       "m": formatUTCMonthNumber,
12606       "M": formatUTCMinutes,
12607       "p": formatUTCPeriod,
12608       "Q": formatUnixTimestamp,
12609       "s": formatUnixTimestampSeconds,
12610       "S": formatUTCSeconds,
12611       "u": formatUTCWeekdayNumberMonday,
12612       "U": formatUTCWeekNumberSunday,
12613       "V": formatUTCWeekNumberISO,
12614       "w": formatUTCWeekdayNumberSunday,
12615       "W": formatUTCWeekNumberMonday,
12616       "x": null,
12617       "X": null,
12618       "y": formatUTCYear,
12619       "Y": formatUTCFullYear,
12620       "Z": formatUTCZone,
12621       "%": formatLiteralPercent
12622     };
12623
12624     var parses = {
12625       "a": parseShortWeekday,
12626       "A": parseWeekday,
12627       "b": parseShortMonth,
12628       "B": parseMonth,
12629       "c": parseLocaleDateTime,
12630       "d": parseDayOfMonth,
12631       "e": parseDayOfMonth,
12632       "f": parseMicroseconds,
12633       "H": parseHour24,
12634       "I": parseHour24,
12635       "j": parseDayOfYear,
12636       "L": parseMilliseconds,
12637       "m": parseMonthNumber,
12638       "M": parseMinutes,
12639       "p": parsePeriod,
12640       "Q": parseUnixTimestamp,
12641       "s": parseUnixTimestampSeconds,
12642       "S": parseSeconds,
12643       "u": parseWeekdayNumberMonday,
12644       "U": parseWeekNumberSunday,
12645       "V": parseWeekNumberISO,
12646       "w": parseWeekdayNumberSunday,
12647       "W": parseWeekNumberMonday,
12648       "x": parseLocaleDate,
12649       "X": parseLocaleTime,
12650       "y": parseYear,
12651       "Y": parseFullYear,
12652       "Z": parseZone,
12653       "%": parseLiteralPercent
12654     };
12655
12656     // These recursive directive definitions must be deferred.
12657     formats.x = newFormat(locale_date, formats);
12658     formats.X = newFormat(locale_time, formats);
12659     formats.c = newFormat(locale_dateTime, formats);
12660     utcFormats.x = newFormat(locale_date, utcFormats);
12661     utcFormats.X = newFormat(locale_time, utcFormats);
12662     utcFormats.c = newFormat(locale_dateTime, utcFormats);
12663
12664     function newFormat(specifier, formats) {
12665       return function(date) {
12666         var string = [],
12667             i = -1,
12668             j = 0,
12669             n = specifier.length,
12670             c,
12671             pad,
12672             format;
12673
12674         if (!(date instanceof Date)) date = new Date(+date);
12675
12676         while (++i < n) {
12677           if (specifier.charCodeAt(i) === 37) {
12678             string.push(specifier.slice(j, i));
12679             if ((pad = pads[c = specifier.charAt(++i)]) != null) c = specifier.charAt(++i);
12680             else pad = c === "e" ? " " : "0";
12681             if (format = formats[c]) c = format(date, pad);
12682             string.push(c);
12683             j = i + 1;
12684           }
12685         }
12686
12687         string.push(specifier.slice(j, i));
12688         return string.join("");
12689       };
12690     }
12691
12692     function newParse(specifier, newDate) {
12693       return function(string) {
12694         var d = newYear(1900),
12695             i = parseSpecifier(d, specifier, string += "", 0),
12696             week, day$$1;
12697         if (i != string.length) return null;
12698
12699         // If a UNIX timestamp is specified, return it.
12700         if ("Q" in d) return new Date(d.Q);
12701
12702         // The am-pm flag is 0 for AM, and 1 for PM.
12703         if ("p" in d) d.H = d.H % 12 + d.p * 12;
12704
12705         // Convert day-of-week and week-of-year to day-of-year.
12706         if ("V" in d) {
12707           if (d.V < 1 || d.V > 53) return null;
12708           if (!("w" in d)) d.w = 1;
12709           if ("Z" in d) {
12710             week = utcDate(newYear(d.y)), day$$1 = week.getUTCDay();
12711             week = day$$1 > 4 || day$$1 === 0 ? utcMonday.ceil(week) : utcMonday(week);
12712             week = utcDay.offset(week, (d.V - 1) * 7);
12713             d.y = week.getUTCFullYear();
12714             d.m = week.getUTCMonth();
12715             d.d = week.getUTCDate() + (d.w + 6) % 7;
12716           } else {
12717             week = newDate(newYear(d.y)), day$$1 = week.getDay();
12718             week = day$$1 > 4 || day$$1 === 0 ? monday.ceil(week) : monday(week);
12719             week = day.offset(week, (d.V - 1) * 7);
12720             d.y = week.getFullYear();
12721             d.m = week.getMonth();
12722             d.d = week.getDate() + (d.w + 6) % 7;
12723           }
12724         } else if ("W" in d || "U" in d) {
12725           if (!("w" in d)) d.w = "u" in d ? d.u % 7 : "W" in d ? 1 : 0;
12726           day$$1 = "Z" in d ? utcDate(newYear(d.y)).getUTCDay() : newDate(newYear(d.y)).getDay();
12727           d.m = 0;
12728           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;
12729         }
12730
12731         // If a time zone is specified, all fields are interpreted as UTC and then
12732         // offset according to the specified time zone.
12733         if ("Z" in d) {
12734           d.H += d.Z / 100 | 0;
12735           d.M += d.Z % 100;
12736           return utcDate(d);
12737         }
12738
12739         // Otherwise, all fields are in local time.
12740         return newDate(d);
12741       };
12742     }
12743
12744     function parseSpecifier(d, specifier, string, j) {
12745       var i = 0,
12746           n = specifier.length,
12747           m = string.length,
12748           c,
12749           parse;
12750
12751       while (i < n) {
12752         if (j >= m) return -1;
12753         c = specifier.charCodeAt(i++);
12754         if (c === 37) {
12755           c = specifier.charAt(i++);
12756           parse = parses[c in pads ? specifier.charAt(i++) : c];
12757           if (!parse || ((j = parse(d, string, j)) < 0)) return -1;
12758         } else if (c != string.charCodeAt(j++)) {
12759           return -1;
12760         }
12761       }
12762
12763       return j;
12764     }
12765
12766     function parsePeriod(d, string, i) {
12767       var n = periodRe.exec(string.slice(i));
12768       return n ? (d.p = periodLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12769     }
12770
12771     function parseShortWeekday(d, string, i) {
12772       var n = shortWeekdayRe.exec(string.slice(i));
12773       return n ? (d.w = shortWeekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12774     }
12775
12776     function parseWeekday(d, string, i) {
12777       var n = weekdayRe.exec(string.slice(i));
12778       return n ? (d.w = weekdayLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12779     }
12780
12781     function parseShortMonth(d, string, i) {
12782       var n = shortMonthRe.exec(string.slice(i));
12783       return n ? (d.m = shortMonthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12784     }
12785
12786     function parseMonth(d, string, i) {
12787       var n = monthRe.exec(string.slice(i));
12788       return n ? (d.m = monthLookup[n[0].toLowerCase()], i + n[0].length) : -1;
12789     }
12790
12791     function parseLocaleDateTime(d, string, i) {
12792       return parseSpecifier(d, locale_dateTime, string, i);
12793     }
12794
12795     function parseLocaleDate(d, string, i) {
12796       return parseSpecifier(d, locale_date, string, i);
12797     }
12798
12799     function parseLocaleTime(d, string, i) {
12800       return parseSpecifier(d, locale_time, string, i);
12801     }
12802
12803     function formatShortWeekday(d) {
12804       return locale_shortWeekdays[d.getDay()];
12805     }
12806
12807     function formatWeekday(d) {
12808       return locale_weekdays[d.getDay()];
12809     }
12810
12811     function formatShortMonth(d) {
12812       return locale_shortMonths[d.getMonth()];
12813     }
12814
12815     function formatMonth(d) {
12816       return locale_months[d.getMonth()];
12817     }
12818
12819     function formatPeriod(d) {
12820       return locale_periods[+(d.getHours() >= 12)];
12821     }
12822
12823     function formatUTCShortWeekday(d) {
12824       return locale_shortWeekdays[d.getUTCDay()];
12825     }
12826
12827     function formatUTCWeekday(d) {
12828       return locale_weekdays[d.getUTCDay()];
12829     }
12830
12831     function formatUTCShortMonth(d) {
12832       return locale_shortMonths[d.getUTCMonth()];
12833     }
12834
12835     function formatUTCMonth(d) {
12836       return locale_months[d.getUTCMonth()];
12837     }
12838
12839     function formatUTCPeriod(d) {
12840       return locale_periods[+(d.getUTCHours() >= 12)];
12841     }
12842
12843     return {
12844       format: function(specifier) {
12845         var f = newFormat(specifier += "", formats);
12846         f.toString = function() { return specifier; };
12847         return f;
12848       },
12849       parse: function(specifier) {
12850         var p = newParse(specifier += "", localDate);
12851         p.toString = function() { return specifier; };
12852         return p;
12853       },
12854       utcFormat: function(specifier) {
12855         var f = newFormat(specifier += "", utcFormats);
12856         f.toString = function() { return specifier; };
12857         return f;
12858       },
12859       utcParse: function(specifier) {
12860         var p = newParse(specifier, utcDate);
12861         p.toString = function() { return specifier; };
12862         return p;
12863       }
12864     };
12865   }
12866
12867   var pads = {"-": "", "_": " ", "0": "0"},
12868       numberRe = /^\s*\d+/, // note: ignores next directive
12869       percentRe = /^%/,
12870       requoteRe = /[\\^$*+?|[\]().{}]/g;
12871
12872   function pad(value, fill, width) {
12873     var sign = value < 0 ? "-" : "",
12874         string = (sign ? -value : value) + "",
12875         length = string.length;
12876     return sign + (length < width ? new Array(width - length + 1).join(fill) + string : string);
12877   }
12878
12879   function requote(s) {
12880     return s.replace(requoteRe, "\\$&");
12881   }
12882
12883   function formatRe(names) {
12884     return new RegExp("^(?:" + names.map(requote).join("|") + ")", "i");
12885   }
12886
12887   function formatLookup(names) {
12888     var map = {}, i = -1, n = names.length;
12889     while (++i < n) map[names[i].toLowerCase()] = i;
12890     return map;
12891   }
12892
12893   function parseWeekdayNumberSunday(d, string, i) {
12894     var n = numberRe.exec(string.slice(i, i + 1));
12895     return n ? (d.w = +n[0], i + n[0].length) : -1;
12896   }
12897
12898   function parseWeekdayNumberMonday(d, string, i) {
12899     var n = numberRe.exec(string.slice(i, i + 1));
12900     return n ? (d.u = +n[0], i + n[0].length) : -1;
12901   }
12902
12903   function parseWeekNumberSunday(d, string, i) {
12904     var n = numberRe.exec(string.slice(i, i + 2));
12905     return n ? (d.U = +n[0], i + n[0].length) : -1;
12906   }
12907
12908   function parseWeekNumberISO(d, string, i) {
12909     var n = numberRe.exec(string.slice(i, i + 2));
12910     return n ? (d.V = +n[0], i + n[0].length) : -1;
12911   }
12912
12913   function parseWeekNumberMonday(d, string, i) {
12914     var n = numberRe.exec(string.slice(i, i + 2));
12915     return n ? (d.W = +n[0], i + n[0].length) : -1;
12916   }
12917
12918   function parseFullYear(d, string, i) {
12919     var n = numberRe.exec(string.slice(i, i + 4));
12920     return n ? (d.y = +n[0], i + n[0].length) : -1;
12921   }
12922
12923   function parseYear(d, string, i) {
12924     var n = numberRe.exec(string.slice(i, i + 2));
12925     return n ? (d.y = +n[0] + (+n[0] > 68 ? 1900 : 2000), i + n[0].length) : -1;
12926   }
12927
12928   function parseZone(d, string, i) {
12929     var n = /^(Z)|([+-]\d\d)(?::?(\d\d))?/.exec(string.slice(i, i + 6));
12930     return n ? (d.Z = n[1] ? 0 : -(n[2] + (n[3] || "00")), i + n[0].length) : -1;
12931   }
12932
12933   function parseMonthNumber(d, string, i) {
12934     var n = numberRe.exec(string.slice(i, i + 2));
12935     return n ? (d.m = n[0] - 1, i + n[0].length) : -1;
12936   }
12937
12938   function parseDayOfMonth(d, string, i) {
12939     var n = numberRe.exec(string.slice(i, i + 2));
12940     return n ? (d.d = +n[0], i + n[0].length) : -1;
12941   }
12942
12943   function parseDayOfYear(d, string, i) {
12944     var n = numberRe.exec(string.slice(i, i + 3));
12945     return n ? (d.m = 0, d.d = +n[0], i + n[0].length) : -1;
12946   }
12947
12948   function parseHour24(d, string, i) {
12949     var n = numberRe.exec(string.slice(i, i + 2));
12950     return n ? (d.H = +n[0], i + n[0].length) : -1;
12951   }
12952
12953   function parseMinutes(d, string, i) {
12954     var n = numberRe.exec(string.slice(i, i + 2));
12955     return n ? (d.M = +n[0], i + n[0].length) : -1;
12956   }
12957
12958   function parseSeconds(d, string, i) {
12959     var n = numberRe.exec(string.slice(i, i + 2));
12960     return n ? (d.S = +n[0], i + n[0].length) : -1;
12961   }
12962
12963   function parseMilliseconds(d, string, i) {
12964     var n = numberRe.exec(string.slice(i, i + 3));
12965     return n ? (d.L = +n[0], i + n[0].length) : -1;
12966   }
12967
12968   function parseMicroseconds(d, string, i) {
12969     var n = numberRe.exec(string.slice(i, i + 6));
12970     return n ? (d.L = Math.floor(n[0] / 1000), i + n[0].length) : -1;
12971   }
12972
12973   function parseLiteralPercent(d, string, i) {
12974     var n = percentRe.exec(string.slice(i, i + 1));
12975     return n ? i + n[0].length : -1;
12976   }
12977
12978   function parseUnixTimestamp(d, string, i) {
12979     var n = numberRe.exec(string.slice(i));
12980     return n ? (d.Q = +n[0], i + n[0].length) : -1;
12981   }
12982
12983   function parseUnixTimestampSeconds(d, string, i) {
12984     var n = numberRe.exec(string.slice(i));
12985     return n ? (d.Q = (+n[0]) * 1000, i + n[0].length) : -1;
12986   }
12987
12988   function formatDayOfMonth(d, p) {
12989     return pad(d.getDate(), p, 2);
12990   }
12991
12992   function formatHour24(d, p) {
12993     return pad(d.getHours(), p, 2);
12994   }
12995
12996   function formatHour12(d, p) {
12997     return pad(d.getHours() % 12 || 12, p, 2);
12998   }
12999
13000   function formatDayOfYear(d, p) {
13001     return pad(1 + day.count(year(d), d), p, 3);
13002   }
13003
13004   function formatMilliseconds(d, p) {
13005     return pad(d.getMilliseconds(), p, 3);
13006   }
13007
13008   function formatMicroseconds(d, p) {
13009     return formatMilliseconds(d, p) + "000";
13010   }
13011
13012   function formatMonthNumber(d, p) {
13013     return pad(d.getMonth() + 1, p, 2);
13014   }
13015
13016   function formatMinutes(d, p) {
13017     return pad(d.getMinutes(), p, 2);
13018   }
13019
13020   function formatSeconds(d, p) {
13021     return pad(d.getSeconds(), p, 2);
13022   }
13023
13024   function formatWeekdayNumberMonday(d) {
13025     var day$$1 = d.getDay();
13026     return day$$1 === 0 ? 7 : day$$1;
13027   }
13028
13029   function formatWeekNumberSunday(d, p) {
13030     return pad(sunday.count(year(d), d), p, 2);
13031   }
13032
13033   function formatWeekNumberISO(d, p) {
13034     var day$$1 = d.getDay();
13035     d = (day$$1 >= 4 || day$$1 === 0) ? thursday(d) : thursday.ceil(d);
13036     return pad(thursday.count(year(d), d) + (year(d).getDay() === 4), p, 2);
13037   }
13038
13039   function formatWeekdayNumberSunday(d) {
13040     return d.getDay();
13041   }
13042
13043   function formatWeekNumberMonday(d, p) {
13044     return pad(monday.count(year(d), d), p, 2);
13045   }
13046
13047   function formatYear(d, p) {
13048     return pad(d.getFullYear() % 100, p, 2);
13049   }
13050
13051   function formatFullYear(d, p) {
13052     return pad(d.getFullYear() % 10000, p, 4);
13053   }
13054
13055   function formatZone(d) {
13056     var z = d.getTimezoneOffset();
13057     return (z > 0 ? "-" : (z *= -1, "+"))
13058         + pad(z / 60 | 0, "0", 2)
13059         + pad(z % 60, "0", 2);
13060   }
13061
13062   function formatUTCDayOfMonth(d, p) {
13063     return pad(d.getUTCDate(), p, 2);
13064   }
13065
13066   function formatUTCHour24(d, p) {
13067     return pad(d.getUTCHours(), p, 2);
13068   }
13069
13070   function formatUTCHour12(d, p) {
13071     return pad(d.getUTCHours() % 12 || 12, p, 2);
13072   }
13073
13074   function formatUTCDayOfYear(d, p) {
13075     return pad(1 + utcDay.count(utcYear(d), d), p, 3);
13076   }
13077
13078   function formatUTCMilliseconds(d, p) {
13079     return pad(d.getUTCMilliseconds(), p, 3);
13080   }
13081
13082   function formatUTCMicroseconds(d, p) {
13083     return formatUTCMilliseconds(d, p) + "000";
13084   }
13085
13086   function formatUTCMonthNumber(d, p) {
13087     return pad(d.getUTCMonth() + 1, p, 2);
13088   }
13089
13090   function formatUTCMinutes(d, p) {
13091     return pad(d.getUTCMinutes(), p, 2);
13092   }
13093
13094   function formatUTCSeconds(d, p) {
13095     return pad(d.getUTCSeconds(), p, 2);
13096   }
13097
13098   function formatUTCWeekdayNumberMonday(d) {
13099     var dow = d.getUTCDay();
13100     return dow === 0 ? 7 : dow;
13101   }
13102
13103   function formatUTCWeekNumberSunday(d, p) {
13104     return pad(utcSunday.count(utcYear(d), d), p, 2);
13105   }
13106
13107   function formatUTCWeekNumberISO(d, p) {
13108     var day$$1 = d.getUTCDay();
13109     d = (day$$1 >= 4 || day$$1 === 0) ? utcThursday(d) : utcThursday.ceil(d);
13110     return pad(utcThursday.count(utcYear(d), d) + (utcYear(d).getUTCDay() === 4), p, 2);
13111   }
13112
13113   function formatUTCWeekdayNumberSunday(d) {
13114     return d.getUTCDay();
13115   }
13116
13117   function formatUTCWeekNumberMonday(d, p) {
13118     return pad(utcMonday.count(utcYear(d), d), p, 2);
13119   }
13120
13121   function formatUTCYear(d, p) {
13122     return pad(d.getUTCFullYear() % 100, p, 2);
13123   }
13124
13125   function formatUTCFullYear(d, p) {
13126     return pad(d.getUTCFullYear() % 10000, p, 4);
13127   }
13128
13129   function formatUTCZone() {
13130     return "+0000";
13131   }
13132
13133   function formatLiteralPercent() {
13134     return "%";
13135   }
13136
13137   function formatUnixTimestamp(d) {
13138     return +d;
13139   }
13140
13141   function formatUnixTimestampSeconds(d) {
13142     return Math.floor(+d / 1000);
13143   }
13144
13145   var locale$1;
13146   var timeFormat;
13147   var timeParse;
13148   var utcFormat;
13149   var utcParse;
13150
13151   defaultLocale$1({
13152     dateTime: "%x, %X",
13153     date: "%-m/%-d/%Y",
13154     time: "%-I:%M:%S %p",
13155     periods: ["AM", "PM"],
13156     days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
13157     shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
13158     months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
13159     shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"]
13160   });
13161
13162   function defaultLocale$1(definition) {
13163     locale$1 = formatLocale$1(definition);
13164     timeFormat = locale$1.format;
13165     timeParse = locale$1.parse;
13166     utcFormat = locale$1.utcFormat;
13167     utcParse = locale$1.utcParse;
13168     return locale$1;
13169   }
13170
13171   var isoSpecifier = "%Y-%m-%dT%H:%M:%S.%LZ";
13172
13173   function formatIsoNative(date) {
13174     return date.toISOString();
13175   }
13176
13177   var formatIso = Date.prototype.toISOString
13178       ? formatIsoNative
13179       : utcFormat(isoSpecifier);
13180
13181   function parseIsoNative(string) {
13182     var date = new Date(string);
13183     return isNaN(date) ? null : date;
13184   }
13185
13186   var parseIso = +new Date("2000-01-01T00:00:00.000Z")
13187       ? parseIsoNative
13188       : utcParse(isoSpecifier);
13189
13190   var durationSecond$1 = 1000,
13191       durationMinute$1 = durationSecond$1 * 60,
13192       durationHour$1 = durationMinute$1 * 60,
13193       durationDay$1 = durationHour$1 * 24,
13194       durationWeek$1 = durationDay$1 * 7,
13195       durationMonth = durationDay$1 * 30,
13196       durationYear = durationDay$1 * 365;
13197
13198   function date$1(t) {
13199     return new Date(t);
13200   }
13201
13202   function number$3(t) {
13203     return t instanceof Date ? +t : +new Date(+t);
13204   }
13205
13206   function calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format) {
13207     var scale = continuous(deinterpolateLinear, interpolateNumber),
13208         invert = scale.invert,
13209         domain = scale.domain;
13210
13211     var formatMillisecond = format(".%L"),
13212         formatSecond = format(":%S"),
13213         formatMinute = format("%I:%M"),
13214         formatHour = format("%I %p"),
13215         formatDay = format("%a %d"),
13216         formatWeek = format("%b %d"),
13217         formatMonth = format("%B"),
13218         formatYear = format("%Y");
13219
13220     var tickIntervals = [
13221       [second$$1,  1,      durationSecond$1],
13222       [second$$1,  5,  5 * durationSecond$1],
13223       [second$$1, 15, 15 * durationSecond$1],
13224       [second$$1, 30, 30 * durationSecond$1],
13225       [minute$$1,  1,      durationMinute$1],
13226       [minute$$1,  5,  5 * durationMinute$1],
13227       [minute$$1, 15, 15 * durationMinute$1],
13228       [minute$$1, 30, 30 * durationMinute$1],
13229       [  hour$$1,  1,      durationHour$1  ],
13230       [  hour$$1,  3,  3 * durationHour$1  ],
13231       [  hour$$1,  6,  6 * durationHour$1  ],
13232       [  hour$$1, 12, 12 * durationHour$1  ],
13233       [   day$$1,  1,      durationDay$1   ],
13234       [   day$$1,  2,  2 * durationDay$1   ],
13235       [  week,  1,      durationWeek$1  ],
13236       [ month$$1,  1,      durationMonth ],
13237       [ month$$1,  3,  3 * durationMonth ],
13238       [  year$$1,  1,      durationYear  ]
13239     ];
13240
13241     function tickFormat(date$$1) {
13242       return (second$$1(date$$1) < date$$1 ? formatMillisecond
13243           : minute$$1(date$$1) < date$$1 ? formatSecond
13244           : hour$$1(date$$1) < date$$1 ? formatMinute
13245           : day$$1(date$$1) < date$$1 ? formatHour
13246           : month$$1(date$$1) < date$$1 ? (week(date$$1) < date$$1 ? formatDay : formatWeek)
13247           : year$$1(date$$1) < date$$1 ? formatMonth
13248           : formatYear)(date$$1);
13249     }
13250
13251     function tickInterval(interval, start, stop, step) {
13252       if (interval == null) interval = 10;
13253
13254       // If a desired tick count is specified, pick a reasonable tick interval
13255       // based on the extent of the domain and a rough estimate of tick size.
13256       // Otherwise, assume interval is already a time interval and use it.
13257       if (typeof interval === "number") {
13258         var target = Math.abs(stop - start) / interval,
13259             i = bisector(function(i) { return i[2]; }).right(tickIntervals, target);
13260         if (i === tickIntervals.length) {
13261           step = tickStep(start / durationYear, stop / durationYear, interval);
13262           interval = year$$1;
13263         } else if (i) {
13264           i = tickIntervals[target / tickIntervals[i - 1][2] < tickIntervals[i][2] / target ? i - 1 : i];
13265           step = i[1];
13266           interval = i[0];
13267         } else {
13268           step = Math.max(tickStep(start, stop, interval), 1);
13269           interval = millisecond$$1;
13270         }
13271       }
13272
13273       return step == null ? interval : interval.every(step);
13274     }
13275
13276     scale.invert = function(y) {
13277       return new Date(invert(y));
13278     };
13279
13280     scale.domain = function(_) {
13281       return arguments.length ? domain(map$2.call(_, number$3)) : domain().map(date$1);
13282     };
13283
13284     scale.ticks = function(interval, step) {
13285       var d = domain(),
13286           t0 = d[0],
13287           t1 = d[d.length - 1],
13288           r = t1 < t0,
13289           t;
13290       if (r) t = t0, t0 = t1, t1 = t;
13291       t = tickInterval(interval, t0, t1, step);
13292       t = t ? t.range(t0, t1 + 1) : []; // inclusive stop
13293       return r ? t.reverse() : t;
13294     };
13295
13296     scale.tickFormat = function(count, specifier) {
13297       return specifier == null ? tickFormat : format(specifier);
13298     };
13299
13300     scale.nice = function(interval, step) {
13301       var d = domain();
13302       return (interval = tickInterval(interval, d[0], d[d.length - 1], step))
13303           ? domain(nice(d, interval))
13304           : scale;
13305     };
13306
13307     scale.copy = function() {
13308       return copy(scale, calendar(year$$1, month$$1, week, day$$1, hour$$1, minute$$1, second$$1, millisecond$$1, format));
13309     };
13310
13311     return scale;
13312   }
13313
13314   function time() {
13315     return calendar(year, month, sunday, day, hour, minute, second, millisecond, timeFormat).domain([new Date(2000, 0, 1), new Date(2000, 0, 2)]);
13316   }
13317
13318   function utcTime() {
13319     return calendar(utcYear, utcMonth, utcSunday, utcDay, utcHour, utcMinute, second, millisecond, utcFormat).domain([Date.UTC(2000, 0, 1), Date.UTC(2000, 0, 2)]);
13320   }
13321
13322   function colors(s) {
13323     return s.match(/.{6}/g).map(function(x) {
13324       return "#" + x;
13325     });
13326   }
13327
13328   var category10 = colors("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf");
13329
13330   var category20b = colors("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6");
13331
13332   var category20c = colors("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9");
13333
13334   var category20 = colors("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5");
13335
13336   var cubehelix$3 = cubehelixLong(cubehelix(300, 0.5, 0.0), cubehelix(-240, 0.5, 1.0));
13337
13338   var warm = cubehelixLong(cubehelix(-100, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13339
13340   var cool = cubehelixLong(cubehelix(260, 0.75, 0.35), cubehelix(80, 1.50, 0.8));
13341
13342   var rainbow = cubehelix();
13343
13344   function rainbow$1(t) {
13345     if (t < 0 || t > 1) t -= Math.floor(t);
13346     var ts = Math.abs(t - 0.5);
13347     rainbow.h = 360 * t - 100;
13348     rainbow.s = 1.5 - 1.5 * ts;
13349     rainbow.l = 0.8 - 0.9 * ts;
13350     return rainbow + "";
13351   }
13352
13353   function ramp(range) {
13354     var n = range.length;
13355     return function(t) {
13356       return range[Math.max(0, Math.min(n - 1, Math.floor(t * n)))];
13357     };
13358   }
13359
13360   var viridis = ramp(colors("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725"));
13361
13362   var magma = ramp(colors("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf"));
13363
13364   var inferno = ramp(colors("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4"));
13365
13366   var plasma = ramp(colors("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921"));
13367
13368   function sequential(interpolator) {
13369     var x0 = 0,
13370         x1 = 1,
13371         clamp = false;
13372
13373     function scale(x) {
13374       var t = (x - x0) / (x1 - x0);
13375       return interpolator(clamp ? Math.max(0, Math.min(1, t)) : t);
13376     }
13377
13378     scale.domain = function(_) {
13379       return arguments.length ? (x0 = +_[0], x1 = +_[1], scale) : [x0, x1];
13380     };
13381
13382     scale.clamp = function(_) {
13383       return arguments.length ? (clamp = !!_, scale) : clamp;
13384     };
13385
13386     scale.interpolator = function(_) {
13387       return arguments.length ? (interpolator = _, scale) : interpolator;
13388     };
13389
13390     scale.copy = function() {
13391       return sequential(interpolator).domain([x0, x1]).clamp(clamp);
13392     };
13393
13394     return linearish(scale);
13395   }
13396
13397   function constant$a(x) {
13398     return function constant() {
13399       return x;
13400     };
13401   }
13402
13403   var abs$1 = Math.abs;
13404   var atan2$1 = Math.atan2;
13405   var cos$2 = Math.cos;
13406   var max$2 = Math.max;
13407   var min$1 = Math.min;
13408   var sin$2 = Math.sin;
13409   var sqrt$2 = Math.sqrt;
13410
13411   var epsilon$3 = 1e-12;
13412   var pi$4 = Math.PI;
13413   var halfPi$3 = pi$4 / 2;
13414   var tau$4 = 2 * pi$4;
13415
13416   function acos$1(x) {
13417     return x > 1 ? 0 : x < -1 ? pi$4 : Math.acos(x);
13418   }
13419
13420   function asin$1(x) {
13421     return x >= 1 ? halfPi$3 : x <= -1 ? -halfPi$3 : Math.asin(x);
13422   }
13423
13424   function arcInnerRadius(d) {
13425     return d.innerRadius;
13426   }
13427
13428   function arcOuterRadius(d) {
13429     return d.outerRadius;
13430   }
13431
13432   function arcStartAngle(d) {
13433     return d.startAngle;
13434   }
13435
13436   function arcEndAngle(d) {
13437     return d.endAngle;
13438   }
13439
13440   function arcPadAngle(d) {
13441     return d && d.padAngle; // Note: optional!
13442   }
13443
13444   function intersect(x0, y0, x1, y1, x2, y2, x3, y3) {
13445     var x10 = x1 - x0, y10 = y1 - y0,
13446         x32 = x3 - x2, y32 = y3 - y2,
13447         t = (x32 * (y0 - y2) - y32 * (x0 - x2)) / (y32 * x10 - x32 * y10);
13448     return [x0 + t * x10, y0 + t * y10];
13449   }
13450
13451   // Compute perpendicular offset line of length rc.
13452   // http://mathworld.wolfram.com/Circle-LineIntersection.html
13453   function cornerTangents(x0, y0, x1, y1, r1, rc, cw) {
13454     var x01 = x0 - x1,
13455         y01 = y0 - y1,
13456         lo = (cw ? rc : -rc) / sqrt$2(x01 * x01 + y01 * y01),
13457         ox = lo * y01,
13458         oy = -lo * x01,
13459         x11 = x0 + ox,
13460         y11 = y0 + oy,
13461         x10 = x1 + ox,
13462         y10 = y1 + oy,
13463         x00 = (x11 + x10) / 2,
13464         y00 = (y11 + y10) / 2,
13465         dx = x10 - x11,
13466         dy = y10 - y11,
13467         d2 = dx * dx + dy * dy,
13468         r = r1 - rc,
13469         D = x11 * y10 - x10 * y11,
13470         d = (dy < 0 ? -1 : 1) * sqrt$2(max$2(0, r * r * d2 - D * D)),
13471         cx0 = (D * dy - dx * d) / d2,
13472         cy0 = (-D * dx - dy * d) / d2,
13473         cx1 = (D * dy + dx * d) / d2,
13474         cy1 = (-D * dx + dy * d) / d2,
13475         dx0 = cx0 - x00,
13476         dy0 = cy0 - y00,
13477         dx1 = cx1 - x00,
13478         dy1 = cy1 - y00;
13479
13480     // Pick the closer of the two intersection points.
13481     // TODO Is there a faster way to determine which intersection to use?
13482     if (dx0 * dx0 + dy0 * dy0 > dx1 * dx1 + dy1 * dy1) cx0 = cx1, cy0 = cy1;
13483
13484     return {
13485       cx: cx0,
13486       cy: cy0,
13487       x01: -ox,
13488       y01: -oy,
13489       x11: cx0 * (r1 / r - 1),
13490       y11: cy0 * (r1 / r - 1)
13491     };
13492   }
13493
13494   function arc() {
13495     var innerRadius = arcInnerRadius,
13496         outerRadius = arcOuterRadius,
13497         cornerRadius = constant$a(0),
13498         padRadius = null,
13499         startAngle = arcStartAngle,
13500         endAngle = arcEndAngle,
13501         padAngle = arcPadAngle,
13502         context = null;
13503
13504     function arc() {
13505       var buffer,
13506           r,
13507           r0 = +innerRadius.apply(this, arguments),
13508           r1 = +outerRadius.apply(this, arguments),
13509           a0 = startAngle.apply(this, arguments) - halfPi$3,
13510           a1 = endAngle.apply(this, arguments) - halfPi$3,
13511           da = abs$1(a1 - a0),
13512           cw = a1 > a0;
13513
13514       if (!context) context = buffer = path();
13515
13516       // Ensure that the outer radius is always larger than the inner radius.
13517       if (r1 < r0) r = r1, r1 = r0, r0 = r;
13518
13519       // Is it a point?
13520       if (!(r1 > epsilon$3)) context.moveTo(0, 0);
13521
13522       // Or is it a circle or annulus?
13523       else if (da > tau$4 - epsilon$3) {
13524         context.moveTo(r1 * cos$2(a0), r1 * sin$2(a0));
13525         context.arc(0, 0, r1, a0, a1, !cw);
13526         if (r0 > epsilon$3) {
13527           context.moveTo(r0 * cos$2(a1), r0 * sin$2(a1));
13528           context.arc(0, 0, r0, a1, a0, cw);
13529         }
13530       }
13531
13532       // Or is it a circular or annular sector?
13533       else {
13534         var a01 = a0,
13535             a11 = a1,
13536             a00 = a0,
13537             a10 = a1,
13538             da0 = da,
13539             da1 = da,
13540             ap = padAngle.apply(this, arguments) / 2,
13541             rp = (ap > epsilon$3) && (padRadius ? +padRadius.apply(this, arguments) : sqrt$2(r0 * r0 + r1 * r1)),
13542             rc = min$1(abs$1(r1 - r0) / 2, +cornerRadius.apply(this, arguments)),
13543             rc0 = rc,
13544             rc1 = rc,
13545             t0,
13546             t1;
13547
13548         // Apply padding? Note that since r1 ≥ r0, da1 ≥ da0.
13549         if (rp > epsilon$3) {
13550           var p0 = asin$1(rp / r0 * sin$2(ap)),
13551               p1 = asin$1(rp / r1 * sin$2(ap));
13552           if ((da0 -= p0 * 2) > epsilon$3) p0 *= (cw ? 1 : -1), a00 += p0, a10 -= p0;
13553           else da0 = 0, a00 = a10 = (a0 + a1) / 2;
13554           if ((da1 -= p1 * 2) > epsilon$3) p1 *= (cw ? 1 : -1), a01 += p1, a11 -= p1;
13555           else da1 = 0, a01 = a11 = (a0 + a1) / 2;
13556         }
13557
13558         var x01 = r1 * cos$2(a01),
13559             y01 = r1 * sin$2(a01),
13560             x10 = r0 * cos$2(a10),
13561             y10 = r0 * sin$2(a10);
13562
13563         // Apply rounded corners?
13564         if (rc > epsilon$3) {
13565           var x11 = r1 * cos$2(a11),
13566               y11 = r1 * sin$2(a11),
13567               x00 = r0 * cos$2(a00),
13568               y00 = r0 * sin$2(a00);
13569
13570           // Restrict the corner radius according to the sector angle.
13571           if (da < pi$4) {
13572             var oc = da0 > epsilon$3 ? intersect(x01, y01, x00, y00, x11, y11, x10, y10) : [x10, y10],
13573                 ax = x01 - oc[0],
13574                 ay = y01 - oc[1],
13575                 bx = x11 - oc[0],
13576                 by = y11 - oc[1],
13577                 kc = 1 / sin$2(acos$1((ax * bx + ay * by) / (sqrt$2(ax * ax + ay * ay) * sqrt$2(bx * bx + by * by))) / 2),
13578                 lc = sqrt$2(oc[0] * oc[0] + oc[1] * oc[1]);
13579             rc0 = min$1(rc, (r0 - lc) / (kc - 1));
13580             rc1 = min$1(rc, (r1 - lc) / (kc + 1));
13581           }
13582         }
13583
13584         // Is the sector collapsed to a line?
13585         if (!(da1 > epsilon$3)) context.moveTo(x01, y01);
13586
13587         // Does the sector’s outer ring have rounded corners?
13588         else if (rc1 > epsilon$3) {
13589           t0 = cornerTangents(x00, y00, x01, y01, r1, rc1, cw);
13590           t1 = cornerTangents(x11, y11, x10, y10, r1, rc1, cw);
13591
13592           context.moveTo(t0.cx + t0.x01, t0.cy + t0.y01);
13593
13594           // Have the corners merged?
13595           if (rc1 < rc) context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13596
13597           // Otherwise, draw the two corners and the ring.
13598           else {
13599             context.arc(t0.cx, t0.cy, rc1, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13600             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);
13601             context.arc(t1.cx, t1.cy, rc1, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13602           }
13603         }
13604
13605         // Or is the outer ring just a circular arc?
13606         else context.moveTo(x01, y01), context.arc(0, 0, r1, a01, a11, !cw);
13607
13608         // Is there no inner ring, and it’s a circular sector?
13609         // Or perhaps it’s an annular sector collapsed due to padding?
13610         if (!(r0 > epsilon$3) || !(da0 > epsilon$3)) context.lineTo(x10, y10);
13611
13612         // Does the sector’s inner ring (or point) have rounded corners?
13613         else if (rc0 > epsilon$3) {
13614           t0 = cornerTangents(x10, y10, x11, y11, r0, -rc0, cw);
13615           t1 = cornerTangents(x01, y01, x00, y00, r0, -rc0, cw);
13616
13617           context.lineTo(t0.cx + t0.x01, t0.cy + t0.y01);
13618
13619           // Have the corners merged?
13620           if (rc0 < rc) context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t1.y01, t1.x01), !cw);
13621
13622           // Otherwise, draw the two corners and the ring.
13623           else {
13624             context.arc(t0.cx, t0.cy, rc0, atan2$1(t0.y01, t0.x01), atan2$1(t0.y11, t0.x11), !cw);
13625             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);
13626             context.arc(t1.cx, t1.cy, rc0, atan2$1(t1.y11, t1.x11), atan2$1(t1.y01, t1.x01), !cw);
13627           }
13628         }
13629
13630         // Or is the inner ring just a circular arc?
13631         else context.arc(0, 0, r0, a10, a00, cw);
13632       }
13633
13634       context.closePath();
13635
13636       if (buffer) return context = null, buffer + "" || null;
13637     }
13638
13639     arc.centroid = function() {
13640       var r = (+innerRadius.apply(this, arguments) + +outerRadius.apply(this, arguments)) / 2,
13641           a = (+startAngle.apply(this, arguments) + +endAngle.apply(this, arguments)) / 2 - pi$4 / 2;
13642       return [cos$2(a) * r, sin$2(a) * r];
13643     };
13644
13645     arc.innerRadius = function(_) {
13646       return arguments.length ? (innerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : innerRadius;
13647     };
13648
13649     arc.outerRadius = function(_) {
13650       return arguments.length ? (outerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : outerRadius;
13651     };
13652
13653     arc.cornerRadius = function(_) {
13654       return arguments.length ? (cornerRadius = typeof _ === "function" ? _ : constant$a(+_), arc) : cornerRadius;
13655     };
13656
13657     arc.padRadius = function(_) {
13658       return arguments.length ? (padRadius = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), arc) : padRadius;
13659     };
13660
13661     arc.startAngle = function(_) {
13662       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : startAngle;
13663     };
13664
13665     arc.endAngle = function(_) {
13666       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : endAngle;
13667     };
13668
13669     arc.padAngle = function(_) {
13670       return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), arc) : padAngle;
13671     };
13672
13673     arc.context = function(_) {
13674       return arguments.length ? ((context = _ == null ? null : _), arc) : context;
13675     };
13676
13677     return arc;
13678   }
13679
13680   function Linear(context) {
13681     this._context = context;
13682   }
13683
13684   Linear.prototype = {
13685     areaStart: function() {
13686       this._line = 0;
13687     },
13688     areaEnd: function() {
13689       this._line = NaN;
13690     },
13691     lineStart: function() {
13692       this._point = 0;
13693     },
13694     lineEnd: function() {
13695       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
13696       this._line = 1 - this._line;
13697     },
13698     point: function(x, y) {
13699       x = +x, y = +y;
13700       switch (this._point) {
13701         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
13702         case 1: this._point = 2; // proceed
13703         default: this._context.lineTo(x, y); break;
13704       }
13705     }
13706   };
13707
13708   function curveLinear(context) {
13709     return new Linear(context);
13710   }
13711
13712   function x$3(p) {
13713     return p[0];
13714   }
13715
13716   function y$3(p) {
13717     return p[1];
13718   }
13719
13720   function line() {
13721     var x$$1 = x$3,
13722         y$$1 = y$3,
13723         defined = constant$a(true),
13724         context = null,
13725         curve = curveLinear,
13726         output = null;
13727
13728     function line(data) {
13729       var i,
13730           n = data.length,
13731           d,
13732           defined0 = false,
13733           buffer;
13734
13735       if (context == null) output = curve(buffer = path());
13736
13737       for (i = 0; i <= n; ++i) {
13738         if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13739           if (defined0 = !defined0) output.lineStart();
13740           else output.lineEnd();
13741         }
13742         if (defined0) output.point(+x$$1(d, i, data), +y$$1(d, i, data));
13743       }
13744
13745       if (buffer) return output = null, buffer + "" || null;
13746     }
13747
13748     line.x = function(_) {
13749       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : x$$1;
13750     };
13751
13752     line.y = function(_) {
13753       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), line) : y$$1;
13754     };
13755
13756     line.defined = function(_) {
13757       return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), line) : defined;
13758     };
13759
13760     line.curve = function(_) {
13761       return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;
13762     };
13763
13764     line.context = function(_) {
13765       return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;
13766     };
13767
13768     return line;
13769   }
13770
13771   function area() {
13772     var x0 = x$3,
13773         x1 = null,
13774         y0 = constant$a(0),
13775         y1 = y$3,
13776         defined = constant$a(true),
13777         context = null,
13778         curve = curveLinear,
13779         output = null;
13780
13781     function area(data) {
13782       var i,
13783           j,
13784           k,
13785           n = data.length,
13786           d,
13787           defined0 = false,
13788           buffer,
13789           x0z = new Array(n),
13790           y0z = new Array(n);
13791
13792       if (context == null) output = curve(buffer = path());
13793
13794       for (i = 0; i <= n; ++i) {
13795         if (!(i < n && defined(d = data[i], i, data)) === defined0) {
13796           if (defined0 = !defined0) {
13797             j = i;
13798             output.areaStart();
13799             output.lineStart();
13800           } else {
13801             output.lineEnd();
13802             output.lineStart();
13803             for (k = i - 1; k >= j; --k) {
13804               output.point(x0z[k], y0z[k]);
13805             }
13806             output.lineEnd();
13807             output.areaEnd();
13808           }
13809         }
13810         if (defined0) {
13811           x0z[i] = +x0(d, i, data), y0z[i] = +y0(d, i, data);
13812           output.point(x1 ? +x1(d, i, data) : x0z[i], y1 ? +y1(d, i, data) : y0z[i]);
13813         }
13814       }
13815
13816       if (buffer) return output = null, buffer + "" || null;
13817     }
13818
13819     function arealine() {
13820       return line().defined(defined).curve(curve).context(context);
13821     }
13822
13823     area.x = function(_) {
13824       return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), x1 = null, area) : x0;
13825     };
13826
13827     area.x0 = function(_) {
13828       return arguments.length ? (x0 = typeof _ === "function" ? _ : constant$a(+_), area) : x0;
13829     };
13830
13831     area.x1 = function(_) {
13832       return arguments.length ? (x1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : x1;
13833     };
13834
13835     area.y = function(_) {
13836       return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), y1 = null, area) : y0;
13837     };
13838
13839     area.y0 = function(_) {
13840       return arguments.length ? (y0 = typeof _ === "function" ? _ : constant$a(+_), area) : y0;
13841     };
13842
13843     area.y1 = function(_) {
13844       return arguments.length ? (y1 = _ == null ? null : typeof _ === "function" ? _ : constant$a(+_), area) : y1;
13845     };
13846
13847     area.lineX0 =
13848     area.lineY0 = function() {
13849       return arealine().x(x0).y(y0);
13850     };
13851
13852     area.lineY1 = function() {
13853       return arealine().x(x0).y(y1);
13854     };
13855
13856     area.lineX1 = function() {
13857       return arealine().x(x1).y(y0);
13858     };
13859
13860     area.defined = function(_) {
13861       return arguments.length ? (defined = typeof _ === "function" ? _ : constant$a(!!_), area) : defined;
13862     };
13863
13864     area.curve = function(_) {
13865       return arguments.length ? (curve = _, context != null && (output = curve(context)), area) : curve;
13866     };
13867
13868     area.context = function(_) {
13869       return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), area) : context;
13870     };
13871
13872     return area;
13873   }
13874
13875   function descending(a, b) {
13876     return b < a ? -1 : b > a ? 1 : b >= a ? 0 : NaN;
13877   }
13878
13879   function identity$6(d) {
13880     return d;
13881   }
13882
13883   function pie() {
13884     var value = identity$6,
13885         sortValues = descending,
13886         sort = null,
13887         startAngle = constant$a(0),
13888         endAngle = constant$a(tau$4),
13889         padAngle = constant$a(0);
13890
13891     function pie(data) {
13892       var i,
13893           n = data.length,
13894           j,
13895           k,
13896           sum = 0,
13897           index = new Array(n),
13898           arcs = new Array(n),
13899           a0 = +startAngle.apply(this, arguments),
13900           da = Math.min(tau$4, Math.max(-tau$4, endAngle.apply(this, arguments) - a0)),
13901           a1,
13902           p = Math.min(Math.abs(da) / n, padAngle.apply(this, arguments)),
13903           pa = p * (da < 0 ? -1 : 1),
13904           v;
13905
13906       for (i = 0; i < n; ++i) {
13907         if ((v = arcs[index[i] = i] = +value(data[i], i, data)) > 0) {
13908           sum += v;
13909         }
13910       }
13911
13912       // Optionally sort the arcs by previously-computed values or by data.
13913       if (sortValues != null) index.sort(function(i, j) { return sortValues(arcs[i], arcs[j]); });
13914       else if (sort != null) index.sort(function(i, j) { return sort(data[i], data[j]); });
13915
13916       // Compute the arcs! They are stored in the original data's order.
13917       for (i = 0, k = sum ? (da - n * pa) / sum : 0; i < n; ++i, a0 = a1) {
13918         j = index[i], v = arcs[j], a1 = a0 + (v > 0 ? v * k : 0) + pa, arcs[j] = {
13919           data: data[j],
13920           index: i,
13921           value: v,
13922           startAngle: a0,
13923           endAngle: a1,
13924           padAngle: p
13925         };
13926       }
13927
13928       return arcs;
13929     }
13930
13931     pie.value = function(_) {
13932       return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), pie) : value;
13933     };
13934
13935     pie.sortValues = function(_) {
13936       return arguments.length ? (sortValues = _, sort = null, pie) : sortValues;
13937     };
13938
13939     pie.sort = function(_) {
13940       return arguments.length ? (sort = _, sortValues = null, pie) : sort;
13941     };
13942
13943     pie.startAngle = function(_) {
13944       return arguments.length ? (startAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : startAngle;
13945     };
13946
13947     pie.endAngle = function(_) {
13948       return arguments.length ? (endAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : endAngle;
13949     };
13950
13951     pie.padAngle = function(_) {
13952       return arguments.length ? (padAngle = typeof _ === "function" ? _ : constant$a(+_), pie) : padAngle;
13953     };
13954
13955     return pie;
13956   }
13957
13958   var curveRadialLinear = curveRadial(curveLinear);
13959
13960   function Radial(curve) {
13961     this._curve = curve;
13962   }
13963
13964   Radial.prototype = {
13965     areaStart: function() {
13966       this._curve.areaStart();
13967     },
13968     areaEnd: function() {
13969       this._curve.areaEnd();
13970     },
13971     lineStart: function() {
13972       this._curve.lineStart();
13973     },
13974     lineEnd: function() {
13975       this._curve.lineEnd();
13976     },
13977     point: function(a, r) {
13978       this._curve.point(r * Math.sin(a), r * -Math.cos(a));
13979     }
13980   };
13981
13982   function curveRadial(curve) {
13983
13984     function radial(context) {
13985       return new Radial(curve(context));
13986     }
13987
13988     radial._curve = curve;
13989
13990     return radial;
13991   }
13992
13993   function lineRadial(l) {
13994     var c = l.curve;
13995
13996     l.angle = l.x, delete l.x;
13997     l.radius = l.y, delete l.y;
13998
13999     l.curve = function(_) {
14000       return arguments.length ? c(curveRadial(_)) : c()._curve;
14001     };
14002
14003     return l;
14004   }
14005
14006   function lineRadial$1() {
14007     return lineRadial(line().curve(curveRadialLinear));
14008   }
14009
14010   function areaRadial() {
14011     var a = area().curve(curveRadialLinear),
14012         c = a.curve,
14013         x0 = a.lineX0,
14014         x1 = a.lineX1,
14015         y0 = a.lineY0,
14016         y1 = a.lineY1;
14017
14018     a.angle = a.x, delete a.x;
14019     a.startAngle = a.x0, delete a.x0;
14020     a.endAngle = a.x1, delete a.x1;
14021     a.radius = a.y, delete a.y;
14022     a.innerRadius = a.y0, delete a.y0;
14023     a.outerRadius = a.y1, delete a.y1;
14024     a.lineStartAngle = function() { return lineRadial(x0()); }, delete a.lineX0;
14025     a.lineEndAngle = function() { return lineRadial(x1()); }, delete a.lineX1;
14026     a.lineInnerRadius = function() { return lineRadial(y0()); }, delete a.lineY0;
14027     a.lineOuterRadius = function() { return lineRadial(y1()); }, delete a.lineY1;
14028
14029     a.curve = function(_) {
14030       return arguments.length ? c(curveRadial(_)) : c()._curve;
14031     };
14032
14033     return a;
14034   }
14035
14036   function pointRadial(x, y) {
14037     return [(y = +y) * Math.cos(x -= Math.PI / 2), y * Math.sin(x)];
14038   }
14039
14040   var slice$6 = Array.prototype.slice;
14041
14042   function linkSource(d) {
14043     return d.source;
14044   }
14045
14046   function linkTarget(d) {
14047     return d.target;
14048   }
14049
14050   function link$2(curve) {
14051     var source = linkSource,
14052         target = linkTarget,
14053         x$$1 = x$3,
14054         y$$1 = y$3,
14055         context = null;
14056
14057     function link() {
14058       var buffer, argv = slice$6.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);
14059       if (!context) context = buffer = path();
14060       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));
14061       if (buffer) return context = null, buffer + "" || null;
14062     }
14063
14064     link.source = function(_) {
14065       return arguments.length ? (source = _, link) : source;
14066     };
14067
14068     link.target = function(_) {
14069       return arguments.length ? (target = _, link) : target;
14070     };
14071
14072     link.x = function(_) {
14073       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : x$$1;
14074     };
14075
14076     link.y = function(_) {
14077       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$a(+_), link) : y$$1;
14078     };
14079
14080     link.context = function(_) {
14081       return arguments.length ? ((context = _ == null ? null : _), link) : context;
14082     };
14083
14084     return link;
14085   }
14086
14087   function curveHorizontal(context, x0, y0, x1, y1) {
14088     context.moveTo(x0, y0);
14089     context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);
14090   }
14091
14092   function curveVertical(context, x0, y0, x1, y1) {
14093     context.moveTo(x0, y0);
14094     context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);
14095   }
14096
14097   function curveRadial$1(context, x0, y0, x1, y1) {
14098     var p0 = pointRadial(x0, y0),
14099         p1 = pointRadial(x0, y0 = (y0 + y1) / 2),
14100         p2 = pointRadial(x1, y0),
14101         p3 = pointRadial(x1, y1);
14102     context.moveTo(p0[0], p0[1]);
14103     context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);
14104   }
14105
14106   function linkHorizontal() {
14107     return link$2(curveHorizontal);
14108   }
14109
14110   function linkVertical() {
14111     return link$2(curveVertical);
14112   }
14113
14114   function linkRadial() {
14115     var l = link$2(curveRadial$1);
14116     l.angle = l.x, delete l.x;
14117     l.radius = l.y, delete l.y;
14118     return l;
14119   }
14120
14121   var circle$2 = {
14122     draw: function(context, size) {
14123       var r = Math.sqrt(size / pi$4);
14124       context.moveTo(r, 0);
14125       context.arc(0, 0, r, 0, tau$4);
14126     }
14127   };
14128
14129   var cross$2 = {
14130     draw: function(context, size) {
14131       var r = Math.sqrt(size / 5) / 2;
14132       context.moveTo(-3 * r, -r);
14133       context.lineTo(-r, -r);
14134       context.lineTo(-r, -3 * r);
14135       context.lineTo(r, -3 * r);
14136       context.lineTo(r, -r);
14137       context.lineTo(3 * r, -r);
14138       context.lineTo(3 * r, r);
14139       context.lineTo(r, r);
14140       context.lineTo(r, 3 * r);
14141       context.lineTo(-r, 3 * r);
14142       context.lineTo(-r, r);
14143       context.lineTo(-3 * r, r);
14144       context.closePath();
14145     }
14146   };
14147
14148   var tan30 = Math.sqrt(1 / 3),
14149       tan30_2 = tan30 * 2;
14150
14151   var diamond = {
14152     draw: function(context, size) {
14153       var y = Math.sqrt(size / tan30_2),
14154           x = y * tan30;
14155       context.moveTo(0, -y);
14156       context.lineTo(x, 0);
14157       context.lineTo(0, y);
14158       context.lineTo(-x, 0);
14159       context.closePath();
14160     }
14161   };
14162
14163   var ka = 0.89081309152928522810,
14164       kr = Math.sin(pi$4 / 10) / Math.sin(7 * pi$4 / 10),
14165       kx = Math.sin(tau$4 / 10) * kr,
14166       ky = -Math.cos(tau$4 / 10) * kr;
14167
14168   var star = {
14169     draw: function(context, size) {
14170       var r = Math.sqrt(size * ka),
14171           x = kx * r,
14172           y = ky * r;
14173       context.moveTo(0, -r);
14174       context.lineTo(x, y);
14175       for (var i = 1; i < 5; ++i) {
14176         var a = tau$4 * i / 5,
14177             c = Math.cos(a),
14178             s = Math.sin(a);
14179         context.lineTo(s * r, -c * r);
14180         context.lineTo(c * x - s * y, s * x + c * y);
14181       }
14182       context.closePath();
14183     }
14184   };
14185
14186   var square = {
14187     draw: function(context, size) {
14188       var w = Math.sqrt(size),
14189           x = -w / 2;
14190       context.rect(x, x, w, w);
14191     }
14192   };
14193
14194   var sqrt3 = Math.sqrt(3);
14195
14196   var triangle = {
14197     draw: function(context, size) {
14198       var y = -Math.sqrt(size / (sqrt3 * 3));
14199       context.moveTo(0, y * 2);
14200       context.lineTo(-sqrt3 * y, -y);
14201       context.lineTo(sqrt3 * y, -y);
14202       context.closePath();
14203     }
14204   };
14205
14206   var c = -0.5,
14207       s = Math.sqrt(3) / 2,
14208       k = 1 / Math.sqrt(12),
14209       a = (k / 2 + 1) * 3;
14210
14211   var wye = {
14212     draw: function(context, size) {
14213       var r = Math.sqrt(size / a),
14214           x0 = r / 2,
14215           y0 = r * k,
14216           x1 = x0,
14217           y1 = r * k + r,
14218           x2 = -x1,
14219           y2 = y1;
14220       context.moveTo(x0, y0);
14221       context.lineTo(x1, y1);
14222       context.lineTo(x2, y2);
14223       context.lineTo(c * x0 - s * y0, s * x0 + c * y0);
14224       context.lineTo(c * x1 - s * y1, s * x1 + c * y1);
14225       context.lineTo(c * x2 - s * y2, s * x2 + c * y2);
14226       context.lineTo(c * x0 + s * y0, c * y0 - s * x0);
14227       context.lineTo(c * x1 + s * y1, c * y1 - s * x1);
14228       context.lineTo(c * x2 + s * y2, c * y2 - s * x2);
14229       context.closePath();
14230     }
14231   };
14232
14233   var symbols = [
14234     circle$2,
14235     cross$2,
14236     diamond,
14237     square,
14238     star,
14239     triangle,
14240     wye
14241   ];
14242
14243   function symbol() {
14244     var type = constant$a(circle$2),
14245         size = constant$a(64),
14246         context = null;
14247
14248     function symbol() {
14249       var buffer;
14250       if (!context) context = buffer = path();
14251       type.apply(this, arguments).draw(context, +size.apply(this, arguments));
14252       if (buffer) return context = null, buffer + "" || null;
14253     }
14254
14255     symbol.type = function(_) {
14256       return arguments.length ? (type = typeof _ === "function" ? _ : constant$a(_), symbol) : type;
14257     };
14258
14259     symbol.size = function(_) {
14260       return arguments.length ? (size = typeof _ === "function" ? _ : constant$a(+_), symbol) : size;
14261     };
14262
14263     symbol.context = function(_) {
14264       return arguments.length ? (context = _ == null ? null : _, symbol) : context;
14265     };
14266
14267     return symbol;
14268   }
14269
14270   function noop$2() {}
14271
14272   function point$2(that, x, y) {
14273     that._context.bezierCurveTo(
14274       (2 * that._x0 + that._x1) / 3,
14275       (2 * that._y0 + that._y1) / 3,
14276       (that._x0 + 2 * that._x1) / 3,
14277       (that._y0 + 2 * that._y1) / 3,
14278       (that._x0 + 4 * that._x1 + x) / 6,
14279       (that._y0 + 4 * that._y1 + y) / 6
14280     );
14281   }
14282
14283   function Basis(context) {
14284     this._context = context;
14285   }
14286
14287   Basis.prototype = {
14288     areaStart: function() {
14289       this._line = 0;
14290     },
14291     areaEnd: function() {
14292       this._line = NaN;
14293     },
14294     lineStart: function() {
14295       this._x0 = this._x1 =
14296       this._y0 = this._y1 = NaN;
14297       this._point = 0;
14298     },
14299     lineEnd: function() {
14300       switch (this._point) {
14301         case 3: point$2(this, this._x1, this._y1); // proceed
14302         case 2: this._context.lineTo(this._x1, this._y1); break;
14303       }
14304       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14305       this._line = 1 - this._line;
14306     },
14307     point: function(x, y) {
14308       x = +x, y = +y;
14309       switch (this._point) {
14310         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14311         case 1: this._point = 2; break;
14312         case 2: this._point = 3; this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); // proceed
14313         default: point$2(this, x, y); break;
14314       }
14315       this._x0 = this._x1, this._x1 = x;
14316       this._y0 = this._y1, this._y1 = y;
14317     }
14318   };
14319
14320   function basis$2(context) {
14321     return new Basis(context);
14322   }
14323
14324   function BasisClosed(context) {
14325     this._context = context;
14326   }
14327
14328   BasisClosed.prototype = {
14329     areaStart: noop$2,
14330     areaEnd: noop$2,
14331     lineStart: function() {
14332       this._x0 = this._x1 = this._x2 = this._x3 = this._x4 =
14333       this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN;
14334       this._point = 0;
14335     },
14336     lineEnd: function() {
14337       switch (this._point) {
14338         case 1: {
14339           this._context.moveTo(this._x2, this._y2);
14340           this._context.closePath();
14341           break;
14342         }
14343         case 2: {
14344           this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3);
14345           this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3);
14346           this._context.closePath();
14347           break;
14348         }
14349         case 3: {
14350           this.point(this._x2, this._y2);
14351           this.point(this._x3, this._y3);
14352           this.point(this._x4, this._y4);
14353           break;
14354         }
14355       }
14356     },
14357     point: function(x, y) {
14358       x = +x, y = +y;
14359       switch (this._point) {
14360         case 0: this._point = 1; this._x2 = x, this._y2 = y; break;
14361         case 1: this._point = 2; this._x3 = x, this._y3 = y; break;
14362         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;
14363         default: point$2(this, x, y); break;
14364       }
14365       this._x0 = this._x1, this._x1 = x;
14366       this._y0 = this._y1, this._y1 = y;
14367     }
14368   };
14369
14370   function basisClosed$1(context) {
14371     return new BasisClosed(context);
14372   }
14373
14374   function BasisOpen(context) {
14375     this._context = context;
14376   }
14377
14378   BasisOpen.prototype = {
14379     areaStart: function() {
14380       this._line = 0;
14381     },
14382     areaEnd: function() {
14383       this._line = NaN;
14384     },
14385     lineStart: function() {
14386       this._x0 = this._x1 =
14387       this._y0 = this._y1 = NaN;
14388       this._point = 0;
14389     },
14390     lineEnd: function() {
14391       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14392       this._line = 1 - this._line;
14393     },
14394     point: function(x, y) {
14395       x = +x, y = +y;
14396       switch (this._point) {
14397         case 0: this._point = 1; break;
14398         case 1: this._point = 2; break;
14399         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;
14400         case 3: this._point = 4; // proceed
14401         default: point$2(this, x, y); break;
14402       }
14403       this._x0 = this._x1, this._x1 = x;
14404       this._y0 = this._y1, this._y1 = y;
14405     }
14406   };
14407
14408   function basisOpen(context) {
14409     return new BasisOpen(context);
14410   }
14411
14412   function Bundle(context, beta) {
14413     this._basis = new Basis(context);
14414     this._beta = beta;
14415   }
14416
14417   Bundle.prototype = {
14418     lineStart: function() {
14419       this._x = [];
14420       this._y = [];
14421       this._basis.lineStart();
14422     },
14423     lineEnd: function() {
14424       var x = this._x,
14425           y = this._y,
14426           j = x.length - 1;
14427
14428       if (j > 0) {
14429         var x0 = x[0],
14430             y0 = y[0],
14431             dx = x[j] - x0,
14432             dy = y[j] - y0,
14433             i = -1,
14434             t;
14435
14436         while (++i <= j) {
14437           t = i / j;
14438           this._basis.point(
14439             this._beta * x[i] + (1 - this._beta) * (x0 + t * dx),
14440             this._beta * y[i] + (1 - this._beta) * (y0 + t * dy)
14441           );
14442         }
14443       }
14444
14445       this._x = this._y = null;
14446       this._basis.lineEnd();
14447     },
14448     point: function(x, y) {
14449       this._x.push(+x);
14450       this._y.push(+y);
14451     }
14452   };
14453
14454   var bundle = (function custom(beta) {
14455
14456     function bundle(context) {
14457       return beta === 1 ? new Basis(context) : new Bundle(context, beta);
14458     }
14459
14460     bundle.beta = function(beta) {
14461       return custom(+beta);
14462     };
14463
14464     return bundle;
14465   })(0.85);
14466
14467   function point$3(that, x, y) {
14468     that._context.bezierCurveTo(
14469       that._x1 + that._k * (that._x2 - that._x0),
14470       that._y1 + that._k * (that._y2 - that._y0),
14471       that._x2 + that._k * (that._x1 - x),
14472       that._y2 + that._k * (that._y1 - y),
14473       that._x2,
14474       that._y2
14475     );
14476   }
14477
14478   function Cardinal(context, tension) {
14479     this._context = context;
14480     this._k = (1 - tension) / 6;
14481   }
14482
14483   Cardinal.prototype = {
14484     areaStart: function() {
14485       this._line = 0;
14486     },
14487     areaEnd: function() {
14488       this._line = NaN;
14489     },
14490     lineStart: function() {
14491       this._x0 = this._x1 = this._x2 =
14492       this._y0 = this._y1 = this._y2 = NaN;
14493       this._point = 0;
14494     },
14495     lineEnd: function() {
14496       switch (this._point) {
14497         case 2: this._context.lineTo(this._x2, this._y2); break;
14498         case 3: point$3(this, this._x1, this._y1); break;
14499       }
14500       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14501       this._line = 1 - this._line;
14502     },
14503     point: function(x, y) {
14504       x = +x, y = +y;
14505       switch (this._point) {
14506         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14507         case 1: this._point = 2; this._x1 = x, this._y1 = y; break;
14508         case 2: this._point = 3; // proceed
14509         default: point$3(this, x, y); break;
14510       }
14511       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14512       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14513     }
14514   };
14515
14516   var cardinal = (function custom(tension) {
14517
14518     function cardinal(context) {
14519       return new Cardinal(context, tension);
14520     }
14521
14522     cardinal.tension = function(tension) {
14523       return custom(+tension);
14524     };
14525
14526     return cardinal;
14527   })(0);
14528
14529   function CardinalClosed(context, tension) {
14530     this._context = context;
14531     this._k = (1 - tension) / 6;
14532   }
14533
14534   CardinalClosed.prototype = {
14535     areaStart: noop$2,
14536     areaEnd: noop$2,
14537     lineStart: function() {
14538       this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14539       this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14540       this._point = 0;
14541     },
14542     lineEnd: function() {
14543       switch (this._point) {
14544         case 1: {
14545           this._context.moveTo(this._x3, this._y3);
14546           this._context.closePath();
14547           break;
14548         }
14549         case 2: {
14550           this._context.lineTo(this._x3, this._y3);
14551           this._context.closePath();
14552           break;
14553         }
14554         case 3: {
14555           this.point(this._x3, this._y3);
14556           this.point(this._x4, this._y4);
14557           this.point(this._x5, this._y5);
14558           break;
14559         }
14560       }
14561     },
14562     point: function(x, y) {
14563       x = +x, y = +y;
14564       switch (this._point) {
14565         case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14566         case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14567         case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14568         default: point$3(this, x, y); break;
14569       }
14570       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14571       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14572     }
14573   };
14574
14575   var cardinalClosed = (function custom(tension) {
14576
14577     function cardinal$$1(context) {
14578       return new CardinalClosed(context, tension);
14579     }
14580
14581     cardinal$$1.tension = function(tension) {
14582       return custom(+tension);
14583     };
14584
14585     return cardinal$$1;
14586   })(0);
14587
14588   function CardinalOpen(context, tension) {
14589     this._context = context;
14590     this._k = (1 - tension) / 6;
14591   }
14592
14593   CardinalOpen.prototype = {
14594     areaStart: function() {
14595       this._line = 0;
14596     },
14597     areaEnd: function() {
14598       this._line = NaN;
14599     },
14600     lineStart: function() {
14601       this._x0 = this._x1 = this._x2 =
14602       this._y0 = this._y1 = this._y2 = NaN;
14603       this._point = 0;
14604     },
14605     lineEnd: function() {
14606       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14607       this._line = 1 - this._line;
14608     },
14609     point: function(x, y) {
14610       x = +x, y = +y;
14611       switch (this._point) {
14612         case 0: this._point = 1; break;
14613         case 1: this._point = 2; break;
14614         case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14615         case 3: this._point = 4; // proceed
14616         default: point$3(this, x, y); break;
14617       }
14618       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14619       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14620     }
14621   };
14622
14623   var cardinalOpen = (function custom(tension) {
14624
14625     function cardinal$$1(context) {
14626       return new CardinalOpen(context, tension);
14627     }
14628
14629     cardinal$$1.tension = function(tension) {
14630       return custom(+tension);
14631     };
14632
14633     return cardinal$$1;
14634   })(0);
14635
14636   function point$4(that, x, y) {
14637     var x1 = that._x1,
14638         y1 = that._y1,
14639         x2 = that._x2,
14640         y2 = that._y2;
14641
14642     if (that._l01_a > epsilon$3) {
14643       var a = 2 * that._l01_2a + 3 * that._l01_a * that._l12_a + that._l12_2a,
14644           n = 3 * that._l01_a * (that._l01_a + that._l12_a);
14645       x1 = (x1 * a - that._x0 * that._l12_2a + that._x2 * that._l01_2a) / n;
14646       y1 = (y1 * a - that._y0 * that._l12_2a + that._y2 * that._l01_2a) / n;
14647     }
14648
14649     if (that._l23_a > epsilon$3) {
14650       var b = 2 * that._l23_2a + 3 * that._l23_a * that._l12_a + that._l12_2a,
14651           m = 3 * that._l23_a * (that._l23_a + that._l12_a);
14652       x2 = (x2 * b + that._x1 * that._l23_2a - x * that._l12_2a) / m;
14653       y2 = (y2 * b + that._y1 * that._l23_2a - y * that._l12_2a) / m;
14654     }
14655
14656     that._context.bezierCurveTo(x1, y1, x2, y2, that._x2, that._y2);
14657   }
14658
14659   function CatmullRom(context, alpha) {
14660     this._context = context;
14661     this._alpha = alpha;
14662   }
14663
14664   CatmullRom.prototype = {
14665     areaStart: function() {
14666       this._line = 0;
14667     },
14668     areaEnd: function() {
14669       this._line = NaN;
14670     },
14671     lineStart: function() {
14672       this._x0 = this._x1 = this._x2 =
14673       this._y0 = this._y1 = this._y2 = NaN;
14674       this._l01_a = this._l12_a = this._l23_a =
14675       this._l01_2a = this._l12_2a = this._l23_2a =
14676       this._point = 0;
14677     },
14678     lineEnd: function() {
14679       switch (this._point) {
14680         case 2: this._context.lineTo(this._x2, this._y2); break;
14681         case 3: this.point(this._x2, this._y2); break;
14682       }
14683       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14684       this._line = 1 - this._line;
14685     },
14686     point: function(x, y) {
14687       x = +x, y = +y;
14688
14689       if (this._point) {
14690         var x23 = this._x2 - x,
14691             y23 = this._y2 - y;
14692         this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14693       }
14694
14695       switch (this._point) {
14696         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14697         case 1: this._point = 2; break;
14698         case 2: this._point = 3; // proceed
14699         default: point$4(this, x, y); break;
14700       }
14701
14702       this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14703       this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14704       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14705       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14706     }
14707   };
14708
14709   var catmullRom = (function custom(alpha) {
14710
14711     function catmullRom(context) {
14712       return alpha ? new CatmullRom(context, alpha) : new Cardinal(context, 0);
14713     }
14714
14715     catmullRom.alpha = function(alpha) {
14716       return custom(+alpha);
14717     };
14718
14719     return catmullRom;
14720   })(0.5);
14721
14722   function CatmullRomClosed(context, alpha) {
14723     this._context = context;
14724     this._alpha = alpha;
14725   }
14726
14727   CatmullRomClosed.prototype = {
14728     areaStart: noop$2,
14729     areaEnd: noop$2,
14730     lineStart: function() {
14731       this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 =
14732       this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN;
14733       this._l01_a = this._l12_a = this._l23_a =
14734       this._l01_2a = this._l12_2a = this._l23_2a =
14735       this._point = 0;
14736     },
14737     lineEnd: function() {
14738       switch (this._point) {
14739         case 1: {
14740           this._context.moveTo(this._x3, this._y3);
14741           this._context.closePath();
14742           break;
14743         }
14744         case 2: {
14745           this._context.lineTo(this._x3, this._y3);
14746           this._context.closePath();
14747           break;
14748         }
14749         case 3: {
14750           this.point(this._x3, this._y3);
14751           this.point(this._x4, this._y4);
14752           this.point(this._x5, this._y5);
14753           break;
14754         }
14755       }
14756     },
14757     point: function(x, y) {
14758       x = +x, y = +y;
14759
14760       if (this._point) {
14761         var x23 = this._x2 - x,
14762             y23 = this._y2 - y;
14763         this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14764       }
14765
14766       switch (this._point) {
14767         case 0: this._point = 1; this._x3 = x, this._y3 = y; break;
14768         case 1: this._point = 2; this._context.moveTo(this._x4 = x, this._y4 = y); break;
14769         case 2: this._point = 3; this._x5 = x, this._y5 = y; break;
14770         default: point$4(this, x, y); break;
14771       }
14772
14773       this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14774       this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14775       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14776       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14777     }
14778   };
14779
14780   var catmullRomClosed = (function custom(alpha) {
14781
14782     function catmullRom$$1(context) {
14783       return alpha ? new CatmullRomClosed(context, alpha) : new CardinalClosed(context, 0);
14784     }
14785
14786     catmullRom$$1.alpha = function(alpha) {
14787       return custom(+alpha);
14788     };
14789
14790     return catmullRom$$1;
14791   })(0.5);
14792
14793   function CatmullRomOpen(context, alpha) {
14794     this._context = context;
14795     this._alpha = alpha;
14796   }
14797
14798   CatmullRomOpen.prototype = {
14799     areaStart: function() {
14800       this._line = 0;
14801     },
14802     areaEnd: function() {
14803       this._line = NaN;
14804     },
14805     lineStart: function() {
14806       this._x0 = this._x1 = this._x2 =
14807       this._y0 = this._y1 = this._y2 = NaN;
14808       this._l01_a = this._l12_a = this._l23_a =
14809       this._l01_2a = this._l12_2a = this._l23_2a =
14810       this._point = 0;
14811     },
14812     lineEnd: function() {
14813       if (this._line || (this._line !== 0 && this._point === 3)) this._context.closePath();
14814       this._line = 1 - this._line;
14815     },
14816     point: function(x, y) {
14817       x = +x, y = +y;
14818
14819       if (this._point) {
14820         var x23 = this._x2 - x,
14821             y23 = this._y2 - y;
14822         this._l23_a = Math.sqrt(this._l23_2a = Math.pow(x23 * x23 + y23 * y23, this._alpha));
14823       }
14824
14825       switch (this._point) {
14826         case 0: this._point = 1; break;
14827         case 1: this._point = 2; break;
14828         case 2: this._point = 3; this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); break;
14829         case 3: this._point = 4; // proceed
14830         default: point$4(this, x, y); break;
14831       }
14832
14833       this._l01_a = this._l12_a, this._l12_a = this._l23_a;
14834       this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a;
14835       this._x0 = this._x1, this._x1 = this._x2, this._x2 = x;
14836       this._y0 = this._y1, this._y1 = this._y2, this._y2 = y;
14837     }
14838   };
14839
14840   var catmullRomOpen = (function custom(alpha) {
14841
14842     function catmullRom$$1(context) {
14843       return alpha ? new CatmullRomOpen(context, alpha) : new CardinalOpen(context, 0);
14844     }
14845
14846     catmullRom$$1.alpha = function(alpha) {
14847       return custom(+alpha);
14848     };
14849
14850     return catmullRom$$1;
14851   })(0.5);
14852
14853   function LinearClosed(context) {
14854     this._context = context;
14855   }
14856
14857   LinearClosed.prototype = {
14858     areaStart: noop$2,
14859     areaEnd: noop$2,
14860     lineStart: function() {
14861       this._point = 0;
14862     },
14863     lineEnd: function() {
14864       if (this._point) this._context.closePath();
14865     },
14866     point: function(x, y) {
14867       x = +x, y = +y;
14868       if (this._point) this._context.lineTo(x, y);
14869       else this._point = 1, this._context.moveTo(x, y);
14870     }
14871   };
14872
14873   function linearClosed(context) {
14874     return new LinearClosed(context);
14875   }
14876
14877   function sign$1(x) {
14878     return x < 0 ? -1 : 1;
14879   }
14880
14881   // Calculate the slopes of the tangents (Hermite-type interpolation) based on
14882   // the following paper: Steffen, M. 1990. A Simple Method for Monotonic
14883   // Interpolation in One Dimension. Astronomy and Astrophysics, Vol. 239, NO.
14884   // NOV(II), P. 443, 1990.
14885   function slope3(that, x2, y2) {
14886     var h0 = that._x1 - that._x0,
14887         h1 = x2 - that._x1,
14888         s0 = (that._y1 - that._y0) / (h0 || h1 < 0 && -0),
14889         s1 = (y2 - that._y1) / (h1 || h0 < 0 && -0),
14890         p = (s0 * h1 + s1 * h0) / (h0 + h1);
14891     return (sign$1(s0) + sign$1(s1)) * Math.min(Math.abs(s0), Math.abs(s1), 0.5 * Math.abs(p)) || 0;
14892   }
14893
14894   // Calculate a one-sided slope.
14895   function slope2(that, t) {
14896     var h = that._x1 - that._x0;
14897     return h ? (3 * (that._y1 - that._y0) / h - t) / 2 : t;
14898   }
14899
14900   // According to https://en.wikipedia.org/wiki/Cubic_Hermite_spline#Representations
14901   // "you can express cubic Hermite interpolation in terms of cubic Bézier curves
14902   // with respect to the four values p0, p0 + m0 / 3, p1 - m1 / 3, p1".
14903   function point$5(that, t0, t1) {
14904     var x0 = that._x0,
14905         y0 = that._y0,
14906         x1 = that._x1,
14907         y1 = that._y1,
14908         dx = (x1 - x0) / 3;
14909     that._context.bezierCurveTo(x0 + dx, y0 + dx * t0, x1 - dx, y1 - dx * t1, x1, y1);
14910   }
14911
14912   function MonotoneX(context) {
14913     this._context = context;
14914   }
14915
14916   MonotoneX.prototype = {
14917     areaStart: function() {
14918       this._line = 0;
14919     },
14920     areaEnd: function() {
14921       this._line = NaN;
14922     },
14923     lineStart: function() {
14924       this._x0 = this._x1 =
14925       this._y0 = this._y1 =
14926       this._t0 = NaN;
14927       this._point = 0;
14928     },
14929     lineEnd: function() {
14930       switch (this._point) {
14931         case 2: this._context.lineTo(this._x1, this._y1); break;
14932         case 3: point$5(this, this._t0, slope2(this, this._t0)); break;
14933       }
14934       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
14935       this._line = 1 - this._line;
14936     },
14937     point: function(x, y) {
14938       var t1 = NaN;
14939
14940       x = +x, y = +y;
14941       if (x === this._x1 && y === this._y1) return; // Ignore coincident points.
14942       switch (this._point) {
14943         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
14944         case 1: this._point = 2; break;
14945         case 2: this._point = 3; point$5(this, slope2(this, t1 = slope3(this, x, y)), t1); break;
14946         default: point$5(this, this._t0, t1 = slope3(this, x, y)); break;
14947       }
14948
14949       this._x0 = this._x1, this._x1 = x;
14950       this._y0 = this._y1, this._y1 = y;
14951       this._t0 = t1;
14952     }
14953   };
14954
14955   function MonotoneY(context) {
14956     this._context = new ReflectContext(context);
14957   }
14958
14959   (MonotoneY.prototype = Object.create(MonotoneX.prototype)).point = function(x, y) {
14960     MonotoneX.prototype.point.call(this, y, x);
14961   };
14962
14963   function ReflectContext(context) {
14964     this._context = context;
14965   }
14966
14967   ReflectContext.prototype = {
14968     moveTo: function(x, y) { this._context.moveTo(y, x); },
14969     closePath: function() { this._context.closePath(); },
14970     lineTo: function(x, y) { this._context.lineTo(y, x); },
14971     bezierCurveTo: function(x1, y1, x2, y2, x, y) { this._context.bezierCurveTo(y1, x1, y2, x2, y, x); }
14972   };
14973
14974   function monotoneX(context) {
14975     return new MonotoneX(context);
14976   }
14977
14978   function monotoneY(context) {
14979     return new MonotoneY(context);
14980   }
14981
14982   function Natural(context) {
14983     this._context = context;
14984   }
14985
14986   Natural.prototype = {
14987     areaStart: function() {
14988       this._line = 0;
14989     },
14990     areaEnd: function() {
14991       this._line = NaN;
14992     },
14993     lineStart: function() {
14994       this._x = [];
14995       this._y = [];
14996     },
14997     lineEnd: function() {
14998       var x = this._x,
14999           y = this._y,
15000           n = x.length;
15001
15002       if (n) {
15003         this._line ? this._context.lineTo(x[0], y[0]) : this._context.moveTo(x[0], y[0]);
15004         if (n === 2) {
15005           this._context.lineTo(x[1], y[1]);
15006         } else {
15007           var px = controlPoints(x),
15008               py = controlPoints(y);
15009           for (var i0 = 0, i1 = 1; i1 < n; ++i0, ++i1) {
15010             this._context.bezierCurveTo(px[0][i0], py[0][i0], px[1][i0], py[1][i0], x[i1], y[i1]);
15011           }
15012         }
15013       }
15014
15015       if (this._line || (this._line !== 0 && n === 1)) this._context.closePath();
15016       this._line = 1 - this._line;
15017       this._x = this._y = null;
15018     },
15019     point: function(x, y) {
15020       this._x.push(+x);
15021       this._y.push(+y);
15022     }
15023   };
15024
15025   // See https://www.particleincell.com/2012/bezier-splines/ for derivation.
15026   function controlPoints(x) {
15027     var i,
15028         n = x.length - 1,
15029         m,
15030         a = new Array(n),
15031         b = new Array(n),
15032         r = new Array(n);
15033     a[0] = 0, b[0] = 2, r[0] = x[0] + 2 * x[1];
15034     for (i = 1; i < n - 1; ++i) a[i] = 1, b[i] = 4, r[i] = 4 * x[i] + 2 * x[i + 1];
15035     a[n - 1] = 2, b[n - 1] = 7, r[n - 1] = 8 * x[n - 1] + x[n];
15036     for (i = 1; i < n; ++i) m = a[i] / b[i - 1], b[i] -= m, r[i] -= m * r[i - 1];
15037     a[n - 1] = r[n - 1] / b[n - 1];
15038     for (i = n - 2; i >= 0; --i) a[i] = (r[i] - a[i + 1]) / b[i];
15039     b[n - 1] = (x[n] + a[n - 1]) / 2;
15040     for (i = 0; i < n - 1; ++i) b[i] = 2 * x[i + 1] - a[i + 1];
15041     return [a, b];
15042   }
15043
15044   function natural(context) {
15045     return new Natural(context);
15046   }
15047
15048   function Step(context, t) {
15049     this._context = context;
15050     this._t = t;
15051   }
15052
15053   Step.prototype = {
15054     areaStart: function() {
15055       this._line = 0;
15056     },
15057     areaEnd: function() {
15058       this._line = NaN;
15059     },
15060     lineStart: function() {
15061       this._x = this._y = NaN;
15062       this._point = 0;
15063     },
15064     lineEnd: function() {
15065       if (0 < this._t && this._t < 1 && this._point === 2) this._context.lineTo(this._x, this._y);
15066       if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();
15067       if (this._line >= 0) this._t = 1 - this._t, this._line = 1 - this._line;
15068     },
15069     point: function(x, y) {
15070       x = +x, y = +y;
15071       switch (this._point) {
15072         case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;
15073         case 1: this._point = 2; // proceed
15074         default: {
15075           if (this._t <= 0) {
15076             this._context.lineTo(this._x, y);
15077             this._context.lineTo(x, y);
15078           } else {
15079             var x1 = this._x * (1 - this._t) + x * this._t;
15080             this._context.lineTo(x1, this._y);
15081             this._context.lineTo(x1, y);
15082           }
15083           break;
15084         }
15085       }
15086       this._x = x, this._y = y;
15087     }
15088   };
15089
15090   function step(context) {
15091     return new Step(context, 0.5);
15092   }
15093
15094   function stepBefore(context) {
15095     return new Step(context, 0);
15096   }
15097
15098   function stepAfter(context) {
15099     return new Step(context, 1);
15100   }
15101
15102   function none$1(series, order) {
15103     if (!((n = series.length) > 1)) return;
15104     for (var i = 1, j, s0, s1 = series[order[0]], n, m = s1.length; i < n; ++i) {
15105       s0 = s1, s1 = series[order[i]];
15106       for (j = 0; j < m; ++j) {
15107         s1[j][1] += s1[j][0] = isNaN(s0[j][1]) ? s0[j][0] : s0[j][1];
15108       }
15109     }
15110   }
15111
15112   function none$2(series) {
15113     var n = series.length, o = new Array(n);
15114     while (--n >= 0) o[n] = n;
15115     return o;
15116   }
15117
15118   function stackValue(d, key) {
15119     return d[key];
15120   }
15121
15122   function stack() {
15123     var keys = constant$a([]),
15124         order = none$2,
15125         offset = none$1,
15126         value = stackValue;
15127
15128     function stack(data) {
15129       var kz = keys.apply(this, arguments),
15130           i,
15131           m = data.length,
15132           n = kz.length,
15133           sz = new Array(n),
15134           oz;
15135
15136       for (i = 0; i < n; ++i) {
15137         for (var ki = kz[i], si = sz[i] = new Array(m), j = 0, sij; j < m; ++j) {
15138           si[j] = sij = [0, +value(data[j], ki, j, data)];
15139           sij.data = data[j];
15140         }
15141         si.key = ki;
15142       }
15143
15144       for (i = 0, oz = order(sz); i < n; ++i) {
15145         sz[oz[i]].index = i;
15146       }
15147
15148       offset(sz, oz);
15149       return sz;
15150     }
15151
15152     stack.keys = function(_) {
15153       return arguments.length ? (keys = typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : keys;
15154     };
15155
15156     stack.value = function(_) {
15157       return arguments.length ? (value = typeof _ === "function" ? _ : constant$a(+_), stack) : value;
15158     };
15159
15160     stack.order = function(_) {
15161       return arguments.length ? (order = _ == null ? none$2 : typeof _ === "function" ? _ : constant$a(slice$6.call(_)), stack) : order;
15162     };
15163
15164     stack.offset = function(_) {
15165       return arguments.length ? (offset = _ == null ? none$1 : _, stack) : offset;
15166     };
15167
15168     return stack;
15169   }
15170
15171   function expand(series, order) {
15172     if (!((n = series.length) > 0)) return;
15173     for (var i, n, j = 0, m = series[0].length, y; j < m; ++j) {
15174       for (y = i = 0; i < n; ++i) y += series[i][j][1] || 0;
15175       if (y) for (i = 0; i < n; ++i) series[i][j][1] /= y;
15176     }
15177     none$1(series, order);
15178   }
15179
15180   function diverging(series, order) {
15181     if (!((n = series.length) > 1)) return;
15182     for (var i, j = 0, d, dy, yp, yn, n, m = series[order[0]].length; j < m; ++j) {
15183       for (yp = yn = 0, i = 0; i < n; ++i) {
15184         if ((dy = (d = series[order[i]][j])[1] - d[0]) >= 0) {
15185           d[0] = yp, d[1] = yp += dy;
15186         } else if (dy < 0) {
15187           d[1] = yn, d[0] = yn += dy;
15188         } else {
15189           d[0] = yp;
15190         }
15191       }
15192     }
15193   }
15194
15195   function silhouette(series, order) {
15196     if (!((n = series.length) > 0)) return;
15197     for (var j = 0, s0 = series[order[0]], n, m = s0.length; j < m; ++j) {
15198       for (var i = 0, y = 0; i < n; ++i) y += series[i][j][1] || 0;
15199       s0[j][1] += s0[j][0] = -y / 2;
15200     }
15201     none$1(series, order);
15202   }
15203
15204   function wiggle(series, order) {
15205     if (!((n = series.length) > 0) || !((m = (s0 = series[order[0]]).length) > 0)) return;
15206     for (var y = 0, j = 1, s0, m, n; j < m; ++j) {
15207       for (var i = 0, s1 = 0, s2 = 0; i < n; ++i) {
15208         var si = series[order[i]],
15209             sij0 = si[j][1] || 0,
15210             sij1 = si[j - 1][1] || 0,
15211             s3 = (sij0 - sij1) / 2;
15212         for (var k = 0; k < i; ++k) {
15213           var sk = series[order[k]],
15214               skj0 = sk[j][1] || 0,
15215               skj1 = sk[j - 1][1] || 0;
15216           s3 += skj0 - skj1;
15217         }
15218         s1 += sij0, s2 += s3 * sij0;
15219       }
15220       s0[j - 1][1] += s0[j - 1][0] = y;
15221       if (s1) y -= s2 / s1;
15222     }
15223     s0[j - 1][1] += s0[j - 1][0] = y;
15224     none$1(series, order);
15225   }
15226
15227   function ascending$2(series) {
15228     var sums = series.map(sum$2);
15229     return none$2(series).sort(function(a, b) { return sums[a] - sums[b]; });
15230   }
15231
15232   function sum$2(series) {
15233     var s = 0, i = -1, n = series.length, v;
15234     while (++i < n) if (v = +series[i][1]) s += v;
15235     return s;
15236   }
15237
15238   function descending$1(series) {
15239     return ascending$2(series).reverse();
15240   }
15241
15242   function insideOut(series) {
15243     var n = series.length,
15244         i,
15245         j,
15246         sums = series.map(sum$2),
15247         order = none$2(series).sort(function(a, b) { return sums[b] - sums[a]; }),
15248         top = 0,
15249         bottom = 0,
15250         tops = [],
15251         bottoms = [];
15252
15253     for (i = 0; i < n; ++i) {
15254       j = order[i];
15255       if (top < bottom) {
15256         top += sums[j];
15257         tops.push(j);
15258       } else {
15259         bottom += sums[j];
15260         bottoms.push(j);
15261       }
15262     }
15263
15264     return bottoms.reverse().concat(tops);
15265   }
15266
15267   function reverse(series) {
15268     return none$2(series).reverse();
15269   }
15270
15271   function constant$b(x) {
15272     return function() {
15273       return x;
15274     };
15275   }
15276
15277   function x$4(d) {
15278     return d[0];
15279   }
15280
15281   function y$4(d) {
15282     return d[1];
15283   }
15284
15285   function RedBlackTree() {
15286     this._ = null; // root node
15287   }
15288
15289   function RedBlackNode(node) {
15290     node.U = // parent node
15291     node.C = // color - true for red, false for black
15292     node.L = // left node
15293     node.R = // right node
15294     node.P = // previous node
15295     node.N = null; // next node
15296   }
15297
15298   RedBlackTree.prototype = {
15299     constructor: RedBlackTree,
15300
15301     insert: function(after, node) {
15302       var parent, grandpa, uncle;
15303
15304       if (after) {
15305         node.P = after;
15306         node.N = after.N;
15307         if (after.N) after.N.P = node;
15308         after.N = node;
15309         if (after.R) {
15310           after = after.R;
15311           while (after.L) after = after.L;
15312           after.L = node;
15313         } else {
15314           after.R = node;
15315         }
15316         parent = after;
15317       } else if (this._) {
15318         after = RedBlackFirst(this._);
15319         node.P = null;
15320         node.N = after;
15321         after.P = after.L = node;
15322         parent = after;
15323       } else {
15324         node.P = node.N = null;
15325         this._ = node;
15326         parent = null;
15327       }
15328       node.L = node.R = null;
15329       node.U = parent;
15330       node.C = true;
15331
15332       after = node;
15333       while (parent && parent.C) {
15334         grandpa = parent.U;
15335         if (parent === grandpa.L) {
15336           uncle = grandpa.R;
15337           if (uncle && uncle.C) {
15338             parent.C = uncle.C = false;
15339             grandpa.C = true;
15340             after = grandpa;
15341           } else {
15342             if (after === parent.R) {
15343               RedBlackRotateLeft(this, parent);
15344               after = parent;
15345               parent = after.U;
15346             }
15347             parent.C = false;
15348             grandpa.C = true;
15349             RedBlackRotateRight(this, grandpa);
15350           }
15351         } else {
15352           uncle = grandpa.L;
15353           if (uncle && uncle.C) {
15354             parent.C = uncle.C = false;
15355             grandpa.C = true;
15356             after = grandpa;
15357           } else {
15358             if (after === parent.L) {
15359               RedBlackRotateRight(this, parent);
15360               after = parent;
15361               parent = after.U;
15362             }
15363             parent.C = false;
15364             grandpa.C = true;
15365             RedBlackRotateLeft(this, grandpa);
15366           }
15367         }
15368         parent = after.U;
15369       }
15370       this._.C = false;
15371     },
15372
15373     remove: function(node) {
15374       if (node.N) node.N.P = node.P;
15375       if (node.P) node.P.N = node.N;
15376       node.N = node.P = null;
15377
15378       var parent = node.U,
15379           sibling,
15380           left = node.L,
15381           right = node.R,
15382           next,
15383           red;
15384
15385       if (!left) next = right;
15386       else if (!right) next = left;
15387       else next = RedBlackFirst(right);
15388
15389       if (parent) {
15390         if (parent.L === node) parent.L = next;
15391         else parent.R = next;
15392       } else {
15393         this._ = next;
15394       }
15395
15396       if (left && right) {
15397         red = next.C;
15398         next.C = node.C;
15399         next.L = left;
15400         left.U = next;
15401         if (next !== right) {
15402           parent = next.U;
15403           next.U = node.U;
15404           node = next.R;
15405           parent.L = node;
15406           next.R = right;
15407           right.U = next;
15408         } else {
15409           next.U = parent;
15410           parent = next;
15411           node = next.R;
15412         }
15413       } else {
15414         red = node.C;
15415         node = next;
15416       }
15417
15418       if (node) node.U = parent;
15419       if (red) return;
15420       if (node && node.C) { node.C = false; return; }
15421
15422       do {
15423         if (node === this._) break;
15424         if (node === parent.L) {
15425           sibling = parent.R;
15426           if (sibling.C) {
15427             sibling.C = false;
15428             parent.C = true;
15429             RedBlackRotateLeft(this, parent);
15430             sibling = parent.R;
15431           }
15432           if ((sibling.L && sibling.L.C)
15433               || (sibling.R && sibling.R.C)) {
15434             if (!sibling.R || !sibling.R.C) {
15435               sibling.L.C = false;
15436               sibling.C = true;
15437               RedBlackRotateRight(this, sibling);
15438               sibling = parent.R;
15439             }
15440             sibling.C = parent.C;
15441             parent.C = sibling.R.C = false;
15442             RedBlackRotateLeft(this, parent);
15443             node = this._;
15444             break;
15445           }
15446         } else {
15447           sibling = parent.L;
15448           if (sibling.C) {
15449             sibling.C = false;
15450             parent.C = true;
15451             RedBlackRotateRight(this, parent);
15452             sibling = parent.L;
15453           }
15454           if ((sibling.L && sibling.L.C)
15455             || (sibling.R && sibling.R.C)) {
15456             if (!sibling.L || !sibling.L.C) {
15457               sibling.R.C = false;
15458               sibling.C = true;
15459               RedBlackRotateLeft(this, sibling);
15460               sibling = parent.L;
15461             }
15462             sibling.C = parent.C;
15463             parent.C = sibling.L.C = false;
15464             RedBlackRotateRight(this, parent);
15465             node = this._;
15466             break;
15467           }
15468         }
15469         sibling.C = true;
15470         node = parent;
15471         parent = parent.U;
15472       } while (!node.C);
15473
15474       if (node) node.C = false;
15475     }
15476   };
15477
15478   function RedBlackRotateLeft(tree, node) {
15479     var p = node,
15480         q = node.R,
15481         parent = p.U;
15482
15483     if (parent) {
15484       if (parent.L === p) parent.L = q;
15485       else parent.R = q;
15486     } else {
15487       tree._ = q;
15488     }
15489
15490     q.U = parent;
15491     p.U = q;
15492     p.R = q.L;
15493     if (p.R) p.R.U = p;
15494     q.L = p;
15495   }
15496
15497   function RedBlackRotateRight(tree, node) {
15498     var p = node,
15499         q = node.L,
15500         parent = p.U;
15501
15502     if (parent) {
15503       if (parent.L === p) parent.L = q;
15504       else parent.R = q;
15505     } else {
15506       tree._ = q;
15507     }
15508
15509     q.U = parent;
15510     p.U = q;
15511     p.L = q.R;
15512     if (p.L) p.L.U = p;
15513     q.R = p;
15514   }
15515
15516   function RedBlackFirst(node) {
15517     while (node.L) node = node.L;
15518     return node;
15519   }
15520
15521   function createEdge(left, right, v0, v1) {
15522     var edge = [null, null],
15523         index = edges.push(edge) - 1;
15524     edge.left = left;
15525     edge.right = right;
15526     if (v0) setEdgeEnd(edge, left, right, v0);
15527     if (v1) setEdgeEnd(edge, right, left, v1);
15528     cells[left.index].halfedges.push(index);
15529     cells[right.index].halfedges.push(index);
15530     return edge;
15531   }
15532
15533   function createBorderEdge(left, v0, v1) {
15534     var edge = [v0, v1];
15535     edge.left = left;
15536     return edge;
15537   }
15538
15539   function setEdgeEnd(edge, left, right, vertex) {
15540     if (!edge[0] && !edge[1]) {
15541       edge[0] = vertex;
15542       edge.left = left;
15543       edge.right = right;
15544     } else if (edge.left === right) {
15545       edge[1] = vertex;
15546     } else {
15547       edge[0] = vertex;
15548     }
15549   }
15550
15551   // Liang–Barsky line clipping.
15552   function clipEdge(edge, x0, y0, x1, y1) {
15553     var a = edge[0],
15554         b = edge[1],
15555         ax = a[0],
15556         ay = a[1],
15557         bx = b[0],
15558         by = b[1],
15559         t0 = 0,
15560         t1 = 1,
15561         dx = bx - ax,
15562         dy = by - ay,
15563         r;
15564
15565     r = x0 - ax;
15566     if (!dx && r > 0) return;
15567     r /= dx;
15568     if (dx < 0) {
15569       if (r < t0) return;
15570       if (r < t1) t1 = r;
15571     } else if (dx > 0) {
15572       if (r > t1) return;
15573       if (r > t0) t0 = r;
15574     }
15575
15576     r = x1 - ax;
15577     if (!dx && r < 0) return;
15578     r /= dx;
15579     if (dx < 0) {
15580       if (r > t1) return;
15581       if (r > t0) t0 = r;
15582     } else if (dx > 0) {
15583       if (r < t0) return;
15584       if (r < t1) t1 = r;
15585     }
15586
15587     r = y0 - ay;
15588     if (!dy && r > 0) return;
15589     r /= dy;
15590     if (dy < 0) {
15591       if (r < t0) return;
15592       if (r < t1) t1 = r;
15593     } else if (dy > 0) {
15594       if (r > t1) return;
15595       if (r > t0) t0 = r;
15596     }
15597
15598     r = y1 - ay;
15599     if (!dy && r < 0) return;
15600     r /= dy;
15601     if (dy < 0) {
15602       if (r > t1) return;
15603       if (r > t0) t0 = r;
15604     } else if (dy > 0) {
15605       if (r < t0) return;
15606       if (r < t1) t1 = r;
15607     }
15608
15609     if (!(t0 > 0) && !(t1 < 1)) return true; // TODO Better check?
15610
15611     if (t0 > 0) edge[0] = [ax + t0 * dx, ay + t0 * dy];
15612     if (t1 < 1) edge[1] = [ax + t1 * dx, ay + t1 * dy];
15613     return true;
15614   }
15615
15616   function connectEdge(edge, x0, y0, x1, y1) {
15617     var v1 = edge[1];
15618     if (v1) return true;
15619
15620     var v0 = edge[0],
15621         left = edge.left,
15622         right = edge.right,
15623         lx = left[0],
15624         ly = left[1],
15625         rx = right[0],
15626         ry = right[1],
15627         fx = (lx + rx) / 2,
15628         fy = (ly + ry) / 2,
15629         fm,
15630         fb;
15631
15632     if (ry === ly) {
15633       if (fx < x0 || fx >= x1) return;
15634       if (lx > rx) {
15635         if (!v0) v0 = [fx, y0];
15636         else if (v0[1] >= y1) return;
15637         v1 = [fx, y1];
15638       } else {
15639         if (!v0) v0 = [fx, y1];
15640         else if (v0[1] < y0) return;
15641         v1 = [fx, y0];
15642       }
15643     } else {
15644       fm = (lx - rx) / (ry - ly);
15645       fb = fy - fm * fx;
15646       if (fm < -1 || fm > 1) {
15647         if (lx > rx) {
15648           if (!v0) v0 = [(y0 - fb) / fm, y0];
15649           else if (v0[1] >= y1) return;
15650           v1 = [(y1 - fb) / fm, y1];
15651         } else {
15652           if (!v0) v0 = [(y1 - fb) / fm, y1];
15653           else if (v0[1] < y0) return;
15654           v1 = [(y0 - fb) / fm, y0];
15655         }
15656       } else {
15657         if (ly < ry) {
15658           if (!v0) v0 = [x0, fm * x0 + fb];
15659           else if (v0[0] >= x1) return;
15660           v1 = [x1, fm * x1 + fb];
15661         } else {
15662           if (!v0) v0 = [x1, fm * x1 + fb];
15663           else if (v0[0] < x0) return;
15664           v1 = [x0, fm * x0 + fb];
15665         }
15666       }
15667     }
15668
15669     edge[0] = v0;
15670     edge[1] = v1;
15671     return true;
15672   }
15673
15674   function clipEdges(x0, y0, x1, y1) {
15675     var i = edges.length,
15676         edge;
15677
15678     while (i--) {
15679       if (!connectEdge(edge = edges[i], x0, y0, x1, y1)
15680           || !clipEdge(edge, x0, y0, x1, y1)
15681           || !(Math.abs(edge[0][0] - edge[1][0]) > epsilon$4
15682               || Math.abs(edge[0][1] - edge[1][1]) > epsilon$4)) {
15683         delete edges[i];
15684       }
15685     }
15686   }
15687
15688   function createCell(site) {
15689     return cells[site.index] = {
15690       site: site,
15691       halfedges: []
15692     };
15693   }
15694
15695   function cellHalfedgeAngle(cell, edge) {
15696     var site = cell.site,
15697         va = edge.left,
15698         vb = edge.right;
15699     if (site === vb) vb = va, va = site;
15700     if (vb) return Math.atan2(vb[1] - va[1], vb[0] - va[0]);
15701     if (site === va) va = edge[1], vb = edge[0];
15702     else va = edge[0], vb = edge[1];
15703     return Math.atan2(va[0] - vb[0], vb[1] - va[1]);
15704   }
15705
15706   function cellHalfedgeStart(cell, edge) {
15707     return edge[+(edge.left !== cell.site)];
15708   }
15709
15710   function cellHalfedgeEnd(cell, edge) {
15711     return edge[+(edge.left === cell.site)];
15712   }
15713
15714   function sortCellHalfedges() {
15715     for (var i = 0, n = cells.length, cell, halfedges, j, m; i < n; ++i) {
15716       if ((cell = cells[i]) && (m = (halfedges = cell.halfedges).length)) {
15717         var index = new Array(m),
15718             array = new Array(m);
15719         for (j = 0; j < m; ++j) index[j] = j, array[j] = cellHalfedgeAngle(cell, edges[halfedges[j]]);
15720         index.sort(function(i, j) { return array[j] - array[i]; });
15721         for (j = 0; j < m; ++j) array[j] = halfedges[index[j]];
15722         for (j = 0; j < m; ++j) halfedges[j] = array[j];
15723       }
15724     }
15725   }
15726
15727   function clipCells(x0, y0, x1, y1) {
15728     var nCells = cells.length,
15729         iCell,
15730         cell,
15731         site,
15732         iHalfedge,
15733         halfedges,
15734         nHalfedges,
15735         start,
15736         startX,
15737         startY,
15738         end,
15739         endX,
15740         endY,
15741         cover = true;
15742
15743     for (iCell = 0; iCell < nCells; ++iCell) {
15744       if (cell = cells[iCell]) {
15745         site = cell.site;
15746         halfedges = cell.halfedges;
15747         iHalfedge = halfedges.length;
15748
15749         // Remove any dangling clipped edges.
15750         while (iHalfedge--) {
15751           if (!edges[halfedges[iHalfedge]]) {
15752             halfedges.splice(iHalfedge, 1);
15753           }
15754         }
15755
15756         // Insert any border edges as necessary.
15757         iHalfedge = 0, nHalfedges = halfedges.length;
15758         while (iHalfedge < nHalfedges) {
15759           end = cellHalfedgeEnd(cell, edges[halfedges[iHalfedge]]), endX = end[0], endY = end[1];
15760           start = cellHalfedgeStart(cell, edges[halfedges[++iHalfedge % nHalfedges]]), startX = start[0], startY = start[1];
15761           if (Math.abs(endX - startX) > epsilon$4 || Math.abs(endY - startY) > epsilon$4) {
15762             halfedges.splice(iHalfedge, 0, edges.push(createBorderEdge(site, end,
15763                 Math.abs(endX - x0) < epsilon$4 && y1 - endY > epsilon$4 ? [x0, Math.abs(startX - x0) < epsilon$4 ? startY : y1]
15764                 : Math.abs(endY - y1) < epsilon$4 && x1 - endX > epsilon$4 ? [Math.abs(startY - y1) < epsilon$4 ? startX : x1, y1]
15765                 : Math.abs(endX - x1) < epsilon$4 && endY - y0 > epsilon$4 ? [x1, Math.abs(startX - x1) < epsilon$4 ? startY : y0]
15766                 : Math.abs(endY - y0) < epsilon$4 && endX - x0 > epsilon$4 ? [Math.abs(startY - y0) < epsilon$4 ? startX : x0, y0]
15767                 : null)) - 1);
15768             ++nHalfedges;
15769           }
15770         }
15771
15772         if (nHalfedges) cover = false;
15773       }
15774     }
15775
15776     // If there weren’t any edges, have the closest site cover the extent.
15777     // It doesn’t matter which corner of the extent we measure!
15778     if (cover) {
15779       var dx, dy, d2, dc = Infinity;
15780
15781       for (iCell = 0, cover = null; iCell < nCells; ++iCell) {
15782         if (cell = cells[iCell]) {
15783           site = cell.site;
15784           dx = site[0] - x0;
15785           dy = site[1] - y0;
15786           d2 = dx * dx + dy * dy;
15787           if (d2 < dc) dc = d2, cover = cell;
15788         }
15789       }
15790
15791       if (cover) {
15792         var v00 = [x0, y0], v01 = [x0, y1], v11 = [x1, y1], v10 = [x1, y0];
15793         cover.halfedges.push(
15794           edges.push(createBorderEdge(site = cover.site, v00, v01)) - 1,
15795           edges.push(createBorderEdge(site, v01, v11)) - 1,
15796           edges.push(createBorderEdge(site, v11, v10)) - 1,
15797           edges.push(createBorderEdge(site, v10, v00)) - 1
15798         );
15799       }
15800     }
15801
15802     // Lastly delete any cells with no edges; these were entirely clipped.
15803     for (iCell = 0; iCell < nCells; ++iCell) {
15804       if (cell = cells[iCell]) {
15805         if (!cell.halfedges.length) {
15806           delete cells[iCell];
15807         }
15808       }
15809     }
15810   }
15811
15812   var circlePool = [];
15813
15814   var firstCircle;
15815
15816   function Circle() {
15817     RedBlackNode(this);
15818     this.x =
15819     this.y =
15820     this.arc =
15821     this.site =
15822     this.cy = null;
15823   }
15824
15825   function attachCircle(arc) {
15826     var lArc = arc.P,
15827         rArc = arc.N;
15828
15829     if (!lArc || !rArc) return;
15830
15831     var lSite = lArc.site,
15832         cSite = arc.site,
15833         rSite = rArc.site;
15834
15835     if (lSite === rSite) return;
15836
15837     var bx = cSite[0],
15838         by = cSite[1],
15839         ax = lSite[0] - bx,
15840         ay = lSite[1] - by,
15841         cx = rSite[0] - bx,
15842         cy = rSite[1] - by;
15843
15844     var d = 2 * (ax * cy - ay * cx);
15845     if (d >= -epsilon2$2) return;
15846
15847     var ha = ax * ax + ay * ay,
15848         hc = cx * cx + cy * cy,
15849         x = (cy * ha - ay * hc) / d,
15850         y = (ax * hc - cx * ha) / d;
15851
15852     var circle = circlePool.pop() || new Circle;
15853     circle.arc = arc;
15854     circle.site = cSite;
15855     circle.x = x + bx;
15856     circle.y = (circle.cy = y + by) + Math.sqrt(x * x + y * y); // y bottom
15857
15858     arc.circle = circle;
15859
15860     var before = null,
15861         node = circles._;
15862
15863     while (node) {
15864       if (circle.y < node.y || (circle.y === node.y && circle.x <= node.x)) {
15865         if (node.L) node = node.L;
15866         else { before = node.P; break; }
15867       } else {
15868         if (node.R) node = node.R;
15869         else { before = node; break; }
15870       }
15871     }
15872
15873     circles.insert(before, circle);
15874     if (!before) firstCircle = circle;
15875   }
15876
15877   function detachCircle(arc) {
15878     var circle = arc.circle;
15879     if (circle) {
15880       if (!circle.P) firstCircle = circle.N;
15881       circles.remove(circle);
15882       circlePool.push(circle);
15883       RedBlackNode(circle);
15884       arc.circle = null;
15885     }
15886   }
15887
15888   var beachPool = [];
15889
15890   function Beach() {
15891     RedBlackNode(this);
15892     this.edge =
15893     this.site =
15894     this.circle = null;
15895   }
15896
15897   function createBeach(site) {
15898     var beach = beachPool.pop() || new Beach;
15899     beach.site = site;
15900     return beach;
15901   }
15902
15903   function detachBeach(beach) {
15904     detachCircle(beach);
15905     beaches.remove(beach);
15906     beachPool.push(beach);
15907     RedBlackNode(beach);
15908   }
15909
15910   function removeBeach(beach) {
15911     var circle = beach.circle,
15912         x = circle.x,
15913         y = circle.cy,
15914         vertex = [x, y],
15915         previous = beach.P,
15916         next = beach.N,
15917         disappearing = [beach];
15918
15919     detachBeach(beach);
15920
15921     var lArc = previous;
15922     while (lArc.circle
15923         && Math.abs(x - lArc.circle.x) < epsilon$4
15924         && Math.abs(y - lArc.circle.cy) < epsilon$4) {
15925       previous = lArc.P;
15926       disappearing.unshift(lArc);
15927       detachBeach(lArc);
15928       lArc = previous;
15929     }
15930
15931     disappearing.unshift(lArc);
15932     detachCircle(lArc);
15933
15934     var rArc = next;
15935     while (rArc.circle
15936         && Math.abs(x - rArc.circle.x) < epsilon$4
15937         && Math.abs(y - rArc.circle.cy) < epsilon$4) {
15938       next = rArc.N;
15939       disappearing.push(rArc);
15940       detachBeach(rArc);
15941       rArc = next;
15942     }
15943
15944     disappearing.push(rArc);
15945     detachCircle(rArc);
15946
15947     var nArcs = disappearing.length,
15948         iArc;
15949     for (iArc = 1; iArc < nArcs; ++iArc) {
15950       rArc = disappearing[iArc];
15951       lArc = disappearing[iArc - 1];
15952       setEdgeEnd(rArc.edge, lArc.site, rArc.site, vertex);
15953     }
15954
15955     lArc = disappearing[0];
15956     rArc = disappearing[nArcs - 1];
15957     rArc.edge = createEdge(lArc.site, rArc.site, null, vertex);
15958
15959     attachCircle(lArc);
15960     attachCircle(rArc);
15961   }
15962
15963   function addBeach(site) {
15964     var x = site[0],
15965         directrix = site[1],
15966         lArc,
15967         rArc,
15968         dxl,
15969         dxr,
15970         node = beaches._;
15971
15972     while (node) {
15973       dxl = leftBreakPoint(node, directrix) - x;
15974       if (dxl > epsilon$4) node = node.L; else {
15975         dxr = x - rightBreakPoint(node, directrix);
15976         if (dxr > epsilon$4) {
15977           if (!node.R) {
15978             lArc = node;
15979             break;
15980           }
15981           node = node.R;
15982         } else {
15983           if (dxl > -epsilon$4) {
15984             lArc = node.P;
15985             rArc = node;
15986           } else if (dxr > -epsilon$4) {
15987             lArc = node;
15988             rArc = node.N;
15989           } else {
15990             lArc = rArc = node;
15991           }
15992           break;
15993         }
15994       }
15995     }
15996
15997     createCell(site);
15998     var newArc = createBeach(site);
15999     beaches.insert(lArc, newArc);
16000
16001     if (!lArc && !rArc) return;
16002
16003     if (lArc === rArc) {
16004       detachCircle(lArc);
16005       rArc = createBeach(lArc.site);
16006       beaches.insert(newArc, rArc);
16007       newArc.edge = rArc.edge = createEdge(lArc.site, newArc.site);
16008       attachCircle(lArc);
16009       attachCircle(rArc);
16010       return;
16011     }
16012
16013     if (!rArc) { // && lArc
16014       newArc.edge = createEdge(lArc.site, newArc.site);
16015       return;
16016     }
16017
16018     // else lArc !== rArc
16019     detachCircle(lArc);
16020     detachCircle(rArc);
16021
16022     var lSite = lArc.site,
16023         ax = lSite[0],
16024         ay = lSite[1],
16025         bx = site[0] - ax,
16026         by = site[1] - ay,
16027         rSite = rArc.site,
16028         cx = rSite[0] - ax,
16029         cy = rSite[1] - ay,
16030         d = 2 * (bx * cy - by * cx),
16031         hb = bx * bx + by * by,
16032         hc = cx * cx + cy * cy,
16033         vertex = [(cy * hb - by * hc) / d + ax, (bx * hc - cx * hb) / d + ay];
16034
16035     setEdgeEnd(rArc.edge, lSite, rSite, vertex);
16036     newArc.edge = createEdge(lSite, site, null, vertex);
16037     rArc.edge = createEdge(site, rSite, null, vertex);
16038     attachCircle(lArc);
16039     attachCircle(rArc);
16040   }
16041
16042   function leftBreakPoint(arc, directrix) {
16043     var site = arc.site,
16044         rfocx = site[0],
16045         rfocy = site[1],
16046         pby2 = rfocy - directrix;
16047
16048     if (!pby2) return rfocx;
16049
16050     var lArc = arc.P;
16051     if (!lArc) return -Infinity;
16052
16053     site = lArc.site;
16054     var lfocx = site[0],
16055         lfocy = site[1],
16056         plby2 = lfocy - directrix;
16057
16058     if (!plby2) return lfocx;
16059
16060     var hl = lfocx - rfocx,
16061         aby2 = 1 / pby2 - 1 / plby2,
16062         b = hl / plby2;
16063
16064     if (aby2) return (-b + Math.sqrt(b * b - 2 * aby2 * (hl * hl / (-2 * plby2) - lfocy + plby2 / 2 + rfocy - pby2 / 2))) / aby2 + rfocx;
16065
16066     return (rfocx + lfocx) / 2;
16067   }
16068
16069   function rightBreakPoint(arc, directrix) {
16070     var rArc = arc.N;
16071     if (rArc) return leftBreakPoint(rArc, directrix);
16072     var site = arc.site;
16073     return site[1] === directrix ? site[0] : Infinity;
16074   }
16075
16076   var epsilon$4 = 1e-6;
16077   var epsilon2$2 = 1e-12;
16078   var beaches;
16079   var cells;
16080   var circles;
16081   var edges;
16082
16083   function triangleArea(a, b, c) {
16084     return (a[0] - c[0]) * (b[1] - a[1]) - (a[0] - b[0]) * (c[1] - a[1]);
16085   }
16086
16087   function lexicographic(a, b) {
16088     return b[1] - a[1]
16089         || b[0] - a[0];
16090   }
16091
16092   function Diagram(sites, extent) {
16093     var site = sites.sort(lexicographic).pop(),
16094         x,
16095         y,
16096         circle;
16097
16098     edges = [];
16099     cells = new Array(sites.length);
16100     beaches = new RedBlackTree;
16101     circles = new RedBlackTree;
16102
16103     while (true) {
16104       circle = firstCircle;
16105       if (site && (!circle || site[1] < circle.y || (site[1] === circle.y && site[0] < circle.x))) {
16106         if (site[0] !== x || site[1] !== y) {
16107           addBeach(site);
16108           x = site[0], y = site[1];
16109         }
16110         site = sites.pop();
16111       } else if (circle) {
16112         removeBeach(circle.arc);
16113       } else {
16114         break;
16115       }
16116     }
16117
16118     sortCellHalfedges();
16119
16120     if (extent) {
16121       var x0 = +extent[0][0],
16122           y0 = +extent[0][1],
16123           x1 = +extent[1][0],
16124           y1 = +extent[1][1];
16125       clipEdges(x0, y0, x1, y1);
16126       clipCells(x0, y0, x1, y1);
16127     }
16128
16129     this.edges = edges;
16130     this.cells = cells;
16131
16132     beaches =
16133     circles =
16134     edges =
16135     cells = null;
16136   }
16137
16138   Diagram.prototype = {
16139     constructor: Diagram,
16140
16141     polygons: function() {
16142       var edges = this.edges;
16143
16144       return this.cells.map(function(cell) {
16145         var polygon = cell.halfedges.map(function(i) { return cellHalfedgeStart(cell, edges[i]); });
16146         polygon.data = cell.site.data;
16147         return polygon;
16148       });
16149     },
16150
16151     triangles: function() {
16152       var triangles = [],
16153           edges = this.edges;
16154
16155       this.cells.forEach(function(cell, i) {
16156         if (!(m = (halfedges = cell.halfedges).length)) return;
16157         var site = cell.site,
16158             halfedges,
16159             j = -1,
16160             m,
16161             s0,
16162             e1 = edges[halfedges[m - 1]],
16163             s1 = e1.left === site ? e1.right : e1.left;
16164
16165         while (++j < m) {
16166           s0 = s1;
16167           e1 = edges[halfedges[j]];
16168           s1 = e1.left === site ? e1.right : e1.left;
16169           if (s0 && s1 && i < s0.index && i < s1.index && triangleArea(site, s0, s1) < 0) {
16170             triangles.push([site.data, s0.data, s1.data]);
16171           }
16172         }
16173       });
16174
16175       return triangles;
16176     },
16177
16178     links: function() {
16179       return this.edges.filter(function(edge) {
16180         return edge.right;
16181       }).map(function(edge) {
16182         return {
16183           source: edge.left.data,
16184           target: edge.right.data
16185         };
16186       });
16187     },
16188
16189     find: function(x, y, radius) {
16190       var that = this, i0, i1 = that._found || 0, n = that.cells.length, cell;
16191
16192       // Use the previously-found cell, or start with an arbitrary one.
16193       while (!(cell = that.cells[i1])) if (++i1 >= n) return null;
16194       var dx = x - cell.site[0], dy = y - cell.site[1], d2 = dx * dx + dy * dy;
16195
16196       // Traverse the half-edges to find a closer cell, if any.
16197       do {
16198         cell = that.cells[i0 = i1], i1 = null;
16199         cell.halfedges.forEach(function(e) {
16200           var edge = that.edges[e], v = edge.left;
16201           if ((v === cell.site || !v) && !(v = edge.right)) return;
16202           var vx = x - v[0], vy = y - v[1], v2 = vx * vx + vy * vy;
16203           if (v2 < d2) d2 = v2, i1 = v.index;
16204         });
16205       } while (i1 !== null);
16206
16207       that._found = i0;
16208
16209       return radius == null || d2 <= radius * radius ? cell.site : null;
16210     }
16211   };
16212
16213   function voronoi() {
16214     var x$$1 = x$4,
16215         y$$1 = y$4,
16216         extent = null;
16217
16218     function voronoi(data) {
16219       return new Diagram(data.map(function(d, i) {
16220         var s = [Math.round(x$$1(d, i, data) / epsilon$4) * epsilon$4, Math.round(y$$1(d, i, data) / epsilon$4) * epsilon$4];
16221         s.index = i;
16222         s.data = d;
16223         return s;
16224       }), extent);
16225     }
16226
16227     voronoi.polygons = function(data) {
16228       return voronoi(data).polygons();
16229     };
16230
16231     voronoi.links = function(data) {
16232       return voronoi(data).links();
16233     };
16234
16235     voronoi.triangles = function(data) {
16236       return voronoi(data).triangles();
16237     };
16238
16239     voronoi.x = function(_) {
16240       return arguments.length ? (x$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : x$$1;
16241     };
16242
16243     voronoi.y = function(_) {
16244       return arguments.length ? (y$$1 = typeof _ === "function" ? _ : constant$b(+_), voronoi) : y$$1;
16245     };
16246
16247     voronoi.extent = function(_) {
16248       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]]];
16249     };
16250
16251     voronoi.size = function(_) {
16252       return arguments.length ? (extent = _ == null ? null : [[0, 0], [+_[0], +_[1]]], voronoi) : extent && [extent[1][0] - extent[0][0], extent[1][1] - extent[0][1]];
16253     };
16254
16255     return voronoi;
16256   }
16257
16258   function constant$c(x) {
16259     return function() {
16260       return x;
16261     };
16262   }
16263
16264   function ZoomEvent(target, type, transform) {
16265     this.target = target;
16266     this.type = type;
16267     this.transform = transform;
16268   }
16269
16270   function Transform(k, x, y) {
16271     this.k = k;
16272     this.x = x;
16273     this.y = y;
16274   }
16275
16276   Transform.prototype = {
16277     constructor: Transform,
16278     scale: function(k) {
16279       return k === 1 ? this : new Transform(this.k * k, this.x, this.y);
16280     },
16281     translate: function(x, y) {
16282       return x === 0 & y === 0 ? this : new Transform(this.k, this.x + this.k * x, this.y + this.k * y);
16283     },
16284     apply: function(point) {
16285       return [point[0] * this.k + this.x, point[1] * this.k + this.y];
16286     },
16287     applyX: function(x) {
16288       return x * this.k + this.x;
16289     },
16290     applyY: function(y) {
16291       return y * this.k + this.y;
16292     },
16293     invert: function(location) {
16294       return [(location[0] - this.x) / this.k, (location[1] - this.y) / this.k];
16295     },
16296     invertX: function(x) {
16297       return (x - this.x) / this.k;
16298     },
16299     invertY: function(y) {
16300       return (y - this.y) / this.k;
16301     },
16302     rescaleX: function(x) {
16303       return x.copy().domain(x.range().map(this.invertX, this).map(x.invert, x));
16304     },
16305     rescaleY: function(y) {
16306       return y.copy().domain(y.range().map(this.invertY, this).map(y.invert, y));
16307     },
16308     toString: function() {
16309       return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")";
16310     }
16311   };
16312
16313   var identity$7 = new Transform(1, 0, 0);
16314
16315   transform.prototype = Transform.prototype;
16316
16317   function transform(node) {
16318     return node.__zoom || identity$7;
16319   }
16320
16321   function nopropagation$2() {
16322     event.stopImmediatePropagation();
16323   }
16324
16325   function noevent$2() {
16326     event.preventDefault();
16327     event.stopImmediatePropagation();
16328   }
16329
16330   // Ignore right-click, since that should open the context menu.
16331   function defaultFilter$2() {
16332     return !event.button;
16333   }
16334
16335   function defaultExtent$1() {
16336     var e = this, w, h;
16337     if (e instanceof SVGElement) {
16338       e = e.ownerSVGElement || e;
16339       w = e.width.baseVal.value;
16340       h = e.height.baseVal.value;
16341     } else {
16342       w = e.clientWidth;
16343       h = e.clientHeight;
16344     }
16345     return [[0, 0], [w, h]];
16346   }
16347
16348   function defaultTransform() {
16349     return this.__zoom || identity$7;
16350   }
16351
16352   function defaultWheelDelta() {
16353     return -event.deltaY * (event.deltaMode ? 120 : 1) / 500;
16354   }
16355
16356   function defaultTouchable$1() {
16357     return "ontouchstart" in this;
16358   }
16359
16360   function defaultConstrain(transform$$1, extent, translateExtent) {
16361     var dx0 = transform$$1.invertX(extent[0][0]) - translateExtent[0][0],
16362         dx1 = transform$$1.invertX(extent[1][0]) - translateExtent[1][0],
16363         dy0 = transform$$1.invertY(extent[0][1]) - translateExtent[0][1],
16364         dy1 = transform$$1.invertY(extent[1][1]) - translateExtent[1][1];
16365     return transform$$1.translate(
16366       dx1 > dx0 ? (dx0 + dx1) / 2 : Math.min(0, dx0) || Math.max(0, dx1),
16367       dy1 > dy0 ? (dy0 + dy1) / 2 : Math.min(0, dy0) || Math.max(0, dy1)
16368     );
16369   }
16370
16371   function d3_zoom() {
16372     var filter = defaultFilter$2,
16373         extent = defaultExtent$1,
16374         constrain = defaultConstrain,
16375         wheelDelta = defaultWheelDelta,
16376         touchable = defaultTouchable$1,
16377         scaleExtent = [0, Infinity],
16378         translateExtent = [[-Infinity, -Infinity], [Infinity, Infinity]],
16379         duration = 250,
16380         interpolate$$1 = interpolateZoom,
16381         gestures = [],
16382         listeners = dispatch("start", "zoom", "end"),
16383         touchstarting,
16384         touchending,
16385         touchDelay = 500,
16386         wheelDelay = 150,
16387         clickDistance2 = 0;
16388
16389     function zoom(selection$$1) {
16390       selection$$1
16391           .property("__zoom", defaultTransform)
16392           .on("wheel.zoom", wheeled)
16393           .on("mousedown.zoom", mousedowned)
16394           .on("dblclick.zoom", dblclicked)
16395         .filter(touchable)
16396           .on("touchstart.zoom", touchstarted)
16397           .on("touchmove.zoom", touchmoved)
16398           .on("touchend.zoom touchcancel.zoom", touchended)
16399           .style("touch-action", "none")
16400           .style("-webkit-tap-highlight-color", "rgba(0,0,0,0)");
16401     }
16402
16403     zoom.transform = function(collection, transform$$1) {
16404       var selection$$1 = collection.selection ? collection.selection() : collection;
16405       selection$$1.property("__zoom", defaultTransform);
16406       if (collection !== selection$$1) {
16407         schedule(collection, transform$$1);
16408       } else {
16409         selection$$1.interrupt().each(function() {
16410           gesture(this, arguments)
16411               .start()
16412               .zoom(null, typeof transform$$1 === "function" ? transform$$1.apply(this, arguments) : transform$$1)
16413               .end();
16414         });
16415       }
16416     };
16417
16418     zoom.scaleBy = function(selection$$1, k) {
16419       zoom.scaleTo(selection$$1, function() {
16420         var k0 = this.__zoom.k,
16421             k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16422         return k0 * k1;
16423       });
16424     };
16425
16426     zoom.scaleTo = function(selection$$1, k) {
16427       zoom.transform(selection$$1, function() {
16428         var e = extent.apply(this, arguments),
16429             t0 = this.__zoom,
16430             p0 = centroid(e),
16431             p1 = t0.invert(p0),
16432             k1 = typeof k === "function" ? k.apply(this, arguments) : k;
16433         return constrain(translate(scale(t0, k1), p0, p1), e, translateExtent);
16434       });
16435     };
16436
16437     zoom.translateBy = function(selection$$1, x, y) {
16438       zoom.transform(selection$$1, function() {
16439         return constrain(this.__zoom.translate(
16440           typeof x === "function" ? x.apply(this, arguments) : x,
16441           typeof y === "function" ? y.apply(this, arguments) : y
16442         ), extent.apply(this, arguments), translateExtent);
16443       });
16444     };
16445
16446     zoom.translateTo = function(selection$$1, x, y) {
16447       zoom.transform(selection$$1, function() {
16448         var e = extent.apply(this, arguments),
16449             t = this.__zoom,
16450             p = centroid(e);
16451         return constrain(identity$7.translate(p[0], p[1]).scale(t.k).translate(
16452           typeof x === "function" ? -x.apply(this, arguments) : -x,
16453           typeof y === "function" ? -y.apply(this, arguments) : -y
16454         ), e, translateExtent);
16455       });
16456     };
16457
16458     function scale(transform$$1, k) {
16459       k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], k));
16460       return k === transform$$1.k ? transform$$1 : new Transform(k, transform$$1.x, transform$$1.y);
16461     }
16462
16463     function translate(transform$$1, p0, p1) {
16464       var x = p0[0] - p1[0] * transform$$1.k, y = p0[1] - p1[1] * transform$$1.k;
16465       return x === transform$$1.x && y === transform$$1.y ? transform$$1 : new Transform(transform$$1.k, x, y);
16466     }
16467
16468     function centroid(extent) {
16469       return [(+extent[0][0] + +extent[1][0]) / 2, (+extent[0][1] + +extent[1][1]) / 2];
16470     }
16471
16472     function schedule(transition$$1, transform$$1, center) {
16473       transition$$1
16474           .on("start.zoom", function() { gesture(this, arguments).start(); })
16475           .on("interrupt.zoom end.zoom", function() { gesture(this, arguments).end(); })
16476           .tween("zoom", function() {
16477             var that = this,
16478                 args = arguments,
16479                 g = gesture(that, args),
16480                 e = extent.apply(that, args),
16481                 p = center || centroid(e),
16482                 w = Math.max(e[1][0] - e[0][0], e[1][1] - e[0][1]),
16483                 a = that.__zoom,
16484                 b = typeof transform$$1 === "function" ? transform$$1.apply(that, args) : transform$$1,
16485                 i = interpolate$$1(a.invert(p).concat(w / a.k), b.invert(p).concat(w / b.k));
16486             return function(t) {
16487               if (t === 1) t = b; // Avoid rounding error on end.
16488               else { var l = i(t), k = w / l[2]; t = new Transform(k, p[0] - l[0] * k, p[1] - l[1] * k); }
16489               g.zoom(null, t);
16490             };
16491           });
16492     }
16493
16494     function gesture(that, args) {
16495       for (var i = 0, n = gestures.length, g; i < n; ++i) {
16496         if ((g = gestures[i]).that === that) {
16497           return g;
16498         }
16499       }
16500       return new Gesture(that, args);
16501     }
16502
16503     function Gesture(that, args) {
16504       this.that = that;
16505       this.args = args;
16506       this.index = -1;
16507       this.active = 0;
16508       this.extent = extent.apply(that, args);
16509     }
16510
16511     Gesture.prototype = {
16512       start: function() {
16513         if (++this.active === 1) {
16514           this.index = gestures.push(this) - 1;
16515           this.emit("start");
16516         }
16517         return this;
16518       },
16519       zoom: function(key, transform$$1) {
16520         if (this.mouse && key !== "mouse") this.mouse[1] = transform$$1.invert(this.mouse[0]);
16521         if (this.touch0 && key !== "touch") this.touch0[1] = transform$$1.invert(this.touch0[0]);
16522         if (this.touch1 && key !== "touch") this.touch1[1] = transform$$1.invert(this.touch1[0]);
16523         this.that.__zoom = transform$$1;
16524         this.emit("zoom");
16525         return this;
16526       },
16527       end: function() {
16528         if (--this.active === 0) {
16529           gestures.splice(this.index, 1);
16530           this.index = -1;
16531           this.emit("end");
16532         }
16533         return this;
16534       },
16535       emit: function(type) {
16536         customEvent(new ZoomEvent(zoom, type, this.that.__zoom), listeners.apply, listeners, [type, this.that, this.args]);
16537       }
16538     };
16539
16540     function wheeled() {
16541       if (!filter.apply(this, arguments)) return;
16542       var g = gesture(this, arguments),
16543           t = this.__zoom,
16544           k = Math.max(scaleExtent[0], Math.min(scaleExtent[1], t.k * Math.pow(2, wheelDelta.apply(this, arguments)))),
16545           p = mouse(this);
16546
16547       // If the mouse is in the same location as before, reuse it.
16548       // If there were recent wheel events, reset the wheel idle timeout.
16549       if (g.wheel) {
16550         if (g.mouse[0][0] !== p[0] || g.mouse[0][1] !== p[1]) {
16551           g.mouse[1] = t.invert(g.mouse[0] = p);
16552         }
16553         clearTimeout(g.wheel);
16554       }
16555
16556       // If this wheel event won’t trigger a transform change, ignore it.
16557       else if (t.k === k) return;
16558
16559       // Otherwise, capture the mouse point and location at the start.
16560       else {
16561         g.mouse = [p, t.invert(p)];
16562         interrupt(this);
16563         g.start();
16564       }
16565
16566       noevent$2();
16567       g.wheel = setTimeout(wheelidled, wheelDelay);
16568       g.zoom("mouse", constrain(translate(scale(t, k), g.mouse[0], g.mouse[1]), g.extent, translateExtent));
16569
16570       function wheelidled() {
16571         g.wheel = null;
16572         g.end();
16573       }
16574     }
16575
16576     function mousedowned() {
16577       if (touchending || !filter.apply(this, arguments)) return;
16578       var g = gesture(this, arguments),
16579           v = select(event.view).on("mousemove.zoom", mousemoved, true).on("mouseup.zoom", mouseupped, true),
16580           p = mouse(this),
16581           x0 = event.clientX,
16582           y0 = event.clientY;
16583
16584       dragDisable(event.view);
16585       nopropagation$2();
16586       g.mouse = [p, this.__zoom.invert(p)];
16587       interrupt(this);
16588       g.start();
16589
16590       function mousemoved() {
16591         noevent$2();
16592         if (!g.moved) {
16593           var dx = event.clientX - x0, dy = event.clientY - y0;
16594           g.moved = dx * dx + dy * dy > clickDistance2;
16595         }
16596         g.zoom("mouse", constrain(translate(g.that.__zoom, g.mouse[0] = mouse(g.that), g.mouse[1]), g.extent, translateExtent));
16597       }
16598
16599       function mouseupped() {
16600         v.on("mousemove.zoom mouseup.zoom", null);
16601         yesdrag(event.view, g.moved);
16602         noevent$2();
16603         g.end();
16604       }
16605     }
16606
16607     function dblclicked() {
16608       if (!filter.apply(this, arguments)) return;
16609       var t0 = this.__zoom,
16610           p0 = mouse(this),
16611           p1 = t0.invert(p0),
16612           k1 = t0.k * (event.shiftKey ? 0.5 : 2),
16613           t1 = constrain(translate(scale(t0, k1), p0, p1), extent.apply(this, arguments), translateExtent);
16614
16615       noevent$2();
16616       if (duration > 0) select(this).transition().duration(duration).call(schedule, t1, p0);
16617       else select(this).call(zoom.transform, t1);
16618     }
16619
16620     function touchstarted() {
16621       if (!filter.apply(this, arguments)) return;
16622       var g = gesture(this, arguments),
16623           touches = event.changedTouches,
16624           started,
16625           n = touches.length, i, t, p;
16626
16627       nopropagation$2();
16628       for (i = 0; i < n; ++i) {
16629         t = touches[i], p = touch(this, touches, t.identifier);
16630         p = [p, this.__zoom.invert(p), t.identifier];
16631         if (!g.touch0) g.touch0 = p, started = true;
16632         else if (!g.touch1) g.touch1 = p;
16633       }
16634
16635       // If this is a dbltap, reroute to the (optional) dblclick.zoom handler.
16636       if (touchstarting) {
16637         touchstarting = clearTimeout(touchstarting);
16638         if (!g.touch1) {
16639           g.end();
16640           p = select(this).on("dblclick.zoom");
16641           if (p) p.apply(this, arguments);
16642           return;
16643         }
16644       }
16645
16646       if (started) {
16647         touchstarting = setTimeout(function() { touchstarting = null; }, touchDelay);
16648         interrupt(this);
16649         g.start();
16650       }
16651     }
16652
16653     function touchmoved() {
16654       var g = gesture(this, arguments),
16655           touches = event.changedTouches,
16656           n = touches.length, i, t, p, l;
16657
16658       noevent$2();
16659       if (touchstarting) touchstarting = clearTimeout(touchstarting);
16660       for (i = 0; i < n; ++i) {
16661         t = touches[i], p = touch(this, touches, t.identifier);
16662         if (g.touch0 && g.touch0[2] === t.identifier) g.touch0[0] = p;
16663         else if (g.touch1 && g.touch1[2] === t.identifier) g.touch1[0] = p;
16664       }
16665       t = g.that.__zoom;
16666       if (g.touch1) {
16667         var p0 = g.touch0[0], l0 = g.touch0[1],
16668             p1 = g.touch1[0], l1 = g.touch1[1],
16669             dp = (dp = p1[0] - p0[0]) * dp + (dp = p1[1] - p0[1]) * dp,
16670             dl = (dl = l1[0] - l0[0]) * dl + (dl = l1[1] - l0[1]) * dl;
16671         t = scale(t, Math.sqrt(dp / dl));
16672         p = [(p0[0] + p1[0]) / 2, (p0[1] + p1[1]) / 2];
16673         l = [(l0[0] + l1[0]) / 2, (l0[1] + l1[1]) / 2];
16674       }
16675       else if (g.touch0) p = g.touch0[0], l = g.touch0[1];
16676       else return;
16677       g.zoom("touch", constrain(translate(t, p, l), g.extent, translateExtent));
16678     }
16679
16680     function touchended() {
16681       var g = gesture(this, arguments),
16682           touches = event.changedTouches,
16683           n = touches.length, i, t;
16684
16685       nopropagation$2();
16686       if (touchending) clearTimeout(touchending);
16687       touchending = setTimeout(function() { touchending = null; }, touchDelay);
16688       for (i = 0; i < n; ++i) {
16689         t = touches[i];
16690         if (g.touch0 && g.touch0[2] === t.identifier) delete g.touch0;
16691         else if (g.touch1 && g.touch1[2] === t.identifier) delete g.touch1;
16692       }
16693       if (g.touch1 && !g.touch0) g.touch0 = g.touch1, delete g.touch1;
16694       if (g.touch0) g.touch0[1] = this.__zoom.invert(g.touch0[0]);
16695       else g.end();
16696     }
16697
16698     zoom.wheelDelta = function(_) {
16699       return arguments.length ? (wheelDelta = typeof _ === "function" ? _ : constant$c(+_), zoom) : wheelDelta;
16700     };
16701
16702     zoom.filter = function(_) {
16703       return arguments.length ? (filter = typeof _ === "function" ? _ : constant$c(!!_), zoom) : filter;
16704     };
16705
16706     zoom.touchable = function(_) {
16707       return arguments.length ? (touchable = typeof _ === "function" ? _ : constant$c(!!_), zoom) : touchable;
16708     };
16709
16710     zoom.extent = function(_) {
16711       return arguments.length ? (extent = typeof _ === "function" ? _ : constant$c([[+_[0][0], +_[0][1]], [+_[1][0], +_[1][1]]]), zoom) : extent;
16712     };
16713
16714     zoom.scaleExtent = function(_) {
16715       return arguments.length ? (scaleExtent[0] = +_[0], scaleExtent[1] = +_[1], zoom) : [scaleExtent[0], scaleExtent[1]];
16716     };
16717
16718     zoom.translateExtent = function(_) {
16719       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]]];
16720     };
16721
16722     zoom.constrain = function(_) {
16723       return arguments.length ? (constrain = _, zoom) : constrain;
16724     };
16725
16726     zoom.duration = function(_) {
16727       return arguments.length ? (duration = +_, zoom) : duration;
16728     };
16729
16730     zoom.interpolate = function(_) {
16731       return arguments.length ? (interpolate$$1 = _, zoom) : interpolate$$1;
16732     };
16733
16734     zoom.on = function() {
16735       var value = listeners.on.apply(listeners, arguments);
16736       return value === listeners ? zoom : value;
16737     };
16738
16739     zoom.clickDistance = function(_) {
16740       return arguments.length ? (clickDistance2 = (_ = +_) * _, zoom) : Math.sqrt(clickDistance2);
16741     };
16742
16743     return zoom;
16744   }
16745
16746
16747
16748   var index$3 = /*#__PURE__*/Object.freeze({
16749     version: version,
16750     bisect: bisectRight,
16751     bisectRight: bisectRight,
16752     bisectLeft: bisectLeft,
16753     ascending: ascending,
16754     bisector: bisector,
16755     cross: cross,
16756     descending: d3_descending,
16757     deviation: deviation,
16758     extent: extent,
16759     histogram: histogram,
16760     thresholdFreedmanDiaconis: freedmanDiaconis,
16761     thresholdScott: scott,
16762     thresholdSturges: sturges,
16763     max: max,
16764     mean: mean,
16765     median: d3_median,
16766     merge: merge,
16767     min: min,
16768     pairs: pairs,
16769     permute: permute,
16770     quantile: quantile,
16771     range: range,
16772     scan: scan,
16773     shuffle: shuffle,
16774     sum: sum,
16775     ticks: ticks,
16776     tickIncrement: tickIncrement,
16777     tickStep: tickStep,
16778     transpose: transpose,
16779     variance: variance,
16780     zip: zip,
16781     axisTop: axisTop,
16782     axisRight: axisRight,
16783     axisBottom: axisBottom,
16784     axisLeft: axisLeft,
16785     brush: brush,
16786     brushX: brushX,
16787     brushY: brushY,
16788     brushSelection: brushSelection,
16789     chord: chord,
16790     ribbon: ribbon,
16791     nest: nest,
16792     set: set$2,
16793     map: map$1,
16794     keys: keys,
16795     values: values,
16796     entries: entries,
16797     color: color,
16798     rgb: rgb,
16799     hsl: hsl,
16800     lab: lab,
16801     hcl: hcl,
16802     cubehelix: cubehelix,
16803     dispatch: dispatch,
16804     drag: d3_drag,
16805     dragDisable: dragDisable,
16806     dragEnable: yesdrag,
16807     dsvFormat: dsv,
16808     csvParse: csvParse,
16809     csvParseRows: csvParseRows,
16810     csvFormat: csvFormat,
16811     csvFormatRows: csvFormatRows,
16812     tsvParse: tsvParse,
16813     tsvParseRows: tsvParseRows,
16814     tsvFormat: tsvFormat,
16815     tsvFormatRows: tsvFormatRows,
16816     easeLinear: linear$1,
16817     easeQuad: quadInOut,
16818     easeQuadIn: quadIn,
16819     easeQuadOut: quadOut,
16820     easeQuadInOut: quadInOut,
16821     easeCubic: cubicInOut,
16822     easeCubicIn: cubicIn,
16823     easeCubicOut: cubicOut,
16824     easeCubicInOut: cubicInOut,
16825     easePoly: polyInOut,
16826     easePolyIn: polyIn,
16827     easePolyOut: polyOut,
16828     easePolyInOut: polyInOut,
16829     easeSin: sinInOut,
16830     easeSinIn: sinIn,
16831     easeSinOut: sinOut,
16832     easeSinInOut: sinInOut,
16833     easeExp: expInOut,
16834     easeExpIn: expIn,
16835     easeExpOut: expOut,
16836     easeExpInOut: expInOut,
16837     easeCircle: circleInOut,
16838     easeCircleIn: circleIn,
16839     easeCircleOut: circleOut,
16840     easeCircleInOut: circleInOut,
16841     easeBounce: bounceOut,
16842     easeBounceIn: bounceIn,
16843     easeBounceOut: bounceOut,
16844     easeBounceInOut: bounceInOut,
16845     easeBack: backInOut,
16846     easeBackIn: backIn,
16847     easeBackOut: backOut,
16848     easeBackInOut: backInOut,
16849     easeElastic: elasticOut,
16850     easeElasticIn: elasticIn,
16851     easeElasticOut: elasticOut,
16852     easeElasticInOut: elasticInOut,
16853     forceCenter: center$1,
16854     forceCollide: collide,
16855     forceLink: link,
16856     forceManyBody: manyBody,
16857     forceRadial: radial,
16858     forceSimulation: simulation,
16859     forceX: x$2,
16860     forceY: y$2,
16861     formatDefaultLocale: defaultLocale,
16862     get format () { return format; },
16863     get formatPrefix () { return formatPrefix; },
16864     formatLocale: formatLocale,
16865     formatSpecifier: formatSpecifier,
16866     precisionFixed: precisionFixed,
16867     precisionPrefix: precisionPrefix,
16868     precisionRound: precisionRound,
16869     geoArea: d3_geoArea,
16870     geoBounds: d3_geoBounds,
16871     geoCentroid: d3_geoCentroid,
16872     geoCircle: circle,
16873     geoClipAntimeridian: clipAntimeridian,
16874     geoClipCircle: clipCircle,
16875     geoClipExtent: extent$1,
16876     geoClipRectangle: clipRectangle,
16877     geoContains: contains,
16878     geoDistance: distance,
16879     geoGraticule: graticule,
16880     geoGraticule10: graticule10,
16881     geoInterpolate: interpolate$2,
16882     geoLength: length$1,
16883     geoPath: d3_geoPath,
16884     geoAlbers: albers,
16885     geoAlbersUsa: albersUsa,
16886     geoAzimuthalEqualArea: azimuthalEqualArea,
16887     geoAzimuthalEqualAreaRaw: azimuthalEqualAreaRaw,
16888     geoAzimuthalEquidistant: azimuthalEquidistant,
16889     geoAzimuthalEquidistantRaw: azimuthalEquidistantRaw,
16890     geoConicConformal: conicConformal,
16891     geoConicConformalRaw: conicConformalRaw,
16892     geoConicEqualArea: conicEqualArea,
16893     geoConicEqualAreaRaw: conicEqualAreaRaw,
16894     geoConicEquidistant: conicEquidistant,
16895     geoConicEquidistantRaw: conicEquidistantRaw,
16896     geoEquirectangular: equirectangular,
16897     geoEquirectangularRaw: equirectangularRaw,
16898     geoGnomonic: gnomonic,
16899     geoGnomonicRaw: gnomonicRaw,
16900     geoIdentity: d3_geoIdentity,
16901     geoProjection: projection,
16902     geoProjectionMutator: projectionMutator,
16903     geoMercator: mercator,
16904     geoMercatorRaw: mercatorRaw,
16905     geoNaturalEarth1: naturalEarth1,
16906     geoNaturalEarth1Raw: naturalEarth1Raw,
16907     geoOrthographic: orthographic,
16908     geoOrthographicRaw: orthographicRaw,
16909     geoStereographic: stereographic,
16910     geoStereographicRaw: stereographicRaw,
16911     geoTransverseMercator: transverseMercator,
16912     geoTransverseMercatorRaw: transverseMercatorRaw,
16913     geoRotation: rotation,
16914     geoStream: geoStream,
16915     geoTransform: d3_geoTransform,
16916     cluster: cluster,
16917     hierarchy: hierarchy,
16918     pack: index$1,
16919     packSiblings: siblings,
16920     packEnclose: enclose,
16921     partition: partition,
16922     stratify: stratify,
16923     tree: tree,
16924     treemap: index$2,
16925     treemapBinary: binary,
16926     treemapDice: treemapDice,
16927     treemapSlice: treemapSlice,
16928     treemapSliceDice: sliceDice,
16929     treemapSquarify: squarify,
16930     treemapResquarify: resquarify,
16931     interpolate: interpolate,
16932     interpolateArray: array$1,
16933     interpolateBasis: basis$1,
16934     interpolateBasisClosed: basisClosed,
16935     interpolateDate: date,
16936     interpolateNumber: interpolateNumber,
16937     interpolateObject: object,
16938     interpolateRound: interpolateRound,
16939     interpolateString: interpolateString,
16940     interpolateTransformCss: interpolateTransformCss,
16941     interpolateTransformSvg: interpolateTransformSvg,
16942     interpolateZoom: interpolateZoom,
16943     interpolateRgb: interpolateRgb,
16944     interpolateRgbBasis: rgbBasis,
16945     interpolateRgbBasisClosed: rgbBasisClosed,
16946     interpolateHsl: hsl$2,
16947     interpolateHslLong: hslLong,
16948     interpolateLab: lab$1,
16949     interpolateHcl: hcl$2,
16950     interpolateHclLong: hclLong,
16951     interpolateCubehelix: cubehelix$2,
16952     interpolateCubehelixLong: cubehelixLong,
16953     quantize: d3_quantize,
16954     path: path,
16955     polygonArea: d3_polygonArea,
16956     polygonCentroid: d3_polygonCentroid,
16957     polygonHull: d3_polygonHull,
16958     polygonContains: contains$1,
16959     polygonLength: length$2,
16960     quadtree: quadtree,
16961     queue: queue,
16962     randomUniform: uniform,
16963     randomNormal: normal,
16964     randomLogNormal: logNormal,
16965     randomBates: bates,
16966     randomIrwinHall: irwinHall,
16967     randomExponential: exponential$1,
16968     request: request,
16969     html: html,
16970     json: d3_json,
16971     text: d3_text,
16972     xml: d3_xml,
16973     csv: csv$1,
16974     tsv: tsv$1,
16975     scaleBand: band,
16976     scalePoint: point$1,
16977     scaleIdentity: identity$5,
16978     scaleLinear: linear$2,
16979     scaleLog: log$1,
16980     scaleOrdinal: ordinal,
16981     scaleImplicit: implicit,
16982     scalePow: pow$1,
16983     scaleSqrt: sqrt$1,
16984     scaleQuantile: quantile$1,
16985     scaleQuantize: quantize,
16986     scaleThreshold: threshold,
16987     scaleTime: time,
16988     scaleUtc: utcTime,
16989     schemeCategory10: category10,
16990     schemeCategory20b: category20b,
16991     schemeCategory20c: category20c,
16992     schemeCategory20: category20,
16993     interpolateCubehelixDefault: cubehelix$3,
16994     interpolateRainbow: rainbow$1,
16995     interpolateWarm: warm,
16996     interpolateCool: cool,
16997     interpolateViridis: viridis,
16998     interpolateMagma: magma,
16999     interpolateInferno: inferno,
17000     interpolatePlasma: plasma,
17001     scaleSequential: sequential,
17002     create: create,
17003     creator: creator,
17004     local: local,
17005     matcher: matcher$1,
17006     mouse: mouse,
17007     namespace: namespace,
17008     namespaces: namespaces,
17009     clientPoint: point,
17010     select: select,
17011     selectAll: d3_selectAll,
17012     selection: selection,
17013     selector: selector,
17014     selectorAll: selectorAll,
17015     style: styleValue,
17016     touch: touch,
17017     touches: d3_touches,
17018     window: defaultView,
17019     get event () { return event; },
17020     customEvent: customEvent,
17021     arc: arc,
17022     area: area,
17023     line: line,
17024     pie: pie,
17025     areaRadial: areaRadial,
17026     radialArea: areaRadial,
17027     lineRadial: lineRadial$1,
17028     radialLine: lineRadial$1,
17029     pointRadial: pointRadial,
17030     linkHorizontal: linkHorizontal,
17031     linkVertical: linkVertical,
17032     linkRadial: linkRadial,
17033     symbol: symbol,
17034     symbols: symbols,
17035     symbolCircle: circle$2,
17036     symbolCross: cross$2,
17037     symbolDiamond: diamond,
17038     symbolSquare: square,
17039     symbolStar: star,
17040     symbolTriangle: triangle,
17041     symbolWye: wye,
17042     curveBasisClosed: basisClosed$1,
17043     curveBasisOpen: basisOpen,
17044     curveBasis: basis$2,
17045     curveBundle: bundle,
17046     curveCardinalClosed: cardinalClosed,
17047     curveCardinalOpen: cardinalOpen,
17048     curveCardinal: cardinal,
17049     curveCatmullRomClosed: catmullRomClosed,
17050     curveCatmullRomOpen: catmullRomOpen,
17051     curveCatmullRom: catmullRom,
17052     curveLinearClosed: linearClosed,
17053     curveLinear: curveLinear,
17054     curveMonotoneX: monotoneX,
17055     curveMonotoneY: monotoneY,
17056     curveNatural: natural,
17057     curveStep: step,
17058     curveStepAfter: stepAfter,
17059     curveStepBefore: stepBefore,
17060     stack: stack,
17061     stackOffsetExpand: expand,
17062     stackOffsetDiverging: diverging,
17063     stackOffsetNone: none$1,
17064     stackOffsetSilhouette: silhouette,
17065     stackOffsetWiggle: wiggle,
17066     stackOrderAscending: ascending$2,
17067     stackOrderDescending: descending$1,
17068     stackOrderInsideOut: insideOut,
17069     stackOrderNone: none$2,
17070     stackOrderReverse: reverse,
17071     timeInterval: newInterval,
17072     timeMillisecond: millisecond,
17073     timeMilliseconds: milliseconds,
17074     utcMillisecond: millisecond,
17075     utcMilliseconds: milliseconds,
17076     timeSecond: second,
17077     timeSeconds: seconds,
17078     utcSecond: second,
17079     utcSeconds: seconds,
17080     timeMinute: minute,
17081     timeMinutes: minutes,
17082     timeHour: hour,
17083     timeHours: hours,
17084     timeDay: day,
17085     timeDays: days,
17086     timeWeek: sunday,
17087     timeWeeks: sundays,
17088     timeSunday: sunday,
17089     timeSundays: sundays,
17090     timeMonday: monday,
17091     timeMondays: mondays,
17092     timeTuesday: tuesday,
17093     timeTuesdays: tuesdays,
17094     timeWednesday: wednesday,
17095     timeWednesdays: wednesdays,
17096     timeThursday: thursday,
17097     timeThursdays: thursdays,
17098     timeFriday: friday,
17099     timeFridays: fridays,
17100     timeSaturday: saturday,
17101     timeSaturdays: saturdays,
17102     timeMonth: month,
17103     timeMonths: months,
17104     timeYear: year,
17105     timeYears: years,
17106     utcMinute: utcMinute,
17107     utcMinutes: utcMinutes,
17108     utcHour: utcHour,
17109     utcHours: utcHours,
17110     utcDay: utcDay,
17111     utcDays: utcDays,
17112     utcWeek: utcSunday,
17113     utcWeeks: utcSundays,
17114     utcSunday: utcSunday,
17115     utcSundays: utcSundays,
17116     utcMonday: utcMonday,
17117     utcMondays: utcMondays,
17118     utcTuesday: utcTuesday,
17119     utcTuesdays: utcTuesdays,
17120     utcWednesday: utcWednesday,
17121     utcWednesdays: utcWednesdays,
17122     utcThursday: utcThursday,
17123     utcThursdays: utcThursdays,
17124     utcFriday: utcFriday,
17125     utcFridays: utcFridays,
17126     utcSaturday: utcSaturday,
17127     utcSaturdays: utcSaturdays,
17128     utcMonth: utcMonth,
17129     utcMonths: utcMonths,
17130     utcYear: utcYear,
17131     utcYears: utcYears,
17132     timeFormatDefaultLocale: defaultLocale$1,
17133     get timeFormat () { return timeFormat; },
17134     get timeParse () { return timeParse; },
17135     get utcFormat () { return utcFormat; },
17136     get utcParse () { return utcParse; },
17137     timeFormatLocale: formatLocale$1,
17138     isoFormat: formatIso,
17139     isoParse: parseIso,
17140     now: now,
17141     timer: timer,
17142     timerFlush: timerFlush,
17143     timeout: timeout$1,
17144     interval: interval$1,
17145     transition: transition,
17146     active: active,
17147     interrupt: interrupt,
17148     voronoi: voronoi,
17149     zoom: d3_zoom,
17150     zoomTransform: transform,
17151     zoomIdentity: identity$7
17152   });
17153
17154   function actionAddEntity(way) {
17155       return function(graph) {
17156           return graph.replace(way);
17157       };
17158   }
17159
17160   /**
17161    * Removes all key-value entries from the list cache.
17162    *
17163    * @private
17164    * @name clear
17165    * @memberOf ListCache
17166    */
17167   function listCacheClear() {
17168     this.__data__ = [];
17169     this.size = 0;
17170   }
17171
17172   /**
17173    * Performs a
17174    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
17175    * comparison between two values to determine if they are equivalent.
17176    *
17177    * @static
17178    * @memberOf _
17179    * @since 4.0.0
17180    * @category Lang
17181    * @param {*} value The value to compare.
17182    * @param {*} other The other value to compare.
17183    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
17184    * @example
17185    *
17186    * var object = { 'a': 1 };
17187    * var other = { 'a': 1 };
17188    *
17189    * _.eq(object, object);
17190    * // => true
17191    *
17192    * _.eq(object, other);
17193    * // => false
17194    *
17195    * _.eq('a', 'a');
17196    * // => true
17197    *
17198    * _.eq('a', Object('a'));
17199    * // => false
17200    *
17201    * _.eq(NaN, NaN);
17202    * // => true
17203    */
17204   function eq(value, other) {
17205     return value === other || (value !== value && other !== other);
17206   }
17207
17208   /**
17209    * Gets the index at which the `key` is found in `array` of key-value pairs.
17210    *
17211    * @private
17212    * @param {Array} array The array to inspect.
17213    * @param {*} key The key to search for.
17214    * @returns {number} Returns the index of the matched value, else `-1`.
17215    */
17216   function assocIndexOf(array, key) {
17217     var length = array.length;
17218     while (length--) {
17219       if (eq(array[length][0], key)) {
17220         return length;
17221       }
17222     }
17223     return -1;
17224   }
17225
17226   /** Used for built-in method references. */
17227   var arrayProto = Array.prototype;
17228
17229   /** Built-in value references. */
17230   var splice = arrayProto.splice;
17231
17232   /**
17233    * Removes `key` and its value from the list cache.
17234    *
17235    * @private
17236    * @name delete
17237    * @memberOf ListCache
17238    * @param {string} key The key of the value to remove.
17239    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17240    */
17241   function listCacheDelete(key) {
17242     var data = this.__data__,
17243         index = assocIndexOf(data, key);
17244
17245     if (index < 0) {
17246       return false;
17247     }
17248     var lastIndex = data.length - 1;
17249     if (index == lastIndex) {
17250       data.pop();
17251     } else {
17252       splice.call(data, index, 1);
17253     }
17254     --this.size;
17255     return true;
17256   }
17257
17258   /**
17259    * Gets the list cache value for `key`.
17260    *
17261    * @private
17262    * @name get
17263    * @memberOf ListCache
17264    * @param {string} key The key of the value to get.
17265    * @returns {*} Returns the entry value.
17266    */
17267   function listCacheGet(key) {
17268     var data = this.__data__,
17269         index = assocIndexOf(data, key);
17270
17271     return index < 0 ? undefined : data[index][1];
17272   }
17273
17274   /**
17275    * Checks if a list cache value for `key` exists.
17276    *
17277    * @private
17278    * @name has
17279    * @memberOf ListCache
17280    * @param {string} key The key of the entry to check.
17281    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17282    */
17283   function listCacheHas(key) {
17284     return assocIndexOf(this.__data__, key) > -1;
17285   }
17286
17287   /**
17288    * Sets the list cache `key` to `value`.
17289    *
17290    * @private
17291    * @name set
17292    * @memberOf ListCache
17293    * @param {string} key The key of the value to set.
17294    * @param {*} value The value to set.
17295    * @returns {Object} Returns the list cache instance.
17296    */
17297   function listCacheSet(key, value) {
17298     var data = this.__data__,
17299         index = assocIndexOf(data, key);
17300
17301     if (index < 0) {
17302       ++this.size;
17303       data.push([key, value]);
17304     } else {
17305       data[index][1] = value;
17306     }
17307     return this;
17308   }
17309
17310   /**
17311    * Creates an list cache object.
17312    *
17313    * @private
17314    * @constructor
17315    * @param {Array} [entries] The key-value pairs to cache.
17316    */
17317   function ListCache(entries) {
17318     var index = -1,
17319         length = entries == null ? 0 : entries.length;
17320
17321     this.clear();
17322     while (++index < length) {
17323       var entry = entries[index];
17324       this.set(entry[0], entry[1]);
17325     }
17326   }
17327
17328   // Add methods to `ListCache`.
17329   ListCache.prototype.clear = listCacheClear;
17330   ListCache.prototype['delete'] = listCacheDelete;
17331   ListCache.prototype.get = listCacheGet;
17332   ListCache.prototype.has = listCacheHas;
17333   ListCache.prototype.set = listCacheSet;
17334
17335   /**
17336    * Removes all key-value entries from the stack.
17337    *
17338    * @private
17339    * @name clear
17340    * @memberOf Stack
17341    */
17342   function stackClear() {
17343     this.__data__ = new ListCache;
17344     this.size = 0;
17345   }
17346
17347   /**
17348    * Removes `key` and its value from the stack.
17349    *
17350    * @private
17351    * @name delete
17352    * @memberOf Stack
17353    * @param {string} key The key of the value to remove.
17354    * @returns {boolean} Returns `true` if the entry was removed, else `false`.
17355    */
17356   function stackDelete(key) {
17357     var data = this.__data__,
17358         result = data['delete'](key);
17359
17360     this.size = data.size;
17361     return result;
17362   }
17363
17364   /**
17365    * Gets the stack value for `key`.
17366    *
17367    * @private
17368    * @name get
17369    * @memberOf Stack
17370    * @param {string} key The key of the value to get.
17371    * @returns {*} Returns the entry value.
17372    */
17373   function stackGet(key) {
17374     return this.__data__.get(key);
17375   }
17376
17377   /**
17378    * Checks if a stack value for `key` exists.
17379    *
17380    * @private
17381    * @name has
17382    * @memberOf Stack
17383    * @param {string} key The key of the entry to check.
17384    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
17385    */
17386   function stackHas(key) {
17387     return this.__data__.has(key);
17388   }
17389
17390   /** Detect free variable `global` from Node.js. */
17391   var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;
17392
17393   /** Detect free variable `self`. */
17394   var freeSelf = typeof self == 'object' && self && self.Object === Object && self;
17395
17396   /** Used as a reference to the global object. */
17397   var root$2 = freeGlobal || freeSelf || Function('return this')();
17398
17399   /** Built-in value references. */
17400   var Symbol = root$2.Symbol;
17401
17402   /** Used for built-in method references. */
17403   var objectProto = Object.prototype;
17404
17405   /** Used to check objects for own properties. */
17406   var hasOwnProperty = objectProto.hasOwnProperty;
17407
17408   /**
17409    * Used to resolve the
17410    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
17411    * of values.
17412    */
17413   var nativeObjectToString = objectProto.toString;
17414
17415   /** Built-in value references. */
17416   var symToStringTag = Symbol ? Symbol.toStringTag : undefined;
17417
17418   /**
17419    * A specialized version of `baseGetTag` which ignores `Symbol.toStringTag` values.
17420    *
17421    * @private
17422    * @param {*} value The value to query.
17423    * @returns {string} Returns the raw `toStringTag`.
17424    */
17425   function getRawTag(value) {
17426     var isOwn = hasOwnProperty.call(value, symToStringTag),
17427         tag = value[symToStringTag];
17428
17429     try {
17430       value[symToStringTag] = undefined;
17431     } catch (e) {}
17432
17433     var result = nativeObjectToString.call(value);
17434     {
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       // Use `util.types` for Node.js 10+.
18388       var types = freeModule$1 && freeModule$1.require && freeModule$1.require('util').types;
18389
18390       if (types) {
18391         return types;
18392       }
18393
18394       // Legacy `process.binding('util')` for Node.js < 10.
18395       return freeProcess && freeProcess.binding && freeProcess.binding('util');
18396     } catch (e) {}
18397   }());
18398
18399   /* Node.js helper references. */
18400   var nodeIsTypedArray = nodeUtil && nodeUtil.isTypedArray;
18401
18402   /**
18403    * Checks if `value` is classified as a typed array.
18404    *
18405    * @static
18406    * @memberOf _
18407    * @since 3.0.0
18408    * @category Lang
18409    * @param {*} value The value to check.
18410    * @returns {boolean} Returns `true` if `value` is a typed array, else `false`.
18411    * @example
18412    *
18413    * _.isTypedArray(new Uint8Array);
18414    * // => true
18415    *
18416    * _.isTypedArray([]);
18417    * // => false
18418    */
18419   var isTypedArray = nodeIsTypedArray ? baseUnary(nodeIsTypedArray) : baseIsTypedArray;
18420
18421   /** Used for built-in method references. */
18422   var objectProto$7 = Object.prototype;
18423
18424   /** Used to check objects for own properties. */
18425   var hasOwnProperty$6 = objectProto$7.hasOwnProperty;
18426
18427   /**
18428    * Creates an array of the enumerable property names of the array-like `value`.
18429    *
18430    * @private
18431    * @param {*} value The value to query.
18432    * @param {boolean} inherited Specify returning inherited property names.
18433    * @returns {Array} Returns the array of property names.
18434    */
18435   function arrayLikeKeys(value, inherited) {
18436     var isArr = isArray(value),
18437         isArg = !isArr && isArguments(value),
18438         isBuff = !isArr && !isArg && isBuffer(value),
18439         isType = !isArr && !isArg && !isBuff && isTypedArray(value),
18440         skipIndexes = isArr || isArg || isBuff || isType,
18441         result = skipIndexes ? baseTimes(value.length, String) : [],
18442         length = result.length;
18443
18444     for (var key in value) {
18445       if ((inherited || hasOwnProperty$6.call(value, key)) &&
18446           !(skipIndexes && (
18447              // Safari 9 has enumerable `arguments.length` in strict mode.
18448              key == 'length' ||
18449              // Node.js 0.10 has enumerable non-index properties on buffers.
18450              (isBuff && (key == 'offset' || key == 'parent')) ||
18451              // PhantomJS 2 has enumerable non-index properties on typed arrays.
18452              (isType && (key == 'buffer' || key == 'byteLength' || key == 'byteOffset')) ||
18453              // Skip index properties.
18454              isIndex(key, length)
18455           ))) {
18456         result.push(key);
18457       }
18458     }
18459     return result;
18460   }
18461
18462   /** Used for built-in method references. */
18463   var objectProto$8 = Object.prototype;
18464
18465   /**
18466    * Checks if `value` is likely a prototype object.
18467    *
18468    * @private
18469    * @param {*} value The value to check.
18470    * @returns {boolean} Returns `true` if `value` is a prototype, else `false`.
18471    */
18472   function isPrototype(value) {
18473     var Ctor = value && value.constructor,
18474         proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto$8;
18475
18476     return value === proto;
18477   }
18478
18479   /**
18480    * Creates a unary function that invokes `func` with its argument transformed.
18481    *
18482    * @private
18483    * @param {Function} func The function to wrap.
18484    * @param {Function} transform The argument transform.
18485    * @returns {Function} Returns the new function.
18486    */
18487   function overArg(func, transform) {
18488     return function(arg) {
18489       return func(transform(arg));
18490     };
18491   }
18492
18493   /* Built-in method references for those with the same name as other `lodash` methods. */
18494   var nativeKeys = overArg(Object.keys, Object);
18495
18496   /** Used for built-in method references. */
18497   var objectProto$9 = Object.prototype;
18498
18499   /** Used to check objects for own properties. */
18500   var hasOwnProperty$7 = objectProto$9.hasOwnProperty;
18501
18502   /**
18503    * The base implementation of `_.keys` which doesn't treat sparse arrays as dense.
18504    *
18505    * @private
18506    * @param {Object} object The object to query.
18507    * @returns {Array} Returns the array of property names.
18508    */
18509   function baseKeys(object) {
18510     if (!isPrototype(object)) {
18511       return nativeKeys(object);
18512     }
18513     var result = [];
18514     for (var key in Object(object)) {
18515       if (hasOwnProperty$7.call(object, key) && key != 'constructor') {
18516         result.push(key);
18517       }
18518     }
18519     return result;
18520   }
18521
18522   /**
18523    * Checks if `value` is array-like. A value is considered array-like if it's
18524    * not a function and has a `value.length` that's an integer greater than or
18525    * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`.
18526    *
18527    * @static
18528    * @memberOf _
18529    * @since 4.0.0
18530    * @category Lang
18531    * @param {*} value The value to check.
18532    * @returns {boolean} Returns `true` if `value` is array-like, else `false`.
18533    * @example
18534    *
18535    * _.isArrayLike([1, 2, 3]);
18536    * // => true
18537    *
18538    * _.isArrayLike(document.body.children);
18539    * // => true
18540    *
18541    * _.isArrayLike('abc');
18542    * // => true
18543    *
18544    * _.isArrayLike(_.noop);
18545    * // => false
18546    */
18547   function isArrayLike(value) {
18548     return value != null && isLength(value.length) && !isFunction(value);
18549   }
18550
18551   /**
18552    * Creates an array of the own enumerable property names of `object`.
18553    *
18554    * **Note:** Non-object values are coerced to objects. See the
18555    * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18556    * for more details.
18557    *
18558    * @static
18559    * @since 0.1.0
18560    * @memberOf _
18561    * @category Object
18562    * @param {Object} object The object to query.
18563    * @returns {Array} Returns the array of property names.
18564    * @example
18565    *
18566    * function Foo() {
18567    *   this.a = 1;
18568    *   this.b = 2;
18569    * }
18570    *
18571    * Foo.prototype.c = 3;
18572    *
18573    * _.keys(new Foo);
18574    * // => ['a', 'b'] (iteration order is not guaranteed)
18575    *
18576    * _.keys('hi');
18577    * // => ['0', '1']
18578    */
18579   function keys$1(object) {
18580     return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);
18581   }
18582
18583   /**
18584    * The base implementation of `_.assign` without support for multiple sources
18585    * or `customizer` functions.
18586    *
18587    * @private
18588    * @param {Object} object The destination object.
18589    * @param {Object} source The source object.
18590    * @returns {Object} Returns `object`.
18591    */
18592   function baseAssign(object, source) {
18593     return object && copyObject(source, keys$1(source), object);
18594   }
18595
18596   /**
18597    * This function is like
18598    * [`Object.keys`](http://ecma-international.org/ecma-262/7.0/#sec-object.keys)
18599    * except that it includes inherited enumerable properties.
18600    *
18601    * @private
18602    * @param {Object} object The object to query.
18603    * @returns {Array} Returns the array of property names.
18604    */
18605   function nativeKeysIn(object) {
18606     var result = [];
18607     if (object != null) {
18608       for (var key in Object(object)) {
18609         result.push(key);
18610       }
18611     }
18612     return result;
18613   }
18614
18615   /** Used for built-in method references. */
18616   var objectProto$a = Object.prototype;
18617
18618   /** Used to check objects for own properties. */
18619   var hasOwnProperty$8 = objectProto$a.hasOwnProperty;
18620
18621   /**
18622    * The base implementation of `_.keysIn` which doesn't treat sparse arrays as dense.
18623    *
18624    * @private
18625    * @param {Object} object The object to query.
18626    * @returns {Array} Returns the array of property names.
18627    */
18628   function baseKeysIn(object) {
18629     if (!isObject(object)) {
18630       return nativeKeysIn(object);
18631     }
18632     var isProto = isPrototype(object),
18633         result = [];
18634
18635     for (var key in object) {
18636       if (!(key == 'constructor' && (isProto || !hasOwnProperty$8.call(object, key)))) {
18637         result.push(key);
18638       }
18639     }
18640     return result;
18641   }
18642
18643   /**
18644    * Creates an array of the own and inherited enumerable property names of `object`.
18645    *
18646    * **Note:** Non-object values are coerced to objects.
18647    *
18648    * @static
18649    * @memberOf _
18650    * @since 3.0.0
18651    * @category Object
18652    * @param {Object} object The object to query.
18653    * @returns {Array} Returns the array of property names.
18654    * @example
18655    *
18656    * function Foo() {
18657    *   this.a = 1;
18658    *   this.b = 2;
18659    * }
18660    *
18661    * Foo.prototype.c = 3;
18662    *
18663    * _.keysIn(new Foo);
18664    * // => ['a', 'b', 'c'] (iteration order is not guaranteed)
18665    */
18666   function keysIn$1(object) {
18667     return isArrayLike(object) ? arrayLikeKeys(object, true) : baseKeysIn(object);
18668   }
18669
18670   /**
18671    * The base implementation of `_.assignIn` without support for multiple sources
18672    * or `customizer` functions.
18673    *
18674    * @private
18675    * @param {Object} object The destination object.
18676    * @param {Object} source The source object.
18677    * @returns {Object} Returns `object`.
18678    */
18679   function baseAssignIn(object, source) {
18680     return object && copyObject(source, keysIn$1(source), object);
18681   }
18682
18683   /** Detect free variable `exports`. */
18684   var freeExports$2 = typeof exports == 'object' && exports && !exports.nodeType && exports;
18685
18686   /** Detect free variable `module`. */
18687   var freeModule$2 = freeExports$2 && typeof module == 'object' && module && !module.nodeType && module;
18688
18689   /** Detect the popular CommonJS extension `module.exports`. */
18690   var moduleExports$2 = freeModule$2 && freeModule$2.exports === freeExports$2;
18691
18692   /** Built-in value references. */
18693   var Buffer$1 = moduleExports$2 ? root$2.Buffer : undefined,
18694       allocUnsafe = Buffer$1 ? Buffer$1.allocUnsafe : undefined;
18695
18696   /**
18697    * Creates a clone of  `buffer`.
18698    *
18699    * @private
18700    * @param {Buffer} buffer The buffer to clone.
18701    * @param {boolean} [isDeep] Specify a deep clone.
18702    * @returns {Buffer} Returns the cloned buffer.
18703    */
18704   function cloneBuffer(buffer, isDeep) {
18705     if (isDeep) {
18706       return buffer.slice();
18707     }
18708     var length = buffer.length,
18709         result = allocUnsafe ? allocUnsafe(length) : new buffer.constructor(length);
18710
18711     buffer.copy(result);
18712     return result;
18713   }
18714
18715   /**
18716    * Copies the values of `source` to `array`.
18717    *
18718    * @private
18719    * @param {Array} source The array to copy values from.
18720    * @param {Array} [array=[]] The array to copy values to.
18721    * @returns {Array} Returns `array`.
18722    */
18723   function copyArray(source, array) {
18724     var index = -1,
18725         length = source.length;
18726
18727     array || (array = Array(length));
18728     while (++index < length) {
18729       array[index] = source[index];
18730     }
18731     return array;
18732   }
18733
18734   /**
18735    * A specialized version of `_.filter` for arrays without support for
18736    * iteratee shorthands.
18737    *
18738    * @private
18739    * @param {Array} [array] The array to iterate over.
18740    * @param {Function} predicate The function invoked per iteration.
18741    * @returns {Array} Returns the new filtered array.
18742    */
18743   function arrayFilter(array, predicate) {
18744     var index = -1,
18745         length = array == null ? 0 : array.length,
18746         resIndex = 0,
18747         result = [];
18748
18749     while (++index < length) {
18750       var value = array[index];
18751       if (predicate(value, index, array)) {
18752         result[resIndex++] = value;
18753       }
18754     }
18755     return result;
18756   }
18757
18758   /**
18759    * This method returns a new empty array.
18760    *
18761    * @static
18762    * @memberOf _
18763    * @since 4.13.0
18764    * @category Util
18765    * @returns {Array} Returns the new empty array.
18766    * @example
18767    *
18768    * var arrays = _.times(2, _.stubArray);
18769    *
18770    * console.log(arrays);
18771    * // => [[], []]
18772    *
18773    * console.log(arrays[0] === arrays[1]);
18774    * // => false
18775    */
18776   function stubArray() {
18777     return [];
18778   }
18779
18780   /** Used for built-in method references. */
18781   var objectProto$b = Object.prototype;
18782
18783   /** Built-in value references. */
18784   var propertyIsEnumerable$1 = objectProto$b.propertyIsEnumerable;
18785
18786   /* Built-in method references for those with the same name as other `lodash` methods. */
18787   var nativeGetSymbols = Object.getOwnPropertySymbols;
18788
18789   /**
18790    * Creates an array of the own enumerable symbols of `object`.
18791    *
18792    * @private
18793    * @param {Object} object The object to query.
18794    * @returns {Array} Returns the array of symbols.
18795    */
18796   var getSymbols = !nativeGetSymbols ? stubArray : function(object) {
18797     if (object == null) {
18798       return [];
18799     }
18800     object = Object(object);
18801     return arrayFilter(nativeGetSymbols(object), function(symbol) {
18802       return propertyIsEnumerable$1.call(object, symbol);
18803     });
18804   };
18805
18806   /**
18807    * Copies own symbols of `source` to `object`.
18808    *
18809    * @private
18810    * @param {Object} source The object to copy symbols from.
18811    * @param {Object} [object={}] The object to copy symbols to.
18812    * @returns {Object} Returns `object`.
18813    */
18814   function copySymbols(source, object) {
18815     return copyObject(source, getSymbols(source), object);
18816   }
18817
18818   /**
18819    * Appends the elements of `values` to `array`.
18820    *
18821    * @private
18822    * @param {Array} array The array to modify.
18823    * @param {Array} values The values to append.
18824    * @returns {Array} Returns `array`.
18825    */
18826   function arrayPush(array, values) {
18827     var index = -1,
18828         length = values.length,
18829         offset = array.length;
18830
18831     while (++index < length) {
18832       array[offset + index] = values[index];
18833     }
18834     return array;
18835   }
18836
18837   /** Built-in value references. */
18838   var getPrototype = overArg(Object.getPrototypeOf, Object);
18839
18840   /* Built-in method references for those with the same name as other `lodash` methods. */
18841   var nativeGetSymbols$1 = Object.getOwnPropertySymbols;
18842
18843   /**
18844    * Creates an array of the own and inherited enumerable symbols of `object`.
18845    *
18846    * @private
18847    * @param {Object} object The object to query.
18848    * @returns {Array} Returns the array of symbols.
18849    */
18850   var getSymbolsIn = !nativeGetSymbols$1 ? stubArray : function(object) {
18851     var result = [];
18852     while (object) {
18853       arrayPush(result, getSymbols(object));
18854       object = getPrototype(object);
18855     }
18856     return result;
18857   };
18858
18859   /**
18860    * Copies own and inherited symbols of `source` to `object`.
18861    *
18862    * @private
18863    * @param {Object} source The object to copy symbols from.
18864    * @param {Object} [object={}] The object to copy symbols to.
18865    * @returns {Object} Returns `object`.
18866    */
18867   function copySymbolsIn(source, object) {
18868     return copyObject(source, getSymbolsIn(source), object);
18869   }
18870
18871   /**
18872    * The base implementation of `getAllKeys` and `getAllKeysIn` which uses
18873    * `keysFunc` and `symbolsFunc` to get the enumerable property names and
18874    * symbols of `object`.
18875    *
18876    * @private
18877    * @param {Object} object The object to query.
18878    * @param {Function} keysFunc The function to get the keys of `object`.
18879    * @param {Function} symbolsFunc The function to get the symbols of `object`.
18880    * @returns {Array} Returns the array of property names and symbols.
18881    */
18882   function baseGetAllKeys(object, keysFunc, symbolsFunc) {
18883     var result = keysFunc(object);
18884     return isArray(object) ? result : arrayPush(result, symbolsFunc(object));
18885   }
18886
18887   /**
18888    * Creates an array of own enumerable property names and symbols of `object`.
18889    *
18890    * @private
18891    * @param {Object} object The object to query.
18892    * @returns {Array} Returns the array of property names and symbols.
18893    */
18894   function getAllKeys(object) {
18895     return baseGetAllKeys(object, keys$1, getSymbols);
18896   }
18897
18898   /**
18899    * Creates an array of own and inherited enumerable property names and
18900    * symbols of `object`.
18901    *
18902    * @private
18903    * @param {Object} object The object to query.
18904    * @returns {Array} Returns the array of property names and symbols.
18905    */
18906   function getAllKeysIn(object) {
18907     return baseGetAllKeys(object, keysIn$1, getSymbolsIn);
18908   }
18909
18910   /* Built-in method references that are verified to be native. */
18911   var DataView = getNative(root$2, 'DataView');
18912
18913   /* Built-in method references that are verified to be native. */
18914   var Promise = getNative(root$2, 'Promise');
18915
18916   /* Built-in method references that are verified to be native. */
18917   var Set$1 = getNative(root$2, 'Set');
18918
18919   /* Built-in method references that are verified to be native. */
18920   var WeakMap = getNative(root$2, 'WeakMap');
18921
18922   /** `Object#toString` result references. */
18923   var mapTag$1 = '[object Map]',
18924       objectTag$1 = '[object Object]',
18925       promiseTag = '[object Promise]',
18926       setTag$1 = '[object Set]',
18927       weakMapTag$1 = '[object WeakMap]';
18928
18929   var dataViewTag$1 = '[object DataView]';
18930
18931   /** Used to detect maps, sets, and weakmaps. */
18932   var dataViewCtorString = toSource(DataView),
18933       mapCtorString = toSource(Map$1),
18934       promiseCtorString = toSource(Promise),
18935       setCtorString = toSource(Set$1),
18936       weakMapCtorString = toSource(WeakMap);
18937
18938   /**
18939    * Gets the `toStringTag` of `value`.
18940    *
18941    * @private
18942    * @param {*} value The value to query.
18943    * @returns {string} Returns the `toStringTag`.
18944    */
18945   var getTag = baseGetTag;
18946
18947   // Fallback for data views, maps, sets, and weak maps in IE 11 and promises in Node.js < 6.
18948   if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag$1) ||
18949       (Map$1 && getTag(new Map$1) != mapTag$1) ||
18950       (Promise && getTag(Promise.resolve()) != promiseTag) ||
18951       (Set$1 && getTag(new Set$1) != setTag$1) ||
18952       (WeakMap && getTag(new WeakMap) != weakMapTag$1)) {
18953     getTag = function(value) {
18954       var result = baseGetTag(value),
18955           Ctor = result == objectTag$1 ? value.constructor : undefined,
18956           ctorString = Ctor ? toSource(Ctor) : '';
18957
18958       if (ctorString) {
18959         switch (ctorString) {
18960           case dataViewCtorString: return dataViewTag$1;
18961           case mapCtorString: return mapTag$1;
18962           case promiseCtorString: return promiseTag;
18963           case setCtorString: return setTag$1;
18964           case weakMapCtorString: return weakMapTag$1;
18965         }
18966       }
18967       return result;
18968     };
18969   }
18970
18971   var getTag$1 = getTag;
18972
18973   /** Used for built-in method references. */
18974   var objectProto$c = Object.prototype;
18975
18976   /** Used to check objects for own properties. */
18977   var hasOwnProperty$9 = objectProto$c.hasOwnProperty;
18978
18979   /**
18980    * Initializes an array clone.
18981    *
18982    * @private
18983    * @param {Array} array The array to clone.
18984    * @returns {Array} Returns the initialized clone.
18985    */
18986   function initCloneArray(array) {
18987     var length = array.length,
18988         result = new array.constructor(length);
18989
18990     // Add properties assigned by `RegExp#exec`.
18991     if (length && typeof array[0] == 'string' && hasOwnProperty$9.call(array, 'index')) {
18992       result.index = array.index;
18993       result.input = array.input;
18994     }
18995     return result;
18996   }
18997
18998   /** Built-in value references. */
18999   var Uint8Array$1 = root$2.Uint8Array;
19000
19001   /**
19002    * Creates a clone of `arrayBuffer`.
19003    *
19004    * @private
19005    * @param {ArrayBuffer} arrayBuffer The array buffer to clone.
19006    * @returns {ArrayBuffer} Returns the cloned array buffer.
19007    */
19008   function cloneArrayBuffer(arrayBuffer) {
19009     var result = new arrayBuffer.constructor(arrayBuffer.byteLength);
19010     new Uint8Array$1(result).set(new Uint8Array$1(arrayBuffer));
19011     return result;
19012   }
19013
19014   /**
19015    * Creates a clone of `dataView`.
19016    *
19017    * @private
19018    * @param {Object} dataView The data view to clone.
19019    * @param {boolean} [isDeep] Specify a deep clone.
19020    * @returns {Object} Returns the cloned data view.
19021    */
19022   function cloneDataView(dataView, isDeep) {
19023     var buffer = isDeep ? cloneArrayBuffer(dataView.buffer) : dataView.buffer;
19024     return new dataView.constructor(buffer, dataView.byteOffset, dataView.byteLength);
19025   }
19026
19027   /** Used to match `RegExp` flags from their coerced string values. */
19028   var reFlags = /\w*$/;
19029
19030   /**
19031    * Creates a clone of `regexp`.
19032    *
19033    * @private
19034    * @param {Object} regexp The regexp to clone.
19035    * @returns {Object} Returns the cloned regexp.
19036    */
19037   function cloneRegExp(regexp) {
19038     var result = new regexp.constructor(regexp.source, reFlags.exec(regexp));
19039     result.lastIndex = regexp.lastIndex;
19040     return result;
19041   }
19042
19043   /** Used to convert symbols to primitives and strings. */
19044   var symbolProto = Symbol ? Symbol.prototype : undefined,
19045       symbolValueOf = symbolProto ? symbolProto.valueOf : undefined;
19046
19047   /**
19048    * Creates a clone of the `symbol` object.
19049    *
19050    * @private
19051    * @param {Object} symbol The symbol object to clone.
19052    * @returns {Object} Returns the cloned symbol object.
19053    */
19054   function cloneSymbol(symbol) {
19055     return symbolValueOf ? Object(symbolValueOf.call(symbol)) : {};
19056   }
19057
19058   /**
19059    * Creates a clone of `typedArray`.
19060    *
19061    * @private
19062    * @param {Object} typedArray The typed array to clone.
19063    * @param {boolean} [isDeep] Specify a deep clone.
19064    * @returns {Object} Returns the cloned typed array.
19065    */
19066   function cloneTypedArray(typedArray, isDeep) {
19067     var buffer = isDeep ? cloneArrayBuffer(typedArray.buffer) : typedArray.buffer;
19068     return new typedArray.constructor(buffer, typedArray.byteOffset, typedArray.length);
19069   }
19070
19071   /** `Object#toString` result references. */
19072   var boolTag$1 = '[object Boolean]',
19073       dateTag$1 = '[object Date]',
19074       mapTag$2 = '[object Map]',
19075       numberTag$1 = '[object Number]',
19076       regexpTag$1 = '[object RegExp]',
19077       setTag$2 = '[object Set]',
19078       stringTag$1 = '[object String]',
19079       symbolTag = '[object Symbol]';
19080
19081   var arrayBufferTag$1 = '[object ArrayBuffer]',
19082       dataViewTag$2 = '[object DataView]',
19083       float32Tag$1 = '[object Float32Array]',
19084       float64Tag$1 = '[object Float64Array]',
19085       int8Tag$1 = '[object Int8Array]',
19086       int16Tag$1 = '[object Int16Array]',
19087       int32Tag$1 = '[object Int32Array]',
19088       uint8Tag$1 = '[object Uint8Array]',
19089       uint8ClampedTag$1 = '[object Uint8ClampedArray]',
19090       uint16Tag$1 = '[object Uint16Array]',
19091       uint32Tag$1 = '[object Uint32Array]';
19092
19093   /**
19094    * Initializes an object clone based on its `toStringTag`.
19095    *
19096    * **Note:** This function only supports cloning values with tags of
19097    * `Boolean`, `Date`, `Error`, `Map`, `Number`, `RegExp`, `Set`, or `String`.
19098    *
19099    * @private
19100    * @param {Object} object The object to clone.
19101    * @param {string} tag The `toStringTag` of the object to clone.
19102    * @param {boolean} [isDeep] Specify a deep clone.
19103    * @returns {Object} Returns the initialized clone.
19104    */
19105   function initCloneByTag(object, tag, isDeep) {
19106     var Ctor = object.constructor;
19107     switch (tag) {
19108       case arrayBufferTag$1:
19109         return cloneArrayBuffer(object);
19110
19111       case boolTag$1:
19112       case dateTag$1:
19113         return new Ctor(+object);
19114
19115       case dataViewTag$2:
19116         return cloneDataView(object, isDeep);
19117
19118       case float32Tag$1: case float64Tag$1:
19119       case int8Tag$1: case int16Tag$1: case int32Tag$1:
19120       case uint8Tag$1: case uint8ClampedTag$1: case uint16Tag$1: case uint32Tag$1:
19121         return cloneTypedArray(object, isDeep);
19122
19123       case mapTag$2:
19124         return new Ctor;
19125
19126       case numberTag$1:
19127       case stringTag$1:
19128         return new Ctor(object);
19129
19130       case regexpTag$1:
19131         return cloneRegExp(object);
19132
19133       case setTag$2:
19134         return new Ctor;
19135
19136       case symbolTag:
19137         return cloneSymbol(object);
19138     }
19139   }
19140
19141   /** Built-in value references. */
19142   var objectCreate = Object.create;
19143
19144   /**
19145    * The base implementation of `_.create` without support for assigning
19146    * properties to the created object.
19147    *
19148    * @private
19149    * @param {Object} proto The object to inherit from.
19150    * @returns {Object} Returns the new object.
19151    */
19152   var baseCreate = (function() {
19153     function object() {}
19154     return function(proto) {
19155       if (!isObject(proto)) {
19156         return {};
19157       }
19158       if (objectCreate) {
19159         return objectCreate(proto);
19160       }
19161       object.prototype = proto;
19162       var result = new object;
19163       object.prototype = undefined;
19164       return result;
19165     };
19166   }());
19167
19168   /**
19169    * Initializes an object clone.
19170    *
19171    * @private
19172    * @param {Object} object The object to clone.
19173    * @returns {Object} Returns the initialized clone.
19174    */
19175   function initCloneObject(object) {
19176     return (typeof object.constructor == 'function' && !isPrototype(object))
19177       ? baseCreate(getPrototype(object))
19178       : {};
19179   }
19180
19181   /** `Object#toString` result references. */
19182   var mapTag$3 = '[object Map]';
19183
19184   /**
19185    * The base implementation of `_.isMap` without Node.js optimizations.
19186    *
19187    * @private
19188    * @param {*} value The value to check.
19189    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19190    */
19191   function baseIsMap(value) {
19192     return isObjectLike(value) && getTag$1(value) == mapTag$3;
19193   }
19194
19195   /* Node.js helper references. */
19196   var nodeIsMap = nodeUtil && nodeUtil.isMap;
19197
19198   /**
19199    * Checks if `value` is classified as a `Map` object.
19200    *
19201    * @static
19202    * @memberOf _
19203    * @since 4.3.0
19204    * @category Lang
19205    * @param {*} value The value to check.
19206    * @returns {boolean} Returns `true` if `value` is a map, else `false`.
19207    * @example
19208    *
19209    * _.isMap(new Map);
19210    * // => true
19211    *
19212    * _.isMap(new WeakMap);
19213    * // => false
19214    */
19215   var isMap = nodeIsMap ? baseUnary(nodeIsMap) : baseIsMap;
19216
19217   /** `Object#toString` result references. */
19218   var setTag$3 = '[object Set]';
19219
19220   /**
19221    * The base implementation of `_.isSet` without Node.js optimizations.
19222    *
19223    * @private
19224    * @param {*} value The value to check.
19225    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19226    */
19227   function baseIsSet(value) {
19228     return isObjectLike(value) && getTag$1(value) == setTag$3;
19229   }
19230
19231   /* Node.js helper references. */
19232   var nodeIsSet = nodeUtil && nodeUtil.isSet;
19233
19234   /**
19235    * Checks if `value` is classified as a `Set` object.
19236    *
19237    * @static
19238    * @memberOf _
19239    * @since 4.3.0
19240    * @category Lang
19241    * @param {*} value The value to check.
19242    * @returns {boolean} Returns `true` if `value` is a set, else `false`.
19243    * @example
19244    *
19245    * _.isSet(new Set);
19246    * // => true
19247    *
19248    * _.isSet(new WeakSet);
19249    * // => false
19250    */
19251   var isSet = nodeIsSet ? baseUnary(nodeIsSet) : baseIsSet;
19252
19253   /** Used to compose bitmasks for cloning. */
19254   var CLONE_DEEP_FLAG = 1,
19255       CLONE_FLAT_FLAG = 2,
19256       CLONE_SYMBOLS_FLAG = 4;
19257
19258   /** `Object#toString` result references. */
19259   var argsTag$2 = '[object Arguments]',
19260       arrayTag$1 = '[object Array]',
19261       boolTag$2 = '[object Boolean]',
19262       dateTag$2 = '[object Date]',
19263       errorTag$1 = '[object Error]',
19264       funcTag$2 = '[object Function]',
19265       genTag$1 = '[object GeneratorFunction]',
19266       mapTag$4 = '[object Map]',
19267       numberTag$2 = '[object Number]',
19268       objectTag$2 = '[object Object]',
19269       regexpTag$2 = '[object RegExp]',
19270       setTag$4 = '[object Set]',
19271       stringTag$2 = '[object String]',
19272       symbolTag$1 = '[object Symbol]',
19273       weakMapTag$2 = '[object WeakMap]';
19274
19275   var arrayBufferTag$2 = '[object ArrayBuffer]',
19276       dataViewTag$3 = '[object DataView]',
19277       float32Tag$2 = '[object Float32Array]',
19278       float64Tag$2 = '[object Float64Array]',
19279       int8Tag$2 = '[object Int8Array]',
19280       int16Tag$2 = '[object Int16Array]',
19281       int32Tag$2 = '[object Int32Array]',
19282       uint8Tag$2 = '[object Uint8Array]',
19283       uint8ClampedTag$2 = '[object Uint8ClampedArray]',
19284       uint16Tag$2 = '[object Uint16Array]',
19285       uint32Tag$2 = '[object Uint32Array]';
19286
19287   /** Used to identify `toStringTag` values supported by `_.clone`. */
19288   var cloneableTags = {};
19289   cloneableTags[argsTag$2] = cloneableTags[arrayTag$1] =
19290   cloneableTags[arrayBufferTag$2] = cloneableTags[dataViewTag$3] =
19291   cloneableTags[boolTag$2] = cloneableTags[dateTag$2] =
19292   cloneableTags[float32Tag$2] = cloneableTags[float64Tag$2] =
19293   cloneableTags[int8Tag$2] = cloneableTags[int16Tag$2] =
19294   cloneableTags[int32Tag$2] = cloneableTags[mapTag$4] =
19295   cloneableTags[numberTag$2] = cloneableTags[objectTag$2] =
19296   cloneableTags[regexpTag$2] = cloneableTags[setTag$4] =
19297   cloneableTags[stringTag$2] = cloneableTags[symbolTag$1] =
19298   cloneableTags[uint8Tag$2] = cloneableTags[uint8ClampedTag$2] =
19299   cloneableTags[uint16Tag$2] = cloneableTags[uint32Tag$2] = true;
19300   cloneableTags[errorTag$1] = cloneableTags[funcTag$2] =
19301   cloneableTags[weakMapTag$2] = false;
19302
19303   /**
19304    * The base implementation of `_.clone` and `_.cloneDeep` which tracks
19305    * traversed objects.
19306    *
19307    * @private
19308    * @param {*} value The value to clone.
19309    * @param {boolean} bitmask The bitmask flags.
19310    *  1 - Deep clone
19311    *  2 - Flatten inherited properties
19312    *  4 - Clone symbols
19313    * @param {Function} [customizer] The function to customize cloning.
19314    * @param {string} [key] The key of `value`.
19315    * @param {Object} [object] The parent object of `value`.
19316    * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
19317    * @returns {*} Returns the cloned value.
19318    */
19319   function baseClone(value, bitmask, customizer, key, object, stack) {
19320     var result,
19321         isDeep = bitmask & CLONE_DEEP_FLAG,
19322         isFlat = bitmask & CLONE_FLAT_FLAG,
19323         isFull = bitmask & CLONE_SYMBOLS_FLAG;
19324
19325     if (customizer) {
19326       result = object ? customizer(value, key, object, stack) : customizer(value);
19327     }
19328     if (result !== undefined) {
19329       return result;
19330     }
19331     if (!isObject(value)) {
19332       return value;
19333     }
19334     var isArr = isArray(value);
19335     if (isArr) {
19336       result = initCloneArray(value);
19337       if (!isDeep) {
19338         return copyArray(value, result);
19339       }
19340     } else {
19341       var tag = getTag$1(value),
19342           isFunc = tag == funcTag$2 || tag == genTag$1;
19343
19344       if (isBuffer(value)) {
19345         return cloneBuffer(value, isDeep);
19346       }
19347       if (tag == objectTag$2 || tag == argsTag$2 || (isFunc && !object)) {
19348         result = (isFlat || isFunc) ? {} : initCloneObject(value);
19349         if (!isDeep) {
19350           return isFlat
19351             ? copySymbolsIn(value, baseAssignIn(result, value))
19352             : copySymbols(value, baseAssign(result, value));
19353         }
19354       } else {
19355         if (!cloneableTags[tag]) {
19356           return object ? value : {};
19357         }
19358         result = initCloneByTag(value, tag, isDeep);
19359       }
19360     }
19361     // Check for circular references and return its corresponding clone.
19362     stack || (stack = new Stack);
19363     var stacked = stack.get(value);
19364     if (stacked) {
19365       return stacked;
19366     }
19367     stack.set(value, result);
19368
19369     if (isSet(value)) {
19370       value.forEach(function(subValue) {
19371         result.add(baseClone(subValue, bitmask, customizer, subValue, value, stack));
19372       });
19373
19374       return result;
19375     }
19376
19377     if (isMap(value)) {
19378       value.forEach(function(subValue, key) {
19379         result.set(key, baseClone(subValue, bitmask, customizer, key, value, stack));
19380       });
19381
19382       return result;
19383     }
19384
19385     var keysFunc = isFull
19386       ? (isFlat ? getAllKeysIn : getAllKeys)
19387       : (isFlat ? keysIn : keys$1);
19388
19389     var props = isArr ? undefined : keysFunc(value);
19390     arrayEach(props || value, function(subValue, key) {
19391       if (props) {
19392         key = subValue;
19393         subValue = value[key];
19394       }
19395       // Recursively populate clone (susceptible to call stack limits).
19396       assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
19397     });
19398     return result;
19399   }
19400
19401   /** Used to compose bitmasks for cloning. */
19402   var CLONE_SYMBOLS_FLAG$1 = 4;
19403
19404   /**
19405    * Creates a shallow clone of `value`.
19406    *
19407    * **Note:** This method is loosely based on the
19408    * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)
19409    * and supports cloning arrays, array buffers, booleans, date objects, maps,
19410    * numbers, `Object` objects, regexes, sets, strings, symbols, and typed
19411    * arrays. The own enumerable properties of `arguments` objects are cloned
19412    * as plain objects. An empty object is returned for uncloneable values such
19413    * as error objects, functions, DOM nodes, and WeakMaps.
19414    *
19415    * @static
19416    * @memberOf _
19417    * @since 0.1.0
19418    * @category Lang
19419    * @param {*} value The value to clone.
19420    * @returns {*} Returns the cloned value.
19421    * @see _.cloneDeep
19422    * @example
19423    *
19424    * var objects = [{ 'a': 1 }, { 'b': 2 }];
19425    *
19426    * var shallow = _.clone(objects);
19427    * console.log(shallow[0] === objects[0]);
19428    * // => true
19429    */
19430   function clone(value) {
19431     return baseClone(value, CLONE_SYMBOLS_FLAG$1);
19432   }
19433
19434   /**
19435    * A specialized version of `baseAggregator` for arrays.
19436    *
19437    * @private
19438    * @param {Array} [array] The array to iterate over.
19439    * @param {Function} setter The function to set `accumulator` values.
19440    * @param {Function} iteratee The iteratee to transform keys.
19441    * @param {Object} accumulator The initial aggregated object.
19442    * @returns {Function} Returns `accumulator`.
19443    */
19444   function arrayAggregator(array, setter, iteratee, accumulator) {
19445     var index = -1,
19446         length = array == null ? 0 : array.length;
19447
19448     while (++index < length) {
19449       var value = array[index];
19450       setter(accumulator, value, iteratee(value), array);
19451     }
19452     return accumulator;
19453   }
19454
19455   /**
19456    * Creates a base function for methods like `_.forIn` and `_.forOwn`.
19457    *
19458    * @private
19459    * @param {boolean} [fromRight] Specify iterating from right to left.
19460    * @returns {Function} Returns the new base function.
19461    */
19462   function createBaseFor(fromRight) {
19463     return function(object, iteratee, keysFunc) {
19464       var index = -1,
19465           iterable = Object(object),
19466           props = keysFunc(object),
19467           length = props.length;
19468
19469       while (length--) {
19470         var key = props[fromRight ? length : ++index];
19471         if (iteratee(iterable[key], key, iterable) === false) {
19472           break;
19473         }
19474       }
19475       return object;
19476     };
19477   }
19478
19479   /**
19480    * The base implementation of `baseForOwn` which iterates over `object`
19481    * properties returned by `keysFunc` and invokes `iteratee` for each property.
19482    * Iteratee functions may exit iteration early by explicitly returning `false`.
19483    *
19484    * @private
19485    * @param {Object} object The object to iterate over.
19486    * @param {Function} iteratee The function invoked per iteration.
19487    * @param {Function} keysFunc The function to get the keys of `object`.
19488    * @returns {Object} Returns `object`.
19489    */
19490   var baseFor = createBaseFor();
19491
19492   /**
19493    * The base implementation of `_.forOwn` without support for iteratee shorthands.
19494    *
19495    * @private
19496    * @param {Object} object The object to iterate over.
19497    * @param {Function} iteratee The function invoked per iteration.
19498    * @returns {Object} Returns `object`.
19499    */
19500   function baseForOwn(object, iteratee) {
19501     return object && baseFor(object, iteratee, keys$1);
19502   }
19503
19504   /**
19505    * Creates a `baseEach` or `baseEachRight` function.
19506    *
19507    * @private
19508    * @param {Function} eachFunc The function to iterate over a collection.
19509    * @param {boolean} [fromRight] Specify iterating from right to left.
19510    * @returns {Function} Returns the new base function.
19511    */
19512   function createBaseEach(eachFunc, fromRight) {
19513     return function(collection, iteratee) {
19514       if (collection == null) {
19515         return collection;
19516       }
19517       if (!isArrayLike(collection)) {
19518         return eachFunc(collection, iteratee);
19519       }
19520       var length = collection.length,
19521           index = fromRight ? length : -1,
19522           iterable = Object(collection);
19523
19524       while ((fromRight ? index-- : ++index < length)) {
19525         if (iteratee(iterable[index], index, iterable) === false) {
19526           break;
19527         }
19528       }
19529       return collection;
19530     };
19531   }
19532
19533   /**
19534    * The base implementation of `_.forEach` without support for iteratee shorthands.
19535    *
19536    * @private
19537    * @param {Array|Object} collection The collection to iterate over.
19538    * @param {Function} iteratee The function invoked per iteration.
19539    * @returns {Array|Object} Returns `collection`.
19540    */
19541   var baseEach = createBaseEach(baseForOwn);
19542
19543   /**
19544    * Aggregates elements of `collection` on `accumulator` with keys transformed
19545    * by `iteratee` and values set by `setter`.
19546    *
19547    * @private
19548    * @param {Array|Object} collection The collection to iterate over.
19549    * @param {Function} setter The function to set `accumulator` values.
19550    * @param {Function} iteratee The iteratee to transform keys.
19551    * @param {Object} accumulator The initial aggregated object.
19552    * @returns {Function} Returns `accumulator`.
19553    */
19554   function baseAggregator(collection, setter, iteratee, accumulator) {
19555     baseEach(collection, function(value, key, collection) {
19556       setter(accumulator, value, iteratee(value), collection);
19557     });
19558     return accumulator;
19559   }
19560
19561   /** Used to stand-in for `undefined` hash values. */
19562   var HASH_UNDEFINED$2 = '__lodash_hash_undefined__';
19563
19564   /**
19565    * Adds `value` to the array cache.
19566    *
19567    * @private
19568    * @name add
19569    * @memberOf SetCache
19570    * @alias push
19571    * @param {*} value The value to cache.
19572    * @returns {Object} Returns the cache instance.
19573    */
19574   function setCacheAdd(value) {
19575     this.__data__.set(value, HASH_UNDEFINED$2);
19576     return this;
19577   }
19578
19579   /**
19580    * Checks if `value` is in the array cache.
19581    *
19582    * @private
19583    * @name has
19584    * @memberOf SetCache
19585    * @param {*} value The value to search for.
19586    * @returns {number} Returns `true` if `value` is found, else `false`.
19587    */
19588   function setCacheHas(value) {
19589     return this.__data__.has(value);
19590   }
19591
19592   /**
19593    *
19594    * Creates an array cache object to store unique values.
19595    *
19596    * @private
19597    * @constructor
19598    * @param {Array} [values] The values to cache.
19599    */
19600   function SetCache(values) {
19601     var index = -1,
19602         length = values == null ? 0 : values.length;
19603
19604     this.__data__ = new MapCache;
19605     while (++index < length) {
19606       this.add(values[index]);
19607     }
19608   }
19609
19610   // Add methods to `SetCache`.
19611   SetCache.prototype.add = SetCache.prototype.push = setCacheAdd;
19612   SetCache.prototype.has = setCacheHas;
19613
19614   /**
19615    * A specialized version of `_.some` for arrays without support for iteratee
19616    * shorthands.
19617    *
19618    * @private
19619    * @param {Array} [array] The array to iterate over.
19620    * @param {Function} predicate The function invoked per iteration.
19621    * @returns {boolean} Returns `true` if any element passes the predicate check,
19622    *  else `false`.
19623    */
19624   function arraySome(array, predicate) {
19625     var index = -1,
19626         length = array == null ? 0 : array.length;
19627
19628     while (++index < length) {
19629       if (predicate(array[index], index, array)) {
19630         return true;
19631       }
19632     }
19633     return false;
19634   }
19635
19636   /**
19637    * Checks if a `cache` value for `key` exists.
19638    *
19639    * @private
19640    * @param {Object} cache The cache to query.
19641    * @param {string} key The key of the entry to check.
19642    * @returns {boolean} Returns `true` if an entry for `key` exists, else `false`.
19643    */
19644   function cacheHas(cache, key) {
19645     return cache.has(key);
19646   }
19647
19648   /** Used to compose bitmasks for value comparisons. */
19649   var COMPARE_PARTIAL_FLAG = 1,
19650       COMPARE_UNORDERED_FLAG = 2;
19651
19652   /**
19653    * A specialized version of `baseIsEqualDeep` for arrays with support for
19654    * partial deep comparisons.
19655    *
19656    * @private
19657    * @param {Array} array The array to compare.
19658    * @param {Array} other The other array to compare.
19659    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19660    * @param {Function} customizer The function to customize comparisons.
19661    * @param {Function} equalFunc The function to determine equivalents of values.
19662    * @param {Object} stack Tracks traversed `array` and `other` objects.
19663    * @returns {boolean} Returns `true` if the arrays are equivalent, else `false`.
19664    */
19665   function equalArrays(array, other, bitmask, customizer, equalFunc, stack) {
19666     var isPartial = bitmask & COMPARE_PARTIAL_FLAG,
19667         arrLength = array.length,
19668         othLength = other.length;
19669
19670     if (arrLength != othLength && !(isPartial && othLength > arrLength)) {
19671       return false;
19672     }
19673     // Assume cyclic values are equal.
19674     var stacked = stack.get(array);
19675     if (stacked && stack.get(other)) {
19676       return stacked == other;
19677     }
19678     var index = -1,
19679         result = true,
19680         seen = (bitmask & COMPARE_UNORDERED_FLAG) ? new SetCache : undefined;
19681
19682     stack.set(array, other);
19683     stack.set(other, array);
19684
19685     // Ignore non-index properties.
19686     while (++index < arrLength) {
19687       var arrValue = array[index],
19688           othValue = other[index];
19689
19690       if (customizer) {
19691         var compared = isPartial
19692           ? customizer(othValue, arrValue, index, other, array, stack)
19693           : customizer(arrValue, othValue, index, array, other, stack);
19694       }
19695       if (compared !== undefined) {
19696         if (compared) {
19697           continue;
19698         }
19699         result = false;
19700         break;
19701       }
19702       // Recursively compare arrays (susceptible to call stack limits).
19703       if (seen) {
19704         if (!arraySome(other, function(othValue, othIndex) {
19705               if (!cacheHas(seen, othIndex) &&
19706                   (arrValue === othValue || equalFunc(arrValue, othValue, bitmask, customizer, stack))) {
19707                 return seen.push(othIndex);
19708               }
19709             })) {
19710           result = false;
19711           break;
19712         }
19713       } else if (!(
19714             arrValue === othValue ||
19715               equalFunc(arrValue, othValue, bitmask, customizer, stack)
19716           )) {
19717         result = false;
19718         break;
19719       }
19720     }
19721     stack['delete'](array);
19722     stack['delete'](other);
19723     return result;
19724   }
19725
19726   /**
19727    * Converts `map` to its key-value pairs.
19728    *
19729    * @private
19730    * @param {Object} map The map to convert.
19731    * @returns {Array} Returns the key-value pairs.
19732    */
19733   function mapToArray(map) {
19734     var index = -1,
19735         result = Array(map.size);
19736
19737     map.forEach(function(value, key) {
19738       result[++index] = [key, value];
19739     });
19740     return result;
19741   }
19742
19743   /**
19744    * Converts `set` to an array of its values.
19745    *
19746    * @private
19747    * @param {Object} set The set to convert.
19748    * @returns {Array} Returns the values.
19749    */
19750   function setToArray(set) {
19751     var index = -1,
19752         result = Array(set.size);
19753
19754     set.forEach(function(value) {
19755       result[++index] = value;
19756     });
19757     return result;
19758   }
19759
19760   /** Used to compose bitmasks for value comparisons. */
19761   var COMPARE_PARTIAL_FLAG$1 = 1,
19762       COMPARE_UNORDERED_FLAG$1 = 2;
19763
19764   /** `Object#toString` result references. */
19765   var boolTag$3 = '[object Boolean]',
19766       dateTag$3 = '[object Date]',
19767       errorTag$2 = '[object Error]',
19768       mapTag$5 = '[object Map]',
19769       numberTag$3 = '[object Number]',
19770       regexpTag$3 = '[object RegExp]',
19771       setTag$5 = '[object Set]',
19772       stringTag$3 = '[object String]',
19773       symbolTag$2 = '[object Symbol]';
19774
19775   var arrayBufferTag$3 = '[object ArrayBuffer]',
19776       dataViewTag$4 = '[object DataView]';
19777
19778   /** Used to convert symbols to primitives and strings. */
19779   var symbolProto$1 = Symbol ? Symbol.prototype : undefined,
19780       symbolValueOf$1 = symbolProto$1 ? symbolProto$1.valueOf : undefined;
19781
19782   /**
19783    * A specialized version of `baseIsEqualDeep` for comparing objects of
19784    * the same `toStringTag`.
19785    *
19786    * **Note:** This function only supports comparing values with tags of
19787    * `Boolean`, `Date`, `Error`, `Number`, `RegExp`, or `String`.
19788    *
19789    * @private
19790    * @param {Object} object The object to compare.
19791    * @param {Object} other The other object to compare.
19792    * @param {string} tag The `toStringTag` of the objects to compare.
19793    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19794    * @param {Function} customizer The function to customize comparisons.
19795    * @param {Function} equalFunc The function to determine equivalents of values.
19796    * @param {Object} stack Tracks traversed `object` and `other` objects.
19797    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19798    */
19799   function equalByTag(object, other, tag, bitmask, customizer, equalFunc, stack) {
19800     switch (tag) {
19801       case dataViewTag$4:
19802         if ((object.byteLength != other.byteLength) ||
19803             (object.byteOffset != other.byteOffset)) {
19804           return false;
19805         }
19806         object = object.buffer;
19807         other = other.buffer;
19808
19809       case arrayBufferTag$3:
19810         if ((object.byteLength != other.byteLength) ||
19811             !equalFunc(new Uint8Array$1(object), new Uint8Array$1(other))) {
19812           return false;
19813         }
19814         return true;
19815
19816       case boolTag$3:
19817       case dateTag$3:
19818       case numberTag$3:
19819         // Coerce booleans to `1` or `0` and dates to milliseconds.
19820         // Invalid dates are coerced to `NaN`.
19821         return eq(+object, +other);
19822
19823       case errorTag$2:
19824         return object.name == other.name && object.message == other.message;
19825
19826       case regexpTag$3:
19827       case stringTag$3:
19828         // Coerce regexes to strings and treat strings, primitives and objects,
19829         // as equal. See http://www.ecma-international.org/ecma-262/7.0/#sec-regexp.prototype.tostring
19830         // for more details.
19831         return object == (other + '');
19832
19833       case mapTag$5:
19834         var convert = mapToArray;
19835
19836       case setTag$5:
19837         var isPartial = bitmask & COMPARE_PARTIAL_FLAG$1;
19838         convert || (convert = setToArray);
19839
19840         if (object.size != other.size && !isPartial) {
19841           return false;
19842         }
19843         // Assume cyclic values are equal.
19844         var stacked = stack.get(object);
19845         if (stacked) {
19846           return stacked == other;
19847         }
19848         bitmask |= COMPARE_UNORDERED_FLAG$1;
19849
19850         // Recursively compare objects (susceptible to call stack limits).
19851         stack.set(object, other);
19852         var result = equalArrays(convert(object), convert(other), bitmask, customizer, equalFunc, stack);
19853         stack['delete'](object);
19854         return result;
19855
19856       case symbolTag$2:
19857         if (symbolValueOf$1) {
19858           return symbolValueOf$1.call(object) == symbolValueOf$1.call(other);
19859         }
19860     }
19861     return false;
19862   }
19863
19864   /** Used to compose bitmasks for value comparisons. */
19865   var COMPARE_PARTIAL_FLAG$2 = 1;
19866
19867   /** Used for built-in method references. */
19868   var objectProto$d = Object.prototype;
19869
19870   /** Used to check objects for own properties. */
19871   var hasOwnProperty$a = objectProto$d.hasOwnProperty;
19872
19873   /**
19874    * A specialized version of `baseIsEqualDeep` for objects with support for
19875    * partial deep comparisons.
19876    *
19877    * @private
19878    * @param {Object} object The object to compare.
19879    * @param {Object} other The other object to compare.
19880    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19881    * @param {Function} customizer The function to customize comparisons.
19882    * @param {Function} equalFunc The function to determine equivalents of values.
19883    * @param {Object} stack Tracks traversed `object` and `other` objects.
19884    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19885    */
19886   function equalObjects(object, other, bitmask, customizer, equalFunc, stack) {
19887     var isPartial = bitmask & COMPARE_PARTIAL_FLAG$2,
19888         objProps = getAllKeys(object),
19889         objLength = objProps.length,
19890         othProps = getAllKeys(other),
19891         othLength = othProps.length;
19892
19893     if (objLength != othLength && !isPartial) {
19894       return false;
19895     }
19896     var index = objLength;
19897     while (index--) {
19898       var key = objProps[index];
19899       if (!(isPartial ? key in other : hasOwnProperty$a.call(other, key))) {
19900         return false;
19901       }
19902     }
19903     // Assume cyclic values are equal.
19904     var stacked = stack.get(object);
19905     if (stacked && stack.get(other)) {
19906       return stacked == other;
19907     }
19908     var result = true;
19909     stack.set(object, other);
19910     stack.set(other, object);
19911
19912     var skipCtor = isPartial;
19913     while (++index < objLength) {
19914       key = objProps[index];
19915       var objValue = object[key],
19916           othValue = other[key];
19917
19918       if (customizer) {
19919         var compared = isPartial
19920           ? customizer(othValue, objValue, key, other, object, stack)
19921           : customizer(objValue, othValue, key, object, other, stack);
19922       }
19923       // Recursively compare objects (susceptible to call stack limits).
19924       if (!(compared === undefined
19925             ? (objValue === othValue || equalFunc(objValue, othValue, bitmask, customizer, stack))
19926             : compared
19927           )) {
19928         result = false;
19929         break;
19930       }
19931       skipCtor || (skipCtor = key == 'constructor');
19932     }
19933     if (result && !skipCtor) {
19934       var objCtor = object.constructor,
19935           othCtor = other.constructor;
19936
19937       // Non `Object` object instances with different constructors are not equal.
19938       if (objCtor != othCtor &&
19939           ('constructor' in object && 'constructor' in other) &&
19940           !(typeof objCtor == 'function' && objCtor instanceof objCtor &&
19941             typeof othCtor == 'function' && othCtor instanceof othCtor)) {
19942         result = false;
19943       }
19944     }
19945     stack['delete'](object);
19946     stack['delete'](other);
19947     return result;
19948   }
19949
19950   /** Used to compose bitmasks for value comparisons. */
19951   var COMPARE_PARTIAL_FLAG$3 = 1;
19952
19953   /** `Object#toString` result references. */
19954   var argsTag$3 = '[object Arguments]',
19955       arrayTag$2 = '[object Array]',
19956       objectTag$3 = '[object Object]';
19957
19958   /** Used for built-in method references. */
19959   var objectProto$e = Object.prototype;
19960
19961   /** Used to check objects for own properties. */
19962   var hasOwnProperty$b = objectProto$e.hasOwnProperty;
19963
19964   /**
19965    * A specialized version of `baseIsEqual` for arrays and objects which performs
19966    * deep comparisons and tracks traversed objects enabling objects with circular
19967    * references to be compared.
19968    *
19969    * @private
19970    * @param {Object} object The object to compare.
19971    * @param {Object} other The other object to compare.
19972    * @param {number} bitmask The bitmask flags. See `baseIsEqual` for more details.
19973    * @param {Function} customizer The function to customize comparisons.
19974    * @param {Function} equalFunc The function to determine equivalents of values.
19975    * @param {Object} [stack] Tracks traversed `object` and `other` objects.
19976    * @returns {boolean} Returns `true` if the objects are equivalent, else `false`.
19977    */
19978   function baseIsEqualDeep(object, other, bitmask, customizer, equalFunc, stack) {
19979     var objIsArr = isArray(object),
19980         othIsArr = isArray(other),
19981         objTag = objIsArr ? arrayTag$2 : getTag$1(object),
19982         othTag = othIsArr ? arrayTag$2 : getTag$1(other);
19983
19984     objTag = objTag == argsTag$3 ? objectTag$3 : objTag;
19985     othTag = othTag == argsTag$3 ? objectTag$3 : othTag;
19986
19987     var objIsObj = objTag == objectTag$3,
19988         othIsObj = othTag == objectTag$3,
19989         isSameTag = objTag == othTag;
19990
19991     if (isSameTag && isBuffer(object)) {
19992       if (!isBuffer(other)) {
19993         return false;
19994       }
19995       objIsArr = true;
19996       objIsObj = false;
19997     }
19998     if (isSameTag && !objIsObj) {
19999       stack || (stack = new Stack);
20000       return (objIsArr || isTypedArray(object))
20001         ? equalArrays(object, other, bitmask, customizer, equalFunc, stack)
20002         : equalByTag(object, other, objTag, bitmask, customizer, equalFunc, stack);
20003     }
20004     if (!(bitmask & COMPARE_PARTIAL_FLAG$3)) {
20005       var objIsWrapped = objIsObj && hasOwnProperty$b.call(object, '__wrapped__'),
20006           othIsWrapped = othIsObj && hasOwnProperty$b.call(other, '__wrapped__');
20007
20008       if (objIsWrapped || othIsWrapped) {
20009         var objUnwrapped = objIsWrapped ? object.value() : object,
20010             othUnwrapped = othIsWrapped ? other.value() : other;
20011
20012         stack || (stack = new Stack);
20013         return equalFunc(objUnwrapped, othUnwrapped, bitmask, customizer, stack);
20014       }
20015     }
20016     if (!isSameTag) {
20017       return false;
20018     }
20019     stack || (stack = new Stack);
20020     return equalObjects(object, other, bitmask, customizer, equalFunc, stack);
20021   }
20022
20023   /**
20024    * The base implementation of `_.isEqual` which supports partial comparisons
20025    * and tracks traversed objects.
20026    *
20027    * @private
20028    * @param {*} value The value to compare.
20029    * @param {*} other The other value to compare.
20030    * @param {boolean} bitmask The bitmask flags.
20031    *  1 - Unordered comparison
20032    *  2 - Partial comparison
20033    * @param {Function} [customizer] The function to customize comparisons.
20034    * @param {Object} [stack] Tracks traversed `value` and `other` objects.
20035    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
20036    */
20037   function baseIsEqual(value, other, bitmask, customizer, stack) {
20038     if (value === other) {
20039       return true;
20040     }
20041     if (value == null || other == null || (!isObjectLike(value) && !isObjectLike(other))) {
20042       return value !== value && other !== other;
20043     }
20044     return baseIsEqualDeep(value, other, bitmask, customizer, baseIsEqual, stack);
20045   }
20046
20047   /** Used to compose bitmasks for value comparisons. */
20048   var COMPARE_PARTIAL_FLAG$4 = 1,
20049       COMPARE_UNORDERED_FLAG$2 = 2;
20050
20051   /**
20052    * The base implementation of `_.isMatch` without support for iteratee shorthands.
20053    *
20054    * @private
20055    * @param {Object} object The object to inspect.
20056    * @param {Object} source The object of property values to match.
20057    * @param {Array} matchData The property names, values, and compare flags to match.
20058    * @param {Function} [customizer] The function to customize comparisons.
20059    * @returns {boolean} Returns `true` if `object` is a match, else `false`.
20060    */
20061   function baseIsMatch(object, source, matchData, customizer) {
20062     var index = matchData.length,
20063         length = index,
20064         noCustomizer = !customizer;
20065
20066     if (object == null) {
20067       return !length;
20068     }
20069     object = Object(object);
20070     while (index--) {
20071       var data = matchData[index];
20072       if ((noCustomizer && data[2])
20073             ? data[1] !== object[data[0]]
20074             : !(data[0] in object)
20075           ) {
20076         return false;
20077       }
20078     }
20079     while (++index < length) {
20080       data = matchData[index];
20081       var key = data[0],
20082           objValue = object[key],
20083           srcValue = data[1];
20084
20085       if (noCustomizer && data[2]) {
20086         if (objValue === undefined && !(key in object)) {
20087           return false;
20088         }
20089       } else {
20090         var stack = new Stack;
20091         if (customizer) {
20092           var result = customizer(objValue, srcValue, key, object, source, stack);
20093         }
20094         if (!(result === undefined
20095               ? baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$4 | COMPARE_UNORDERED_FLAG$2, customizer, stack)
20096               : result
20097             )) {
20098           return false;
20099         }
20100       }
20101     }
20102     return true;
20103   }
20104
20105   /**
20106    * Checks if `value` is suitable for strict equality comparisons, i.e. `===`.
20107    *
20108    * @private
20109    * @param {*} value The value to check.
20110    * @returns {boolean} Returns `true` if `value` if suitable for strict
20111    *  equality comparisons, else `false`.
20112    */
20113   function isStrictComparable(value) {
20114     return value === value && !isObject(value);
20115   }
20116
20117   /**
20118    * Gets the property names, values, and compare flags of `object`.
20119    *
20120    * @private
20121    * @param {Object} object The object to query.
20122    * @returns {Array} Returns the match data of `object`.
20123    */
20124   function getMatchData(object) {
20125     var result = keys$1(object),
20126         length = result.length;
20127
20128     while (length--) {
20129       var key = result[length],
20130           value = object[key];
20131
20132       result[length] = [key, value, isStrictComparable(value)];
20133     }
20134     return result;
20135   }
20136
20137   /**
20138    * A specialized version of `matchesProperty` for source values suitable
20139    * for strict equality comparisons, i.e. `===`.
20140    *
20141    * @private
20142    * @param {string} key The key of the property to get.
20143    * @param {*} srcValue The value to match.
20144    * @returns {Function} Returns the new spec function.
20145    */
20146   function matchesStrictComparable(key, srcValue) {
20147     return function(object) {
20148       if (object == null) {
20149         return false;
20150       }
20151       return object[key] === srcValue &&
20152         (srcValue !== undefined || (key in Object(object)));
20153     };
20154   }
20155
20156   /**
20157    * The base implementation of `_.matches` which doesn't clone `source`.
20158    *
20159    * @private
20160    * @param {Object} source The object of property values to match.
20161    * @returns {Function} Returns the new spec function.
20162    */
20163   function baseMatches(source) {
20164     var matchData = getMatchData(source);
20165     if (matchData.length == 1 && matchData[0][2]) {
20166       return matchesStrictComparable(matchData[0][0], matchData[0][1]);
20167     }
20168     return function(object) {
20169       return object === source || baseIsMatch(object, source, matchData);
20170     };
20171   }
20172
20173   /** `Object#toString` result references. */
20174   var symbolTag$3 = '[object Symbol]';
20175
20176   /**
20177    * Checks if `value` is classified as a `Symbol` primitive or object.
20178    *
20179    * @static
20180    * @memberOf _
20181    * @since 4.0.0
20182    * @category Lang
20183    * @param {*} value The value to check.
20184    * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.
20185    * @example
20186    *
20187    * _.isSymbol(Symbol.iterator);
20188    * // => true
20189    *
20190    * _.isSymbol('abc');
20191    * // => false
20192    */
20193   function isSymbol(value) {
20194     return typeof value == 'symbol' ||
20195       (isObjectLike(value) && baseGetTag(value) == symbolTag$3);
20196   }
20197
20198   /** Used to match property names within property paths. */
20199   var reIsDeepProp = /\.|\[(?:[^[\]]*|(["'])(?:(?!\1)[^\\]|\\.)*?\1)\]/,
20200       reIsPlainProp = /^\w*$/;
20201
20202   /**
20203    * Checks if `value` is a property name and not a property path.
20204    *
20205    * @private
20206    * @param {*} value The value to check.
20207    * @param {Object} [object] The object to query keys on.
20208    * @returns {boolean} Returns `true` if `value` is a property name, else `false`.
20209    */
20210   function isKey(value, object) {
20211     if (isArray(value)) {
20212       return false;
20213     }
20214     var type = typeof value;
20215     if (type == 'number' || type == 'symbol' || type == 'boolean' ||
20216         value == null || isSymbol(value)) {
20217       return true;
20218     }
20219     return reIsPlainProp.test(value) || !reIsDeepProp.test(value) ||
20220       (object != null && value in Object(object));
20221   }
20222
20223   /** Error message constants. */
20224   var FUNC_ERROR_TEXT = 'Expected a function';
20225
20226   /**
20227    * Creates a function that memoizes the result of `func`. If `resolver` is
20228    * provided, it determines the cache key for storing the result based on the
20229    * arguments provided to the memoized function. By default, the first argument
20230    * provided to the memoized function is used as the map cache key. The `func`
20231    * is invoked with the `this` binding of the memoized function.
20232    *
20233    * **Note:** The cache is exposed as the `cache` property on the memoized
20234    * function. Its creation may be customized by replacing the `_.memoize.Cache`
20235    * constructor with one whose instances implement the
20236    * [`Map`](http://ecma-international.org/ecma-262/7.0/#sec-properties-of-the-map-prototype-object)
20237    * method interface of `clear`, `delete`, `get`, `has`, and `set`.
20238    *
20239    * @static
20240    * @memberOf _
20241    * @since 0.1.0
20242    * @category Function
20243    * @param {Function} func The function to have its output memoized.
20244    * @param {Function} [resolver] The function to resolve the cache key.
20245    * @returns {Function} Returns the new memoized function.
20246    * @example
20247    *
20248    * var object = { 'a': 1, 'b': 2 };
20249    * var other = { 'c': 3, 'd': 4 };
20250    *
20251    * var values = _.memoize(_.values);
20252    * values(object);
20253    * // => [1, 2]
20254    *
20255    * values(other);
20256    * // => [3, 4]
20257    *
20258    * object.a = 2;
20259    * values(object);
20260    * // => [1, 2]
20261    *
20262    * // Modify the result cache.
20263    * values.cache.set(object, ['a', 'b']);
20264    * values(object);
20265    * // => ['a', 'b']
20266    *
20267    * // Replace `_.memoize.Cache`.
20268    * _.memoize.Cache = WeakMap;
20269    */
20270   function memoize(func, resolver) {
20271     if (typeof func != 'function' || (resolver != null && typeof resolver != 'function')) {
20272       throw new TypeError(FUNC_ERROR_TEXT);
20273     }
20274     var memoized = function() {
20275       var args = arguments,
20276           key = resolver ? resolver.apply(this, args) : args[0],
20277           cache = memoized.cache;
20278
20279       if (cache.has(key)) {
20280         return cache.get(key);
20281       }
20282       var result = func.apply(this, args);
20283       memoized.cache = cache.set(key, result) || cache;
20284       return result;
20285     };
20286     memoized.cache = new (memoize.Cache || MapCache);
20287     return memoized;
20288   }
20289
20290   // Expose `MapCache`.
20291   memoize.Cache = MapCache;
20292
20293   /** Used as the maximum memoize cache size. */
20294   var MAX_MEMOIZE_SIZE = 500;
20295
20296   /**
20297    * A specialized version of `_.memoize` which clears the memoized function's
20298    * cache when it exceeds `MAX_MEMOIZE_SIZE`.
20299    *
20300    * @private
20301    * @param {Function} func The function to have its output memoized.
20302    * @returns {Function} Returns the new memoized function.
20303    */
20304   function memoizeCapped(func) {
20305     var result = memoize(func, function(key) {
20306       if (cache.size === MAX_MEMOIZE_SIZE) {
20307         cache.clear();
20308       }
20309       return key;
20310     });
20311
20312     var cache = result.cache;
20313     return result;
20314   }
20315
20316   /** Used to match property names within property paths. */
20317   var rePropName = /[^.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|$))/g;
20318
20319   /** Used to match backslashes in property paths. */
20320   var reEscapeChar = /\\(\\)?/g;
20321
20322   /**
20323    * Converts `string` to a property path array.
20324    *
20325    * @private
20326    * @param {string} string The string to convert.
20327    * @returns {Array} Returns the property path array.
20328    */
20329   var stringToPath = memoizeCapped(function(string) {
20330     var result = [];
20331     if (string.charCodeAt(0) === 46 /* . */) {
20332       result.push('');
20333     }
20334     string.replace(rePropName, function(match, number, quote, subString) {
20335       result.push(quote ? subString.replace(reEscapeChar, '$1') : (number || match));
20336     });
20337     return result;
20338   });
20339
20340   /**
20341    * A specialized version of `_.map` for arrays without support for iteratee
20342    * shorthands.
20343    *
20344    * @private
20345    * @param {Array} [array] The array to iterate over.
20346    * @param {Function} iteratee The function invoked per iteration.
20347    * @returns {Array} Returns the new mapped array.
20348    */
20349   function arrayMap(array, iteratee) {
20350     var index = -1,
20351         length = array == null ? 0 : array.length,
20352         result = Array(length);
20353
20354     while (++index < length) {
20355       result[index] = iteratee(array[index], index, array);
20356     }
20357     return result;
20358   }
20359
20360   /** Used as references for various `Number` constants. */
20361   var INFINITY = 1 / 0;
20362
20363   /** Used to convert symbols to primitives and strings. */
20364   var symbolProto$2 = Symbol ? Symbol.prototype : undefined,
20365       symbolToString = symbolProto$2 ? symbolProto$2.toString : undefined;
20366
20367   /**
20368    * The base implementation of `_.toString` which doesn't convert nullish
20369    * values to empty strings.
20370    *
20371    * @private
20372    * @param {*} value The value to process.
20373    * @returns {string} Returns the string.
20374    */
20375   function baseToString(value) {
20376     // Exit early for strings to avoid a performance hit in some environments.
20377     if (typeof value == 'string') {
20378       return value;
20379     }
20380     if (isArray(value)) {
20381       // Recursively convert values (susceptible to call stack limits).
20382       return arrayMap(value, baseToString) + '';
20383     }
20384     if (isSymbol(value)) {
20385       return symbolToString ? symbolToString.call(value) : '';
20386     }
20387     var result = (value + '');
20388     return (result == '0' && (1 / value) == -INFINITY) ? '-0' : result;
20389   }
20390
20391   /**
20392    * Converts `value` to a string. An empty string is returned for `null`
20393    * and `undefined` values. The sign of `-0` is preserved.
20394    *
20395    * @static
20396    * @memberOf _
20397    * @since 4.0.0
20398    * @category Lang
20399    * @param {*} value The value to convert.
20400    * @returns {string} Returns the converted string.
20401    * @example
20402    *
20403    * _.toString(null);
20404    * // => ''
20405    *
20406    * _.toString(-0);
20407    * // => '-0'
20408    *
20409    * _.toString([1, 2, 3]);
20410    * // => '1,2,3'
20411    */
20412   function toString(value) {
20413     return value == null ? '' : baseToString(value);
20414   }
20415
20416   /**
20417    * Casts `value` to a path array if it's not one.
20418    *
20419    * @private
20420    * @param {*} value The value to inspect.
20421    * @param {Object} [object] The object to query keys on.
20422    * @returns {Array} Returns the cast property path array.
20423    */
20424   function castPath(value, object) {
20425     if (isArray(value)) {
20426       return value;
20427     }
20428     return isKey(value, object) ? [value] : stringToPath(toString(value));
20429   }
20430
20431   /** Used as references for various `Number` constants. */
20432   var INFINITY$1 = 1 / 0;
20433
20434   /**
20435    * Converts `value` to a string key if it's not a string or symbol.
20436    *
20437    * @private
20438    * @param {*} value The value to inspect.
20439    * @returns {string|symbol} Returns the key.
20440    */
20441   function toKey(value) {
20442     if (typeof value == 'string' || isSymbol(value)) {
20443       return value;
20444     }
20445     var result = (value + '');
20446     return (result == '0' && (1 / value) == -INFINITY$1) ? '-0' : result;
20447   }
20448
20449   /**
20450    * The base implementation of `_.get` without support for default values.
20451    *
20452    * @private
20453    * @param {Object} object The object to query.
20454    * @param {Array|string} path The path of the property to get.
20455    * @returns {*} Returns the resolved value.
20456    */
20457   function baseGet(object, path) {
20458     path = castPath(path, object);
20459
20460     var index = 0,
20461         length = path.length;
20462
20463     while (object != null && index < length) {
20464       object = object[toKey(path[index++])];
20465     }
20466     return (index && index == length) ? object : undefined;
20467   }
20468
20469   /**
20470    * Gets the value at `path` of `object`. If the resolved value is
20471    * `undefined`, the `defaultValue` is returned in its place.
20472    *
20473    * @static
20474    * @memberOf _
20475    * @since 3.7.0
20476    * @category Object
20477    * @param {Object} object The object to query.
20478    * @param {Array|string} path The path of the property to get.
20479    * @param {*} [defaultValue] The value returned for `undefined` resolved values.
20480    * @returns {*} Returns the resolved value.
20481    * @example
20482    *
20483    * var object = { 'a': [{ 'b': { 'c': 3 } }] };
20484    *
20485    * _.get(object, 'a[0].b.c');
20486    * // => 3
20487    *
20488    * _.get(object, ['a', '0', 'b', 'c']);
20489    * // => 3
20490    *
20491    * _.get(object, 'a.b.c', 'default');
20492    * // => 'default'
20493    */
20494   function get$2(object, path, defaultValue) {
20495     var result = object == null ? undefined : baseGet(object, path);
20496     return result === undefined ? defaultValue : result;
20497   }
20498
20499   /**
20500    * The base implementation of `_.hasIn` without support for deep paths.
20501    *
20502    * @private
20503    * @param {Object} [object] The object to query.
20504    * @param {Array|string} key The key to check.
20505    * @returns {boolean} Returns `true` if `key` exists, else `false`.
20506    */
20507   function baseHasIn(object, key) {
20508     return object != null && key in Object(object);
20509   }
20510
20511   /**
20512    * Checks if `path` exists on `object`.
20513    *
20514    * @private
20515    * @param {Object} object The object to query.
20516    * @param {Array|string} path The path to check.
20517    * @param {Function} hasFunc The function to check properties.
20518    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20519    */
20520   function hasPath(object, path, hasFunc) {
20521     path = castPath(path, object);
20522
20523     var index = -1,
20524         length = path.length,
20525         result = false;
20526
20527     while (++index < length) {
20528       var key = toKey(path[index]);
20529       if (!(result = object != null && hasFunc(object, key))) {
20530         break;
20531       }
20532       object = object[key];
20533     }
20534     if (result || ++index != length) {
20535       return result;
20536     }
20537     length = object == null ? 0 : object.length;
20538     return !!length && isLength(length) && isIndex(key, length) &&
20539       (isArray(object) || isArguments(object));
20540   }
20541
20542   /**
20543    * Checks if `path` is a direct or inherited property of `object`.
20544    *
20545    * @static
20546    * @memberOf _
20547    * @since 4.0.0
20548    * @category Object
20549    * @param {Object} object The object to query.
20550    * @param {Array|string} path The path to check.
20551    * @returns {boolean} Returns `true` if `path` exists, else `false`.
20552    * @example
20553    *
20554    * var object = _.create({ 'a': _.create({ 'b': 2 }) });
20555    *
20556    * _.hasIn(object, 'a');
20557    * // => true
20558    *
20559    * _.hasIn(object, 'a.b');
20560    * // => true
20561    *
20562    * _.hasIn(object, ['a', 'b']);
20563    * // => true
20564    *
20565    * _.hasIn(object, 'b');
20566    * // => false
20567    */
20568   function hasIn(object, path) {
20569     return object != null && hasPath(object, path, baseHasIn);
20570   }
20571
20572   /** Used to compose bitmasks for value comparisons. */
20573   var COMPARE_PARTIAL_FLAG$5 = 1,
20574       COMPARE_UNORDERED_FLAG$3 = 2;
20575
20576   /**
20577    * The base implementation of `_.matchesProperty` which doesn't clone `srcValue`.
20578    *
20579    * @private
20580    * @param {string} path The path of the property to get.
20581    * @param {*} srcValue The value to match.
20582    * @returns {Function} Returns the new spec function.
20583    */
20584   function baseMatchesProperty(path, srcValue) {
20585     if (isKey(path) && isStrictComparable(srcValue)) {
20586       return matchesStrictComparable(toKey(path), srcValue);
20587     }
20588     return function(object) {
20589       var objValue = get$2(object, path);
20590       return (objValue === undefined && objValue === srcValue)
20591         ? hasIn(object, path)
20592         : baseIsEqual(srcValue, objValue, COMPARE_PARTIAL_FLAG$5 | COMPARE_UNORDERED_FLAG$3);
20593     };
20594   }
20595
20596   /**
20597    * This method returns the first argument it receives.
20598    *
20599    * @static
20600    * @since 0.1.0
20601    * @memberOf _
20602    * @category Util
20603    * @param {*} value Any value.
20604    * @returns {*} Returns `value`.
20605    * @example
20606    *
20607    * var object = { 'a': 1 };
20608    *
20609    * console.log(_.identity(object) === object);
20610    * // => true
20611    */
20612   function identity$8(value) {
20613     return value;
20614   }
20615
20616   /**
20617    * The base implementation of `_.property` without support for deep paths.
20618    *
20619    * @private
20620    * @param {string} key The key of the property to get.
20621    * @returns {Function} Returns the new accessor function.
20622    */
20623   function baseProperty(key) {
20624     return function(object) {
20625       return object == null ? undefined : object[key];
20626     };
20627   }
20628
20629   /**
20630    * A specialized version of `baseProperty` which supports deep paths.
20631    *
20632    * @private
20633    * @param {Array|string} path The path of the property to get.
20634    * @returns {Function} Returns the new accessor function.
20635    */
20636   function basePropertyDeep(path) {
20637     return function(object) {
20638       return baseGet(object, path);
20639     };
20640   }
20641
20642   /**
20643    * Creates a function that returns the value at `path` of a given object.
20644    *
20645    * @static
20646    * @memberOf _
20647    * @since 2.4.0
20648    * @category Util
20649    * @param {Array|string} path The path of the property to get.
20650    * @returns {Function} Returns the new accessor function.
20651    * @example
20652    *
20653    * var objects = [
20654    *   { 'a': { 'b': 2 } },
20655    *   { 'a': { 'b': 1 } }
20656    * ];
20657    *
20658    * _.map(objects, _.property('a.b'));
20659    * // => [2, 1]
20660    *
20661    * _.map(_.sortBy(objects, _.property(['a', 'b'])), 'a.b');
20662    * // => [1, 2]
20663    */
20664   function property(path) {
20665     return isKey(path) ? baseProperty(toKey(path)) : basePropertyDeep(path);
20666   }
20667
20668   /**
20669    * The base implementation of `_.iteratee`.
20670    *
20671    * @private
20672    * @param {*} [value=_.identity] The value to convert to an iteratee.
20673    * @returns {Function} Returns the iteratee.
20674    */
20675   function baseIteratee(value) {
20676     // Don't store the `typeof` result in a variable to avoid a JIT bug in Safari 9.
20677     // See https://bugs.webkit.org/show_bug.cgi?id=156034 for more details.
20678     if (typeof value == 'function') {
20679       return value;
20680     }
20681     if (value == null) {
20682       return identity$8;
20683     }
20684     if (typeof value == 'object') {
20685       return isArray(value)
20686         ? baseMatchesProperty(value[0], value[1])
20687         : baseMatches(value);
20688     }
20689     return property(value);
20690   }
20691
20692   /**
20693    * Creates a function like `_.groupBy`.
20694    *
20695    * @private
20696    * @param {Function} setter The function to set accumulator values.
20697    * @param {Function} [initializer] The accumulator object initializer.
20698    * @returns {Function} Returns the new aggregator function.
20699    */
20700   function createAggregator(setter, initializer) {
20701     return function(collection, iteratee) {
20702       var func = isArray(collection) ? arrayAggregator : baseAggregator,
20703           accumulator = initializer ? initializer() : {};
20704
20705       return func(collection, setter, baseIteratee(iteratee, 2), accumulator);
20706     };
20707   }
20708
20709   /** Used for built-in method references. */
20710   var objectProto$f = Object.prototype;
20711
20712   /** Used to check objects for own properties. */
20713   var hasOwnProperty$c = objectProto$f.hasOwnProperty;
20714
20715   /**
20716    * Creates an object composed of keys generated from the results of running
20717    * each element of `collection` thru `iteratee`. The order of grouped values
20718    * is determined by the order they occur in `collection`. The corresponding
20719    * value of each key is an array of elements responsible for generating the
20720    * key. The iteratee is invoked with one argument: (value).
20721    *
20722    * @static
20723    * @memberOf _
20724    * @since 0.1.0
20725    * @category Collection
20726    * @param {Array|Object} collection The collection to iterate over.
20727    * @param {Function} [iteratee=_.identity] The iteratee to transform keys.
20728    * @returns {Object} Returns the composed aggregate object.
20729    * @example
20730    *
20731    * _.groupBy([6.1, 4.2, 6.3], Math.floor);
20732    * // => { '4': [4.2], '6': [6.1, 6.3] }
20733    *
20734    * // The `_.property` iteratee shorthand.
20735    * _.groupBy(['one', 'two', 'three'], 'length');
20736    * // => { '3': ['one', 'two'], '5': ['three'] }
20737    */
20738   var groupBy = createAggregator(function(result, value, key) {
20739     if (hasOwnProperty$c.call(result, key)) {
20740       result[key].push(value);
20741     } else {
20742       baseAssignValue(result, key, [value]);
20743     }
20744   });
20745
20746   /**
20747    * Gets the last element of `array`.
20748    *
20749    * @static
20750    * @memberOf _
20751    * @since 0.1.0
20752    * @category Array
20753    * @param {Array} array The array to query.
20754    * @returns {*} Returns the last element of `array`.
20755    * @example
20756    *
20757    * _.last([1, 2, 3]);
20758    * // => 3
20759    */
20760   function last(array) {
20761     var length = array == null ? 0 : array.length;
20762     return length ? array[length - 1] : undefined;
20763   }
20764
20765   /**
20766    * The base implementation of `_.slice` without an iteratee call guard.
20767    *
20768    * @private
20769    * @param {Array} array The array to slice.
20770    * @param {number} [start=0] The start position.
20771    * @param {number} [end=array.length] The end position.
20772    * @returns {Array} Returns the slice of `array`.
20773    */
20774   function baseSlice(array, start, end) {
20775     var index = -1,
20776         length = array.length;
20777
20778     if (start < 0) {
20779       start = -start > length ? 0 : (length + start);
20780     }
20781     end = end > length ? length : end;
20782     if (end < 0) {
20783       end += length;
20784     }
20785     length = start > end ? 0 : ((end - start) >>> 0);
20786     start >>>= 0;
20787
20788     var result = Array(length);
20789     while (++index < length) {
20790       result[index] = array[index + start];
20791     }
20792     return result;
20793   }
20794
20795   /**
20796    * Gets the parent value at `path` of `object`.
20797    *
20798    * @private
20799    * @param {Object} object The object to query.
20800    * @param {Array} path The path to get the parent value of.
20801    * @returns {*} Returns the parent value.
20802    */
20803   function parent(object, path) {
20804     return path.length < 2 ? object : baseGet(object, baseSlice(path, 0, -1));
20805   }
20806
20807   /**
20808    * The base implementation of `_.unset`.
20809    *
20810    * @private
20811    * @param {Object} object The object to modify.
20812    * @param {Array|string} path The property path to unset.
20813    * @returns {boolean} Returns `true` if the property is deleted, else `false`.
20814    */
20815   function baseUnset(object, path) {
20816     path = castPath(path, object);
20817     object = parent(object, path);
20818     return object == null || delete object[toKey(last(path))];
20819   }
20820
20821   /** `Object#toString` result references. */
20822   var objectTag$4 = '[object Object]';
20823
20824   /** Used for built-in method references. */
20825   var funcProto$2 = Function.prototype,
20826       objectProto$g = Object.prototype;
20827
20828   /** Used to resolve the decompiled source of functions. */
20829   var funcToString$2 = funcProto$2.toString;
20830
20831   /** Used to check objects for own properties. */
20832   var hasOwnProperty$d = objectProto$g.hasOwnProperty;
20833
20834   /** Used to infer the `Object` constructor. */
20835   var objectCtorString = funcToString$2.call(Object);
20836
20837   /**
20838    * Checks if `value` is a plain object, that is, an object created by the
20839    * `Object` constructor or one with a `[[Prototype]]` of `null`.
20840    *
20841    * @static
20842    * @memberOf _
20843    * @since 0.8.0
20844    * @category Lang
20845    * @param {*} value The value to check.
20846    * @returns {boolean} Returns `true` if `value` is a plain object, else `false`.
20847    * @example
20848    *
20849    * function Foo() {
20850    *   this.a = 1;
20851    * }
20852    *
20853    * _.isPlainObject(new Foo);
20854    * // => false
20855    *
20856    * _.isPlainObject([1, 2, 3]);
20857    * // => false
20858    *
20859    * _.isPlainObject({ 'x': 0, 'y': 0 });
20860    * // => true
20861    *
20862    * _.isPlainObject(Object.create(null));
20863    * // => true
20864    */
20865   function isPlainObject(value) {
20866     if (!isObjectLike(value) || baseGetTag(value) != objectTag$4) {
20867       return false;
20868     }
20869     var proto = getPrototype(value);
20870     if (proto === null) {
20871       return true;
20872     }
20873     var Ctor = hasOwnProperty$d.call(proto, 'constructor') && proto.constructor;
20874     return typeof Ctor == 'function' && Ctor instanceof Ctor &&
20875       funcToString$2.call(Ctor) == objectCtorString;
20876   }
20877
20878   /**
20879    * Used by `_.omit` to customize its `_.cloneDeep` use to only clone plain
20880    * objects.
20881    *
20882    * @private
20883    * @param {*} value The value to inspect.
20884    * @param {string} key The key of the property to inspect.
20885    * @returns {*} Returns the uncloned value or `undefined` to defer cloning to `_.cloneDeep`.
20886    */
20887   function customOmitClone(value) {
20888     return isPlainObject(value) ? undefined : value;
20889   }
20890
20891   /** Built-in value references. */
20892   var spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;
20893
20894   /**
20895    * Checks if `value` is a flattenable `arguments` object or array.
20896    *
20897    * @private
20898    * @param {*} value The value to check.
20899    * @returns {boolean} Returns `true` if `value` is flattenable, else `false`.
20900    */
20901   function isFlattenable(value) {
20902     return isArray(value) || isArguments(value) ||
20903       !!(spreadableSymbol && value && value[spreadableSymbol]);
20904   }
20905
20906   /**
20907    * The base implementation of `_.flatten` with support for restricting flattening.
20908    *
20909    * @private
20910    * @param {Array} array The array to flatten.
20911    * @param {number} depth The maximum recursion depth.
20912    * @param {boolean} [predicate=isFlattenable] The function invoked per iteration.
20913    * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks.
20914    * @param {Array} [result=[]] The initial result value.
20915    * @returns {Array} Returns the new flattened array.
20916    */
20917   function baseFlatten(array, depth, predicate, isStrict, result) {
20918     var index = -1,
20919         length = array.length;
20920
20921     predicate || (predicate = isFlattenable);
20922     result || (result = []);
20923
20924     while (++index < length) {
20925       var value = array[index];
20926       if (depth > 0 && predicate(value)) {
20927         if (depth > 1) {
20928           // Recursively flatten arrays (susceptible to call stack limits).
20929           baseFlatten(value, depth - 1, predicate, isStrict, result);
20930         } else {
20931           arrayPush(result, value);
20932         }
20933       } else if (!isStrict) {
20934         result[result.length] = value;
20935       }
20936     }
20937     return result;
20938   }
20939
20940   /**
20941    * Flattens `array` a single level deep.
20942    *
20943    * @static
20944    * @memberOf _
20945    * @since 0.1.0
20946    * @category Array
20947    * @param {Array} array The array to flatten.
20948    * @returns {Array} Returns the new flattened array.
20949    * @example
20950    *
20951    * _.flatten([1, [2, [3, [4]], 5]]);
20952    * // => [1, 2, [3, [4]], 5]
20953    */
20954   function flatten(array) {
20955     var length = array == null ? 0 : array.length;
20956     return length ? baseFlatten(array, 1) : [];
20957   }
20958
20959   /**
20960    * A faster alternative to `Function#apply`, this function invokes `func`
20961    * with the `this` binding of `thisArg` and the arguments of `args`.
20962    *
20963    * @private
20964    * @param {Function} func The function to invoke.
20965    * @param {*} thisArg The `this` binding of `func`.
20966    * @param {Array} args The arguments to invoke `func` with.
20967    * @returns {*} Returns the result of `func`.
20968    */
20969   function apply(func, thisArg, args) {
20970     switch (args.length) {
20971       case 0: return func.call(thisArg);
20972       case 1: return func.call(thisArg, args[0]);
20973       case 2: return func.call(thisArg, args[0], args[1]);
20974       case 3: return func.call(thisArg, args[0], args[1], args[2]);
20975     }
20976     return func.apply(thisArg, args);
20977   }
20978
20979   /* Built-in method references for those with the same name as other `lodash` methods. */
20980   var nativeMax = Math.max;
20981
20982   /**
20983    * A specialized version of `baseRest` which transforms the rest array.
20984    *
20985    * @private
20986    * @param {Function} func The function to apply a rest parameter to.
20987    * @param {number} [start=func.length-1] The start position of the rest parameter.
20988    * @param {Function} transform The rest array transform.
20989    * @returns {Function} Returns the new function.
20990    */
20991   function overRest(func, start, transform) {
20992     start = nativeMax(start === undefined ? (func.length - 1) : start, 0);
20993     return function() {
20994       var args = arguments,
20995           index = -1,
20996           length = nativeMax(args.length - start, 0),
20997           array = Array(length);
20998
20999       while (++index < length) {
21000         array[index] = args[start + index];
21001       }
21002       index = -1;
21003       var otherArgs = Array(start + 1);
21004       while (++index < start) {
21005         otherArgs[index] = args[index];
21006       }
21007       otherArgs[start] = transform(array);
21008       return apply(func, this, otherArgs);
21009     };
21010   }
21011
21012   /**
21013    * Creates a function that returns `value`.
21014    *
21015    * @static
21016    * @memberOf _
21017    * @since 2.4.0
21018    * @category Util
21019    * @param {*} value The value to return from the new function.
21020    * @returns {Function} Returns the new constant function.
21021    * @example
21022    *
21023    * var objects = _.times(2, _.constant({ 'a': 1 }));
21024    *
21025    * console.log(objects);
21026    * // => [{ 'a': 1 }, { 'a': 1 }]
21027    *
21028    * console.log(objects[0] === objects[1]);
21029    * // => true
21030    */
21031   function constant$d(value) {
21032     return function() {
21033       return value;
21034     };
21035   }
21036
21037   /**
21038    * The base implementation of `setToString` without support for hot loop shorting.
21039    *
21040    * @private
21041    * @param {Function} func The function to modify.
21042    * @param {Function} string The `toString` result.
21043    * @returns {Function} Returns `func`.
21044    */
21045   var baseSetToString = !defineProperty ? identity$8 : function(func, string) {
21046     return defineProperty(func, 'toString', {
21047       'configurable': true,
21048       'enumerable': false,
21049       'value': constant$d(string),
21050       'writable': true
21051     });
21052   };
21053
21054   /** Used to detect hot functions by number of calls within a span of milliseconds. */
21055   var HOT_COUNT = 800,
21056       HOT_SPAN = 16;
21057
21058   /* Built-in method references for those with the same name as other `lodash` methods. */
21059   var nativeNow = Date.now;
21060
21061   /**
21062    * Creates a function that'll short out and invoke `identity` instead
21063    * of `func` when it's called `HOT_COUNT` or more times in `HOT_SPAN`
21064    * milliseconds.
21065    *
21066    * @private
21067    * @param {Function} func The function to restrict.
21068    * @returns {Function} Returns the new shortable function.
21069    */
21070   function shortOut(func) {
21071     var count = 0,
21072         lastCalled = 0;
21073
21074     return function() {
21075       var stamp = nativeNow(),
21076           remaining = HOT_SPAN - (stamp - lastCalled);
21077
21078       lastCalled = stamp;
21079       if (remaining > 0) {
21080         if (++count >= HOT_COUNT) {
21081           return arguments[0];
21082         }
21083       } else {
21084         count = 0;
21085       }
21086       return func.apply(undefined, arguments);
21087     };
21088   }
21089
21090   /**
21091    * Sets the `toString` method of `func` to return `string`.
21092    *
21093    * @private
21094    * @param {Function} func The function to modify.
21095    * @param {Function} string The `toString` result.
21096    * @returns {Function} Returns `func`.
21097    */
21098   var setToString = shortOut(baseSetToString);
21099
21100   /**
21101    * A specialized version of `baseRest` which flattens the rest array.
21102    *
21103    * @private
21104    * @param {Function} func The function to apply a rest parameter to.
21105    * @returns {Function} Returns the new function.
21106    */
21107   function flatRest(func) {
21108     return setToString(overRest(func, undefined, flatten), func + '');
21109   }
21110
21111   /** Used to compose bitmasks for cloning. */
21112   var CLONE_DEEP_FLAG$1 = 1,
21113       CLONE_FLAT_FLAG$1 = 2,
21114       CLONE_SYMBOLS_FLAG$2 = 4;
21115
21116   /**
21117    * The opposite of `_.pick`; this method creates an object composed of the
21118    * own and inherited enumerable property paths of `object` that are not omitted.
21119    *
21120    * **Note:** This method is considerably slower than `_.pick`.
21121    *
21122    * @static
21123    * @since 0.1.0
21124    * @memberOf _
21125    * @category Object
21126    * @param {Object} object The source object.
21127    * @param {...(string|string[])} [paths] The property paths to omit.
21128    * @returns {Object} Returns the new object.
21129    * @example
21130    *
21131    * var object = { 'a': 1, 'b': '2', 'c': 3 };
21132    *
21133    * _.omit(object, ['a', 'c']);
21134    * // => { 'b': '2' }
21135    */
21136   var omit = flatRest(function(object, paths) {
21137     var result = {};
21138     if (object == null) {
21139       return result;
21140     }
21141     var isDeep = false;
21142     paths = arrayMap(paths, function(path) {
21143       path = castPath(path, object);
21144       isDeep || (isDeep = path.length > 1);
21145       return path;
21146     });
21147     copyObject(object, getAllKeysIn(object), result);
21148     if (isDeep) {
21149       result = baseClone(result, CLONE_DEEP_FLAG$1 | CLONE_FLAT_FLAG$1 | CLONE_SYMBOLS_FLAG$2, customOmitClone);
21150     }
21151     var length = paths.length;
21152     while (length--) {
21153       baseUnset(result, paths[length]);
21154     }
21155     return result;
21156   });
21157
21158   /**
21159    * Creates an array with all falsey values removed. The values `false`, `null`,
21160    * `0`, `""`, `undefined`, and `NaN` are falsey.
21161    *
21162    * @static
21163    * @memberOf _
21164    * @since 0.1.0
21165    * @category Array
21166    * @param {Array} array The array to compact.
21167    * @returns {Array} Returns the new array of filtered values.
21168    * @example
21169    *
21170    * _.compact([0, 1, false, 2, '', 3]);
21171    * // => [1, 2, 3]
21172    */
21173   function compact(array) {
21174     var index = -1,
21175         length = array == null ? 0 : array.length,
21176         resIndex = 0,
21177         result = [];
21178
21179     while (++index < length) {
21180       var value = array[index];
21181       if (value) {
21182         result[resIndex++] = value;
21183       }
21184     }
21185     return result;
21186   }
21187
21188   /**
21189    * The base implementation of `_.rest` which doesn't validate or coerce arguments.
21190    *
21191    * @private
21192    * @param {Function} func The function to apply a rest parameter to.
21193    * @param {number} [start=func.length-1] The start position of the rest parameter.
21194    * @returns {Function} Returns the new function.
21195    */
21196   function baseRest(func, start) {
21197     return setToString(overRest(func, start, identity$8), func + '');
21198   }
21199
21200   /**
21201    * Checks if the given arguments are from an iteratee call.
21202    *
21203    * @private
21204    * @param {*} value The potential iteratee value argument.
21205    * @param {*} index The potential iteratee index or key argument.
21206    * @param {*} object The potential iteratee object argument.
21207    * @returns {boolean} Returns `true` if the arguments are from an iteratee call,
21208    *  else `false`.
21209    */
21210   function isIterateeCall(value, index, object) {
21211     if (!isObject(object)) {
21212       return false;
21213     }
21214     var type = typeof index;
21215     if (type == 'number'
21216           ? (isArrayLike(object) && isIndex(index, object.length))
21217           : (type == 'string' && index in object)
21218         ) {
21219       return eq(object[index], value);
21220     }
21221     return false;
21222   }
21223
21224   /**
21225    * Creates a function like `_.assign`.
21226    *
21227    * @private
21228    * @param {Function} assigner The function to assign values.
21229    * @returns {Function} Returns the new assigner function.
21230    */
21231   function createAssigner(assigner) {
21232     return baseRest(function(object, sources) {
21233       var index = -1,
21234           length = sources.length,
21235           customizer = length > 1 ? sources[length - 1] : undefined,
21236           guard = length > 2 ? sources[2] : undefined;
21237
21238       customizer = (assigner.length > 3 && typeof customizer == 'function')
21239         ? (length--, customizer)
21240         : undefined;
21241
21242       if (guard && isIterateeCall(sources[0], sources[1], guard)) {
21243         customizer = length < 3 ? undefined : customizer;
21244         length = 1;
21245       }
21246       object = Object(object);
21247       while (++index < length) {
21248         var source = sources[index];
21249         if (source) {
21250           assigner(object, source, index, customizer);
21251         }
21252       }
21253       return object;
21254     });
21255   }
21256
21257   /**
21258    * This method is like `_.assign` except that it iterates over own and
21259    * inherited source properties.
21260    *
21261    * **Note:** This method mutates `object`.
21262    *
21263    * @static
21264    * @memberOf _
21265    * @since 4.0.0
21266    * @alias extend
21267    * @category Object
21268    * @param {Object} object The destination object.
21269    * @param {...Object} [sources] The source objects.
21270    * @returns {Object} Returns `object`.
21271    * @see _.assign
21272    * @example
21273    *
21274    * function Foo() {
21275    *   this.a = 1;
21276    * }
21277    *
21278    * function Bar() {
21279    *   this.c = 3;
21280    * }
21281    *
21282    * Foo.prototype.b = 2;
21283    * Bar.prototype.d = 4;
21284    *
21285    * _.assignIn({ 'a': 0 }, new Foo, new Bar);
21286    * // => { 'a': 1, 'b': 2, 'c': 3, 'd': 4 }
21287    */
21288   var assignIn = createAssigner(function(object, source) {
21289     copyObject(source, keysIn$1(source), object);
21290   });
21291
21292   /**
21293    * The base implementation of `_.filter` without support for iteratee shorthands.
21294    *
21295    * @private
21296    * @param {Array|Object} collection The collection to iterate over.
21297    * @param {Function} predicate The function invoked per iteration.
21298    * @returns {Array} Returns the new filtered array.
21299    */
21300   function baseFilter(collection, predicate) {
21301     var result = [];
21302     baseEach(collection, function(value, index, collection) {
21303       if (predicate(value, index, collection)) {
21304         result.push(value);
21305       }
21306     });
21307     return result;
21308   }
21309
21310   /**
21311    * Iterates over elements of `collection`, returning an array of all elements
21312    * `predicate` returns truthy for. The predicate is invoked with three
21313    * arguments: (value, index|key, collection).
21314    *
21315    * **Note:** Unlike `_.remove`, this method returns a new array.
21316    *
21317    * @static
21318    * @memberOf _
21319    * @since 0.1.0
21320    * @category Collection
21321    * @param {Array|Object} collection The collection to iterate over.
21322    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21323    * @returns {Array} Returns the new filtered array.
21324    * @see _.reject
21325    * @example
21326    *
21327    * var users = [
21328    *   { 'user': 'barney', 'age': 36, 'active': true },
21329    *   { 'user': 'fred',   'age': 40, 'active': false }
21330    * ];
21331    *
21332    * _.filter(users, function(o) { return !o.active; });
21333    * // => objects for ['fred']
21334    *
21335    * // The `_.matches` iteratee shorthand.
21336    * _.filter(users, { 'age': 36, 'active': true });
21337    * // => objects for ['barney']
21338    *
21339    * // The `_.matchesProperty` iteratee shorthand.
21340    * _.filter(users, ['active', false]);
21341    * // => objects for ['fred']
21342    *
21343    * // The `_.property` iteratee shorthand.
21344    * _.filter(users, 'active');
21345    * // => objects for ['barney']
21346    */
21347   function filter(collection, predicate) {
21348     var func = isArray(collection) ? arrayFilter : baseFilter;
21349     return func(collection, baseIteratee(predicate, 3));
21350   }
21351
21352   /**
21353    * Creates a `_.find` or `_.findLast` function.
21354    *
21355    * @private
21356    * @param {Function} findIndexFunc The function to find the collection index.
21357    * @returns {Function} Returns the new find function.
21358    */
21359   function createFind(findIndexFunc) {
21360     return function(collection, predicate, fromIndex) {
21361       var iterable = Object(collection);
21362       if (!isArrayLike(collection)) {
21363         var iteratee = baseIteratee(predicate, 3);
21364         collection = keys$1(collection);
21365         predicate = function(key) { return iteratee(iterable[key], key, iterable); };
21366       }
21367       var index = findIndexFunc(collection, predicate, fromIndex);
21368       return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;
21369     };
21370   }
21371
21372   /**
21373    * The base implementation of `_.findIndex` and `_.findLastIndex` without
21374    * support for iteratee shorthands.
21375    *
21376    * @private
21377    * @param {Array} array The array to inspect.
21378    * @param {Function} predicate The function invoked per iteration.
21379    * @param {number} fromIndex The index to search from.
21380    * @param {boolean} [fromRight] Specify iterating from right to left.
21381    * @returns {number} Returns the index of the matched value, else `-1`.
21382    */
21383   function baseFindIndex(array, predicate, fromIndex, fromRight) {
21384     var length = array.length,
21385         index = fromIndex + (fromRight ? 1 : -1);
21386
21387     while ((fromRight ? index-- : ++index < length)) {
21388       if (predicate(array[index], index, array)) {
21389         return index;
21390       }
21391     }
21392     return -1;
21393   }
21394
21395   /** Used as references for various `Number` constants. */
21396   var NAN = 0 / 0;
21397
21398   /** Used to match leading and trailing whitespace. */
21399   var reTrim = /^\s+|\s+$/g;
21400
21401   /** Used to detect bad signed hexadecimal string values. */
21402   var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;
21403
21404   /** Used to detect binary string values. */
21405   var reIsBinary = /^0b[01]+$/i;
21406
21407   /** Used to detect octal string values. */
21408   var reIsOctal = /^0o[0-7]+$/i;
21409
21410   /** Built-in method references without a dependency on `root`. */
21411   var freeParseInt = parseInt;
21412
21413   /**
21414    * Converts `value` to a number.
21415    *
21416    * @static
21417    * @memberOf _
21418    * @since 4.0.0
21419    * @category Lang
21420    * @param {*} value The value to process.
21421    * @returns {number} Returns the number.
21422    * @example
21423    *
21424    * _.toNumber(3.2);
21425    * // => 3.2
21426    *
21427    * _.toNumber(Number.MIN_VALUE);
21428    * // => 5e-324
21429    *
21430    * _.toNumber(Infinity);
21431    * // => Infinity
21432    *
21433    * _.toNumber('3.2');
21434    * // => 3.2
21435    */
21436   function toNumber(value) {
21437     if (typeof value == 'number') {
21438       return value;
21439     }
21440     if (isSymbol(value)) {
21441       return NAN;
21442     }
21443     if (isObject(value)) {
21444       var other = typeof value.valueOf == 'function' ? value.valueOf() : value;
21445       value = isObject(other) ? (other + '') : other;
21446     }
21447     if (typeof value != 'string') {
21448       return value === 0 ? value : +value;
21449     }
21450     value = value.replace(reTrim, '');
21451     var isBinary = reIsBinary.test(value);
21452     return (isBinary || reIsOctal.test(value))
21453       ? freeParseInt(value.slice(2), isBinary ? 2 : 8)
21454       : (reIsBadHex.test(value) ? NAN : +value);
21455   }
21456
21457   /** Used as references for various `Number` constants. */
21458   var INFINITY$2 = 1 / 0,
21459       MAX_INTEGER = 1.7976931348623157e+308;
21460
21461   /**
21462    * Converts `value` to a finite number.
21463    *
21464    * @static
21465    * @memberOf _
21466    * @since 4.12.0
21467    * @category Lang
21468    * @param {*} value The value to convert.
21469    * @returns {number} Returns the converted number.
21470    * @example
21471    *
21472    * _.toFinite(3.2);
21473    * // => 3.2
21474    *
21475    * _.toFinite(Number.MIN_VALUE);
21476    * // => 5e-324
21477    *
21478    * _.toFinite(Infinity);
21479    * // => 1.7976931348623157e+308
21480    *
21481    * _.toFinite('3.2');
21482    * // => 3.2
21483    */
21484   function toFinite(value) {
21485     if (!value) {
21486       return value === 0 ? value : 0;
21487     }
21488     value = toNumber(value);
21489     if (value === INFINITY$2 || value === -INFINITY$2) {
21490       var sign = (value < 0 ? -1 : 1);
21491       return sign * MAX_INTEGER;
21492     }
21493     return value === value ? value : 0;
21494   }
21495
21496   /**
21497    * Converts `value` to an integer.
21498    *
21499    * **Note:** This method is loosely based on
21500    * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).
21501    *
21502    * @static
21503    * @memberOf _
21504    * @since 4.0.0
21505    * @category Lang
21506    * @param {*} value The value to convert.
21507    * @returns {number} Returns the converted integer.
21508    * @example
21509    *
21510    * _.toInteger(3.2);
21511    * // => 3
21512    *
21513    * _.toInteger(Number.MIN_VALUE);
21514    * // => 0
21515    *
21516    * _.toInteger(Infinity);
21517    * // => 1.7976931348623157e+308
21518    *
21519    * _.toInteger('3.2');
21520    * // => 3
21521    */
21522   function toInteger(value) {
21523     var result = toFinite(value),
21524         remainder = result % 1;
21525
21526     return result === result ? (remainder ? result - remainder : result) : 0;
21527   }
21528
21529   /* Built-in method references for those with the same name as other `lodash` methods. */
21530   var nativeMax$1 = Math.max;
21531
21532   /**
21533    * This method is like `_.find` except that it returns the index of the first
21534    * element `predicate` returns truthy for instead of the element itself.
21535    *
21536    * @static
21537    * @memberOf _
21538    * @since 1.1.0
21539    * @category Array
21540    * @param {Array} array The array to inspect.
21541    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21542    * @param {number} [fromIndex=0] The index to search from.
21543    * @returns {number} Returns the index of the found element, else `-1`.
21544    * @example
21545    *
21546    * var users = [
21547    *   { 'user': 'barney',  'active': false },
21548    *   { 'user': 'fred',    'active': false },
21549    *   { 'user': 'pebbles', 'active': true }
21550    * ];
21551    *
21552    * _.findIndex(users, function(o) { return o.user == 'barney'; });
21553    * // => 0
21554    *
21555    * // The `_.matches` iteratee shorthand.
21556    * _.findIndex(users, { 'user': 'fred', 'active': false });
21557    * // => 1
21558    *
21559    * // The `_.matchesProperty` iteratee shorthand.
21560    * _.findIndex(users, ['active', false]);
21561    * // => 0
21562    *
21563    * // The `_.property` iteratee shorthand.
21564    * _.findIndex(users, 'active');
21565    * // => 2
21566    */
21567   function findIndex(array, predicate, fromIndex) {
21568     var length = array == null ? 0 : array.length;
21569     if (!length) {
21570       return -1;
21571     }
21572     var index = fromIndex == null ? 0 : toInteger(fromIndex);
21573     if (index < 0) {
21574       index = nativeMax$1(length + index, 0);
21575     }
21576     return baseFindIndex(array, baseIteratee(predicate, 3), index);
21577   }
21578
21579   /**
21580    * Iterates over elements of `collection`, returning the first element
21581    * `predicate` returns truthy for. The predicate is invoked with three
21582    * arguments: (value, index|key, collection).
21583    *
21584    * @static
21585    * @memberOf _
21586    * @since 0.1.0
21587    * @category Collection
21588    * @param {Array|Object} collection The collection to inspect.
21589    * @param {Function} [predicate=_.identity] The function invoked per iteration.
21590    * @param {number} [fromIndex=0] The index to search from.
21591    * @returns {*} Returns the matched element, else `undefined`.
21592    * @example
21593    *
21594    * var users = [
21595    *   { 'user': 'barney',  'age': 36, 'active': true },
21596    *   { 'user': 'fred',    'age': 40, 'active': false },
21597    *   { 'user': 'pebbles', 'age': 1,  'active': true }
21598    * ];
21599    *
21600    * _.find(users, function(o) { return o.age < 40; });
21601    * // => object for 'barney'
21602    *
21603    * // The `_.matches` iteratee shorthand.
21604    * _.find(users, { 'age': 1, 'active': true });
21605    * // => object for 'pebbles'
21606    *
21607    * // The `_.matchesProperty` iteratee shorthand.
21608    * _.find(users, ['active', false]);
21609    * // => object for 'fred'
21610    *
21611    * // The `_.property` iteratee shorthand.
21612    * _.find(users, 'active');
21613    * // => object for 'barney'
21614    */
21615   var find$1 = createFind(findIndex);
21616
21617   /**
21618    * The base implementation of `_.map` without support for iteratee shorthands.
21619    *
21620    * @private
21621    * @param {Array|Object} collection The collection to iterate over.
21622    * @param {Function} iteratee The function invoked per iteration.
21623    * @returns {Array} Returns the new mapped array.
21624    */
21625   function baseMap(collection, iteratee) {
21626     var index = -1,
21627         result = isArrayLike(collection) ? Array(collection.length) : [];
21628
21629     baseEach(collection, function(value, key, collection) {
21630       result[++index] = iteratee(value, key, collection);
21631     });
21632     return result;
21633   }
21634
21635   /**
21636    * Creates an array of values by running each element in `collection` thru
21637    * `iteratee`. The iteratee is invoked with three arguments:
21638    * (value, index|key, collection).
21639    *
21640    * Many lodash methods are guarded to work as iteratees for methods like
21641    * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.
21642    *
21643    * The guarded methods are:
21644    * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,
21645    * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,
21646    * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,
21647    * `template`, `trim`, `trimEnd`, `trimStart`, and `words`
21648    *
21649    * @static
21650    * @memberOf _
21651    * @since 0.1.0
21652    * @category Collection
21653    * @param {Array|Object} collection The collection to iterate over.
21654    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
21655    * @returns {Array} Returns the new mapped array.
21656    * @example
21657    *
21658    * function square(n) {
21659    *   return n * n;
21660    * }
21661    *
21662    * _.map([4, 8], square);
21663    * // => [16, 64]
21664    *
21665    * _.map({ 'a': 4, 'b': 8 }, square);
21666    * // => [16, 64] (iteration order is not guaranteed)
21667    *
21668    * var users = [
21669    *   { 'user': 'barney' },
21670    *   { 'user': 'fred' }
21671    * ];
21672    *
21673    * // The `_.property` iteratee shorthand.
21674    * _.map(users, 'user');
21675    * // => ['barney', 'fred']
21676    */
21677   function map$3(collection, iteratee) {
21678     var func = isArray(collection) ? arrayMap : baseMap;
21679     return func(collection, baseIteratee(iteratee, 3));
21680   }
21681
21682   /**
21683    * The base implementation of `_.values` and `_.valuesIn` which creates an
21684    * array of `object` property values corresponding to the property names
21685    * of `props`.
21686    *
21687    * @private
21688    * @param {Object} object The object to query.
21689    * @param {Array} props The property names to get values for.
21690    * @returns {Object} Returns the array of property values.
21691    */
21692   function baseValues(object, props) {
21693     return arrayMap(props, function(key) {
21694       return object[key];
21695     });
21696   }
21697
21698   /**
21699    * Creates an array of the own enumerable string keyed property values of `object`.
21700    *
21701    * **Note:** Non-object values are coerced to objects.
21702    *
21703    * @static
21704    * @since 0.1.0
21705    * @memberOf _
21706    * @category Object
21707    * @param {Object} object The object to query.
21708    * @returns {Array} Returns the array of property values.
21709    * @example
21710    *
21711    * function Foo() {
21712    *   this.a = 1;
21713    *   this.b = 2;
21714    * }
21715    *
21716    * Foo.prototype.c = 3;
21717    *
21718    * _.values(new Foo);
21719    * // => [1, 2] (iteration order is not guaranteed)
21720    *
21721    * _.values('hi');
21722    * // => ['h', 'i']
21723    */
21724   function values$1(object) {
21725     return object == null ? [] : baseValues(object, keys$1(object));
21726   }
21727
21728   /**
21729    * The base implementation of `_.toPairs` and `_.toPairsIn` which creates an array
21730    * of key-value pairs for `object` corresponding to the property names of `props`.
21731    *
21732    * @private
21733    * @param {Object} object The object to query.
21734    * @param {Array} props The property names to get values for.
21735    * @returns {Object} Returns the key-value pairs.
21736    */
21737   function baseToPairs(object, props) {
21738     return arrayMap(props, function(key) {
21739       return [key, object[key]];
21740     });
21741   }
21742
21743   /**
21744    * Converts `set` to its value-value pairs.
21745    *
21746    * @private
21747    * @param {Object} set The set to convert.
21748    * @returns {Array} Returns the value-value pairs.
21749    */
21750   function setToPairs(set) {
21751     var index = -1,
21752         result = Array(set.size);
21753
21754     set.forEach(function(value) {
21755       result[++index] = [value, value];
21756     });
21757     return result;
21758   }
21759
21760   /** `Object#toString` result references. */
21761   var mapTag$6 = '[object Map]',
21762       setTag$6 = '[object Set]';
21763
21764   /**
21765    * Creates a `_.toPairs` or `_.toPairsIn` function.
21766    *
21767    * @private
21768    * @param {Function} keysFunc The function to get the keys of a given object.
21769    * @returns {Function} Returns the new pairs function.
21770    */
21771   function createToPairs(keysFunc) {
21772     return function(object) {
21773       var tag = getTag$1(object);
21774       if (tag == mapTag$6) {
21775         return mapToArray(object);
21776       }
21777       if (tag == setTag$6) {
21778         return setToPairs(object);
21779       }
21780       return baseToPairs(object, keysFunc(object));
21781     };
21782   }
21783
21784   /**
21785    * Creates an array of own enumerable string keyed-value pairs for `object`
21786    * which can be consumed by `_.fromPairs`. If `object` is a map or set, its
21787    * entries are returned.
21788    *
21789    * @static
21790    * @memberOf _
21791    * @since 4.0.0
21792    * @alias entries
21793    * @category Object
21794    * @param {Object} object The object to query.
21795    * @returns {Array} Returns the key-value pairs.
21796    * @example
21797    *
21798    * function Foo() {
21799    *   this.a = 1;
21800    *   this.b = 2;
21801    * }
21802    *
21803    * Foo.prototype.c = 3;
21804    *
21805    * _.toPairs(new Foo);
21806    * // => [['a', 1], ['b', 2]] (iteration order is not guaranteed)
21807    */
21808   var toPairs = createToPairs(keys$1);
21809
21810   /**
21811    * The base implementation of `_.isNaN` without support for number objects.
21812    *
21813    * @private
21814    * @param {*} value The value to check.
21815    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
21816    */
21817   function baseIsNaN(value) {
21818     return value !== value;
21819   }
21820
21821   /**
21822    * A specialized version of `_.indexOf` which performs strict equality
21823    * comparisons of values, i.e. `===`.
21824    *
21825    * @private
21826    * @param {Array} array The array to inspect.
21827    * @param {*} value The value to search for.
21828    * @param {number} fromIndex The index to search from.
21829    * @returns {number} Returns the index of the matched value, else `-1`.
21830    */
21831   function strictIndexOf(array, value, fromIndex) {
21832     var index = fromIndex - 1,
21833         length = array.length;
21834
21835     while (++index < length) {
21836       if (array[index] === value) {
21837         return index;
21838       }
21839     }
21840     return -1;
21841   }
21842
21843   /**
21844    * The base implementation of `_.indexOf` without `fromIndex` bounds checks.
21845    *
21846    * @private
21847    * @param {Array} array The array to inspect.
21848    * @param {*} value The value to search for.
21849    * @param {number} fromIndex The index to search from.
21850    * @returns {number} Returns the index of the matched value, else `-1`.
21851    */
21852   function baseIndexOf(array, value, fromIndex) {
21853     return value === value
21854       ? strictIndexOf(array, value, fromIndex)
21855       : baseFindIndex(array, baseIsNaN, fromIndex);
21856   }
21857
21858   /**
21859    * A specialized version of `_.includes` for arrays without support for
21860    * specifying an index to search from.
21861    *
21862    * @private
21863    * @param {Array} [array] The array to inspect.
21864    * @param {*} target The value to search for.
21865    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21866    */
21867   function arrayIncludes(array, value) {
21868     var length = array == null ? 0 : array.length;
21869     return !!length && baseIndexOf(array, value, 0) > -1;
21870   }
21871
21872   /**
21873    * This function is like `arrayIncludes` except that it accepts a comparator.
21874    *
21875    * @private
21876    * @param {Array} [array] The array to inspect.
21877    * @param {*} target The value to search for.
21878    * @param {Function} comparator The comparator invoked per element.
21879    * @returns {boolean} Returns `true` if `target` is found, else `false`.
21880    */
21881   function arrayIncludesWith(array, value, comparator) {
21882     var index = -1,
21883         length = array == null ? 0 : array.length;
21884
21885     while (++index < length) {
21886       if (comparator(value, array[index])) {
21887         return true;
21888       }
21889     }
21890     return false;
21891   }
21892
21893   /**
21894    * This method returns `undefined`.
21895    *
21896    * @static
21897    * @memberOf _
21898    * @since 2.3.0
21899    * @category Util
21900    * @example
21901    *
21902    * _.times(2, _.noop);
21903    * // => [undefined, undefined]
21904    */
21905   function noop$3() {
21906     // No operation performed.
21907   }
21908
21909   /** Used as references for various `Number` constants. */
21910   var INFINITY$3 = 1 / 0;
21911
21912   /**
21913    * Creates a set object of `values`.
21914    *
21915    * @private
21916    * @param {Array} values The values to add to the set.
21917    * @returns {Object} Returns the new set.
21918    */
21919   var createSet = !(Set$1 && (1 / setToArray(new Set$1([,-0]))[1]) == INFINITY$3) ? noop$3 : function(values) {
21920     return new Set$1(values);
21921   };
21922
21923   /** Used as the size to enable large array optimizations. */
21924   var LARGE_ARRAY_SIZE$1 = 200;
21925
21926   /**
21927    * The base implementation of `_.uniqBy` without support for iteratee shorthands.
21928    *
21929    * @private
21930    * @param {Array} array The array to inspect.
21931    * @param {Function} [iteratee] The iteratee invoked per element.
21932    * @param {Function} [comparator] The comparator invoked per element.
21933    * @returns {Array} Returns the new duplicate free array.
21934    */
21935   function baseUniq(array, iteratee, comparator) {
21936     var index = -1,
21937         includes = arrayIncludes,
21938         length = array.length,
21939         isCommon = true,
21940         result = [],
21941         seen = result;
21942
21943     if (comparator) {
21944       isCommon = false;
21945       includes = arrayIncludesWith;
21946     }
21947     else if (length >= LARGE_ARRAY_SIZE$1) {
21948       var set = iteratee ? null : createSet(array);
21949       if (set) {
21950         return setToArray(set);
21951       }
21952       isCommon = false;
21953       includes = cacheHas;
21954       seen = new SetCache;
21955     }
21956     else {
21957       seen = iteratee ? [] : result;
21958     }
21959     outer:
21960     while (++index < length) {
21961       var value = array[index],
21962           computed = iteratee ? iteratee(value) : value;
21963
21964       value = (comparator || value !== 0) ? value : 0;
21965       if (isCommon && computed === computed) {
21966         var seenIndex = seen.length;
21967         while (seenIndex--) {
21968           if (seen[seenIndex] === computed) {
21969             continue outer;
21970           }
21971         }
21972         if (iteratee) {
21973           seen.push(computed);
21974         }
21975         result.push(value);
21976       }
21977       else if (!includes(seen, computed, comparator)) {
21978         if (seen !== result) {
21979           seen.push(computed);
21980         }
21981         result.push(value);
21982       }
21983     }
21984     return result;
21985   }
21986
21987   /**
21988    * This method is like `_.isArrayLike` except that it also checks if `value`
21989    * is an object.
21990    *
21991    * @static
21992    * @memberOf _
21993    * @since 4.0.0
21994    * @category Lang
21995    * @param {*} value The value to check.
21996    * @returns {boolean} Returns `true` if `value` is an array-like object,
21997    *  else `false`.
21998    * @example
21999    *
22000    * _.isArrayLikeObject([1, 2, 3]);
22001    * // => true
22002    *
22003    * _.isArrayLikeObject(document.body.children);
22004    * // => true
22005    *
22006    * _.isArrayLikeObject('abc');
22007    * // => false
22008    *
22009    * _.isArrayLikeObject(_.noop);
22010    * // => false
22011    */
22012   function isArrayLikeObject(value) {
22013     return isObjectLike(value) && isArrayLike(value);
22014   }
22015
22016   /**
22017    * Creates an array of unique values, in order, from all given arrays using
22018    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22019    * for equality comparisons.
22020    *
22021    * @static
22022    * @memberOf _
22023    * @since 0.1.0
22024    * @category Array
22025    * @param {...Array} [arrays] The arrays to inspect.
22026    * @returns {Array} Returns the new array of combined values.
22027    * @example
22028    *
22029    * _.union([2], [1, 2]);
22030    * // => [2, 1]
22031    */
22032   var union = baseRest(function(arrays) {
22033     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));
22034   });
22035
22036   /** Used as the size to enable large array optimizations. */
22037   var LARGE_ARRAY_SIZE$2 = 200;
22038
22039   /**
22040    * The base implementation of methods like `_.difference` without support
22041    * for excluding multiple arrays or iteratee shorthands.
22042    *
22043    * @private
22044    * @param {Array} array The array to inspect.
22045    * @param {Array} values The values to exclude.
22046    * @param {Function} [iteratee] The iteratee invoked per element.
22047    * @param {Function} [comparator] The comparator invoked per element.
22048    * @returns {Array} Returns the new array of filtered values.
22049    */
22050   function baseDifference(array, values, iteratee, comparator) {
22051     var index = -1,
22052         includes = arrayIncludes,
22053         isCommon = true,
22054         length = array.length,
22055         result = [],
22056         valuesLength = values.length;
22057
22058     if (!length) {
22059       return result;
22060     }
22061     if (iteratee) {
22062       values = arrayMap(values, baseUnary(iteratee));
22063     }
22064     if (comparator) {
22065       includes = arrayIncludesWith;
22066       isCommon = false;
22067     }
22068     else if (values.length >= LARGE_ARRAY_SIZE$2) {
22069       includes = cacheHas;
22070       isCommon = false;
22071       values = new SetCache(values);
22072     }
22073     outer:
22074     while (++index < length) {
22075       var value = array[index],
22076           computed = iteratee == null ? value : iteratee(value);
22077
22078       value = (comparator || value !== 0) ? value : 0;
22079       if (isCommon && computed === computed) {
22080         var valuesIndex = valuesLength;
22081         while (valuesIndex--) {
22082           if (values[valuesIndex] === computed) {
22083             continue outer;
22084           }
22085         }
22086         result.push(value);
22087       }
22088       else if (!includes(values, computed, comparator)) {
22089         result.push(value);
22090       }
22091     }
22092     return result;
22093   }
22094
22095   /**
22096    * Creates an array excluding all given values using
22097    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
22098    * for equality comparisons.
22099    *
22100    * **Note:** Unlike `_.pull`, this method returns a new array.
22101    *
22102    * @static
22103    * @memberOf _
22104    * @since 0.1.0
22105    * @category Array
22106    * @param {Array} array The array to inspect.
22107    * @param {...*} [values] The values to exclude.
22108    * @returns {Array} Returns the new array of filtered values.
22109    * @see _.difference, _.xor
22110    * @example
22111    *
22112    * _.without([2, 1, 2, 3], 1, 2);
22113    * // => [3]
22114    */
22115   var without = baseRest(function(array, values) {
22116     return isArrayLikeObject(array)
22117       ? baseDifference(array, values)
22118       : [];
22119   });
22120
22121   function osmIsInterestingTag(key) {
22122       return key !== 'attribution' &&
22123           key !== 'created_by' &&
22124           key !== 'source' &&
22125           key !== 'odbl' &&
22126           key.indexOf('tiger:') !== 0;
22127
22128   }
22129
22130
22131   var osmOneWayTags = {
22132       'aerialway': {
22133           'chair_lift': true,
22134           'mixed_lift': true,
22135           't-bar': true,
22136           'j-bar': true,
22137           'platter': true,
22138           'rope_tow': true,
22139           'magic_carpet': true,
22140           'yes': true
22141       },
22142       'highway': {
22143           'motorway': true
22144       },
22145       'junction': {
22146           'circular': true,
22147           'roundabout': true
22148       },
22149       'man_made': {
22150           'piste:halfpipe': true
22151       },
22152       'piste:type': {
22153           'downhill': true,
22154           'sled': true,
22155           'yes': true
22156       },
22157       'waterway': {
22158           'canal': true,
22159           'ditch': true,
22160           'drain': true,
22161           'river': true,
22162           'stream': true
22163       }
22164   };
22165
22166
22167   var osmPavedTags = {
22168       'surface': {
22169           'paved': true,
22170           'asphalt': true,
22171           'concrete': true,
22172           'concrete:lanes': true,
22173           'concrete:plates': true
22174       },
22175       'tracktype': {
22176           'grade1': true
22177       }
22178   };
22179
22180   var osmRightSideIsInsideTags = {
22181       'natural': {
22182           'cliff': true,
22183           'coastline': 'coastline',
22184       },
22185       'barrier': {
22186           'retaining_wall': true,
22187           'kerb': true,
22188           'guard_rail': true,
22189           'city_wall': true,
22190       },
22191       'man_made': {
22192           'embankment': true
22193       }
22194   };
22195
22196   var wikipedia = [
22197       [
22198           "Abkhazian",
22199           "Аҧсшәа",
22200           "ab"
22201       ],
22202       [
22203           "Achinese",
22204           "Acèh",
22205           "ace"
22206       ],
22207       [
22208           "Adyghe",
22209           "адыгабзэ",
22210           "ady"
22211       ],
22212       [
22213           "Afrikaans",
22214           "Afrikaans",
22215           "af"
22216       ],
22217       [
22218           "Akan",
22219           "Akan",
22220           "ak"
22221       ],
22222       [
22223           "Alemannisch",
22224           "Alemannisch",
22225           "als"
22226       ],
22227       [
22228           "Amharic",
22229           "አማርኛ",
22230           "am"
22231       ],
22232       [
22233           "Aragonese",
22234           "aragonés",
22235           "an"
22236       ],
22237       [
22238           "Old English",
22239           "Ænglisc",
22240           "ang"
22241       ],
22242       [
22243           "Arabic",
22244           "العربية",
22245           "ar"
22246       ],
22247       [
22248           "Aramaic",
22249           "ܐܪܡܝܐ",
22250           "arc"
22251       ],
22252       [
22253           "Egyptian Arabic",
22254           "مصرى",
22255           "arz"
22256       ],
22257       [
22258           "Assamese",
22259           "অসমীয়া",
22260           "as"
22261       ],
22262       [
22263           "Asturian",
22264           "asturianu",
22265           "ast"
22266       ],
22267       [
22268           "Avaric",
22269           "авар",
22270           "av"
22271       ],
22272       [
22273           "Aymara",
22274           "Aymar aru",
22275           "ay"
22276       ],
22277       [
22278           "Azerbaijani",
22279           "azərbaycanca",
22280           "az"
22281       ],
22282       [
22283           "تۆرکجه",
22284           "تۆرکجه",
22285           "azb"
22286       ],
22287       [
22288           "Bashkir",
22289           "башҡортса",
22290           "ba"
22291       ],
22292       [
22293           "Bavarian",
22294           "Boarisch",
22295           "bar"
22296       ],
22297       [
22298           "Samogitian",
22299           "žemaitėška",
22300           "bat-smg"
22301       ],
22302       [
22303           "Bikol Central",
22304           "Bikol Central",
22305           "bcl"
22306       ],
22307       [
22308           "Belarusian",
22309           "беларуская",
22310           "be"
22311       ],
22312       [
22313           "беларуская (тарашкевіца)‎",
22314           "беларуская (тарашкевіца)‎",
22315           "be-x-old"
22316       ],
22317       [
22318           "Bulgarian",
22319           "български",
22320           "bg"
22321       ],
22322       [
22323           "भोजपुरी",
22324           "भोजपुरी",
22325           "bh"
22326       ],
22327       [
22328           "Bislama",
22329           "Bislama",
22330           "bi"
22331       ],
22332       [
22333           "Banjar",
22334           "Bahasa Banjar",
22335           "bjn"
22336       ],
22337       [
22338           "Bambara",
22339           "bamanankan",
22340           "bm"
22341       ],
22342       [
22343           "Bangla",
22344           "বাংলা",
22345           "bn"
22346       ],
22347       [
22348           "Tibetan",
22349           "བོད་ཡིག",
22350           "bo"
22351       ],
22352       [
22353           "Bishnupriya",
22354           "বিষ্ণুপ্রিয়া মণিপুরী",
22355           "bpy"
22356       ],
22357       [
22358           "Breton",
22359           "brezhoneg",
22360           "br"
22361       ],
22362       [
22363           "Bosnian",
22364           "bosanski",
22365           "bs"
22366       ],
22367       [
22368           "Buginese",
22369           "ᨅᨔ ᨕᨘᨁᨗ",
22370           "bug"
22371       ],
22372       [
22373           "буряад",
22374           "буряад",
22375           "bxr"
22376       ],
22377       [
22378           "Catalan",
22379           "català",
22380           "ca"
22381       ],
22382       [
22383           "Chavacano de Zamboanga",
22384           "Chavacano de Zamboanga",
22385           "cbk-zam"
22386       ],
22387       [
22388           "Min Dong Chinese",
22389           "Mìng-dĕ̤ng-ngṳ̄",
22390           "cdo"
22391       ],
22392       [
22393           "Chechen",
22394           "нохчийн",
22395           "ce"
22396       ],
22397       [
22398           "Cebuano",
22399           "Cebuano",
22400           "ceb"
22401       ],
22402       [
22403           "Chamorro",
22404           "Chamoru",
22405           "ch"
22406       ],
22407       [
22408           "Cherokee",
22409           "ᏣᎳᎩ",
22410           "chr"
22411       ],
22412       [
22413           "Cheyenne",
22414           "Tsetsêhestâhese",
22415           "chy"
22416       ],
22417       [
22418           "Central Kurdish",
22419           "کوردیی ناوەندی",
22420           "ckb"
22421       ],
22422       [
22423           "Corsican",
22424           "corsu",
22425           "co"
22426       ],
22427       [
22428           "Cree",
22429           "Nēhiyawēwin / ᓀᐦᐃᔭᐍᐏᐣ",
22430           "cr"
22431       ],
22432       [
22433           "Crimean Turkish",
22434           "qırımtatarca",
22435           "crh"
22436       ],
22437       [
22438           "Czech",
22439           "čeština",
22440           "cs"
22441       ],
22442       [
22443           "Kashubian",
22444           "kaszëbsczi",
22445           "csb"
22446       ],
22447       [
22448           "Church Slavic",
22449           "словѣньскъ / ⰔⰎⰑⰂⰡⰐⰠⰔⰍⰟ",
22450           "cu"
22451       ],
22452       [
22453           "Chuvash",
22454           "Чӑвашла",
22455           "cv"
22456       ],
22457       [
22458           "Welsh",
22459           "Cymraeg",
22460           "cy"
22461       ],
22462       [
22463           "Danish",
22464           "dansk",
22465           "da"
22466       ],
22467       [
22468           "German",
22469           "Deutsch",
22470           "de"
22471       ],
22472       [
22473           "Zazaki",
22474           "Zazaki",
22475           "diq"
22476       ],
22477       [
22478           "Lower Sorbian",
22479           "dolnoserbski",
22480           "dsb"
22481       ],
22482       [
22483           "Divehi",
22484           "ދިވެހިބަސް",
22485           "dv"
22486       ],
22487       [
22488           "Dzongkha",
22489           "ཇོང་ཁ",
22490           "dz"
22491       ],
22492       [
22493           "Ewe",
22494           "eʋegbe",
22495           "ee"
22496       ],
22497       [
22498           "Greek",
22499           "Ελληνικά",
22500           "el"
22501       ],
22502       [
22503           "Emiliano-Romagnolo",
22504           "emiliàn e rumagnòl",
22505           "eml"
22506       ],
22507       [
22508           "English",
22509           "English",
22510           "en"
22511       ],
22512       [
22513           "Esperanto",
22514           "Esperanto",
22515           "eo"
22516       ],
22517       [
22518           "Spanish",
22519           "español",
22520           "es"
22521       ],
22522       [
22523           "Estonian",
22524           "eesti",
22525           "et"
22526       ],
22527       [
22528           "Basque",
22529           "euskara",
22530           "eu"
22531       ],
22532       [
22533           "Extremaduran",
22534           "estremeñu",
22535           "ext"
22536       ],
22537       [
22538           "Persian",
22539           "فارسی",
22540           "fa"
22541       ],
22542       [
22543           "Fulah",
22544           "Fulfulde",
22545           "ff"
22546       ],
22547       [
22548           "Finnish",
22549           "suomi",
22550           "fi"
22551       ],
22552       [
22553           "Võro",
22554           "Võro",
22555           "fiu-vro"
22556       ],
22557       [
22558           "Fijian",
22559           "Na Vosa Vakaviti",
22560           "fj"
22561       ],
22562       [
22563           "Faroese",
22564           "føroyskt",
22565           "fo"
22566       ],
22567       [
22568           "French",
22569           "français",
22570           "fr"
22571       ],
22572       [
22573           "Arpitan",
22574           "arpetan",
22575           "frp"
22576       ],
22577       [
22578           "Northern Frisian",
22579           "Nordfriisk",
22580           "frr"
22581       ],
22582       [
22583           "Friulian",
22584           "furlan",
22585           "fur"
22586       ],
22587       [
22588           "Western Frisian",
22589           "Frysk",
22590           "fy"
22591       ],
22592       [
22593           "Irish",
22594           "Gaeilge",
22595           "ga"
22596       ],
22597       [
22598           "Gagauz",
22599           "Gagauz",
22600           "gag"
22601       ],
22602       [
22603           "Gan Chinese",
22604           "贛語",
22605           "gan"
22606       ],
22607       [
22608           "Scottish Gaelic",
22609           "Gàidhlig",
22610           "gd"
22611       ],
22612       [
22613           "Galician",
22614           "galego",
22615           "gl"
22616       ],
22617       [
22618           "Gilaki",
22619           "گیلکی",
22620           "glk"
22621       ],
22622       [
22623           "Guarani",
22624           "Avañe'ẽ",
22625           "gn"
22626       ],
22627       [
22628           "Goan Konkani",
22629           "गोंयची कोंकणी / Gõychi Konknni",
22630           "gom"
22631       ],
22632       [
22633           "Gothic",
22634           "𐌲𐌿𐍄𐌹𐍃𐌺",
22635           "got"
22636       ],
22637       [
22638           "Gujarati",
22639           "ગુજરાતી",
22640           "gu"
22641       ],
22642       [
22643           "Manx",
22644           "Gaelg",
22645           "gv"
22646       ],
22647       [
22648           "Hausa",
22649           "Hausa",
22650           "ha"
22651       ],
22652       [
22653           "Hakka Chinese",
22654           "客家語/Hak-kâ-ngî",
22655           "hak"
22656       ],
22657       [
22658           "Hawaiian",
22659           "Hawaiʻi",
22660           "haw"
22661       ],
22662       [
22663           "Hebrew",
22664           "עברית",
22665           "he"
22666       ],
22667       [
22668           "Hindi",
22669           "हिन्दी",
22670           "hi"
22671       ],
22672       [
22673           "Fiji Hindi",
22674           "Fiji Hindi",
22675           "hif"
22676       ],
22677       [
22678           "Croatian",
22679           "hrvatski",
22680           "hr"
22681       ],
22682       [
22683           "Upper Sorbian",
22684           "hornjoserbsce",
22685           "hsb"
22686       ],
22687       [
22688           "Haitian Creole",
22689           "Kreyòl ayisyen",
22690           "ht"
22691       ],
22692       [
22693           "Hungarian",
22694           "magyar",
22695           "hu"
22696       ],
22697       [
22698           "Armenian",
22699           "Հայերեն",
22700           "hy"
22701       ],
22702       [
22703           "Interlingua",
22704           "interlingua",
22705           "ia"
22706       ],
22707       [
22708           "Indonesian",
22709           "Bahasa Indonesia",
22710           "id"
22711       ],
22712       [
22713           "Interlingue",
22714           "Interlingue",
22715           "ie"
22716       ],
22717       [
22718           "Igbo",
22719           "Igbo",
22720           "ig"
22721       ],
22722       [
22723           "Inupiaq",
22724           "Iñupiak",
22725           "ik"
22726       ],
22727       [
22728           "Iloko",
22729           "Ilokano",
22730           "ilo"
22731       ],
22732       [
22733           "Ido",
22734           "Ido",
22735           "io"
22736       ],
22737       [
22738           "Icelandic",
22739           "íslenska",
22740           "is"
22741       ],
22742       [
22743           "Italian",
22744           "italiano",
22745           "it"
22746       ],
22747       [
22748           "Inuktitut",
22749           "ᐃᓄᒃᑎᑐᑦ/inuktitut",
22750           "iu"
22751       ],
22752       [
22753           "Japanese",
22754           "日本語",
22755           "ja"
22756       ],
22757       [
22758           "Jamaican Creole English",
22759           "Patois",
22760           "jam"
22761       ],
22762       [
22763           "Lojban",
22764           "la .lojban.",
22765           "jbo"
22766       ],
22767       [
22768           "Javanese",
22769           "Basa Jawa",
22770           "jv"
22771       ],
22772       [
22773           "Georgian",
22774           "ქართული",
22775           "ka"
22776       ],
22777       [
22778           "Kara-Kalpak",
22779           "Qaraqalpaqsha",
22780           "kaa"
22781       ],
22782       [
22783           "Kabyle",
22784           "Taqbaylit",
22785           "kab"
22786       ],
22787       [
22788           "Kabardian",
22789           "Адыгэбзэ",
22790           "kbd"
22791       ],
22792       [
22793           "Kongo",
22794           "Kongo",
22795           "kg"
22796       ],
22797       [
22798           "Kikuyu",
22799           "Gĩkũyũ",
22800           "ki"
22801       ],
22802       [
22803           "Kazakh",
22804           "қазақша",
22805           "kk"
22806       ],
22807       [
22808           "Kalaallisut",
22809           "kalaallisut",
22810           "kl"
22811       ],
22812       [
22813           "Khmer",
22814           "ភាសាខ្មែរ",
22815           "km"
22816       ],
22817       [
22818           "Kannada",
22819           "ಕನ್ನಡ",
22820           "kn"
22821       ],
22822       [
22823           "Korean",
22824           "한국어",
22825           "ko"
22826       ],
22827       [
22828           "Komi-Permyak",
22829           "Перем Коми",
22830           "koi"
22831       ],
22832       [
22833           "Karachay-Balkar",
22834           "къарачай-малкъар",
22835           "krc"
22836       ],
22837       [
22838           "Kashmiri",
22839           "कॉशुर / کٲشُر",
22840           "ks"
22841       ],
22842       [
22843           "Colognian",
22844           "Ripoarisch",
22845           "ksh"
22846       ],
22847       [
22848           "Kurdish",
22849           "Kurdî",
22850           "ku"
22851       ],
22852       [
22853           "Komi",
22854           "коми",
22855           "kv"
22856       ],
22857       [
22858           "Cornish",
22859           "kernowek",
22860           "kw"
22861       ],
22862       [
22863           "Kyrgyz",
22864           "Кыргызча",
22865           "ky"
22866       ],
22867       [
22868           "Latin",
22869           "Latina",
22870           "la"
22871       ],
22872       [
22873           "Ladino",
22874           "Ladino",
22875           "lad"
22876       ],
22877       [
22878           "Luxembourgish",
22879           "Lëtzebuergesch",
22880           "lb"
22881       ],
22882       [
22883           "лакку",
22884           "лакку",
22885           "lbe"
22886       ],
22887       [
22888           "Lezghian",
22889           "лезги",
22890           "lez"
22891       ],
22892       [
22893           "Ganda",
22894           "Luganda",
22895           "lg"
22896       ],
22897       [
22898           "Limburgish",
22899           "Limburgs",
22900           "li"
22901       ],
22902       [
22903           "Ligurian",
22904           "Ligure",
22905           "lij"
22906       ],
22907       [
22908           "Lombard",
22909           "lumbaart",
22910           "lmo"
22911       ],
22912       [
22913           "Lingala",
22914           "lingála",
22915           "ln"
22916       ],
22917       [
22918           "Lao",
22919           "ລາວ",
22920           "lo"
22921       ],
22922       [
22923           "Northern Luri",
22924           "لۊری شومالی",
22925           "lrc"
22926       ],
22927       [
22928           "Lithuanian",
22929           "lietuvių",
22930           "lt"
22931       ],
22932       [
22933           "Latgalian",
22934           "latgaļu",
22935           "ltg"
22936       ],
22937       [
22938           "Latvian",
22939           "latviešu",
22940           "lv"
22941       ],
22942       [
22943           "Maithili",
22944           "मैथिली",
22945           "mai"
22946       ],
22947       [
22948           "Basa Banyumasan",
22949           "Basa Banyumasan",
22950           "map-bms"
22951       ],
22952       [
22953           "Moksha",
22954           "мокшень",
22955           "mdf"
22956       ],
22957       [
22958           "Malagasy",
22959           "Malagasy",
22960           "mg"
22961       ],
22962       [
22963           "Eastern Mari",
22964           "олык марий",
22965           "mhr"
22966       ],
22967       [
22968           "Maori",
22969           "Māori",
22970           "mi"
22971       ],
22972       [
22973           "Minangkabau",
22974           "Baso Minangkabau",
22975           "min"
22976       ],
22977       [
22978           "Macedonian",
22979           "македонски",
22980           "mk"
22981       ],
22982       [
22983           "Malayalam",
22984           "മലയാളം",
22985           "ml"
22986       ],
22987       [
22988           "Mongolian",
22989           "монгол",
22990           "mn"
22991       ],
22992       [
22993           "Marathi",
22994           "मराठी",
22995           "mr"
22996       ],
22997       [
22998           "Western Mari",
22999           "кырык мары",
23000           "mrj"
23001       ],
23002       [
23003           "Malay",
23004           "Bahasa Melayu",
23005           "ms"
23006       ],
23007       [
23008           "Maltese",
23009           "Malti",
23010           "mt"
23011       ],
23012       [
23013           "Mirandese",
23014           "Mirandés",
23015           "mwl"
23016       ],
23017       [
23018           "Burmese",
23019           "မြန်မာဘာသာ",
23020           "my"
23021       ],
23022       [
23023           "Erzya",
23024           "эрзянь",
23025           "myv"
23026       ],
23027       [
23028           "Mazanderani",
23029           "مازِرونی",
23030           "mzn"
23031       ],
23032       [
23033           "Nauru",
23034           "Dorerin Naoero",
23035           "na"
23036       ],
23037       [
23038           "Nāhuatl",
23039           "Nāhuatl",
23040           "nah"
23041       ],
23042       [
23043           "Neapolitan",
23044           "Napulitano",
23045           "nap"
23046       ],
23047       [
23048           "Low German",
23049           "Plattdüütsch",
23050           "nds"
23051       ],
23052       [
23053           "Low Saxon",
23054           "Nedersaksies",
23055           "nds-nl"
23056       ],
23057       [
23058           "Nepali",
23059           "नेपाली",
23060           "ne"
23061       ],
23062       [
23063           "Newari",
23064           "नेपाल भाषा",
23065           "new"
23066       ],
23067       [
23068           "Dutch",
23069           "Nederlands",
23070           "nl"
23071       ],
23072       [
23073           "Norwegian Nynorsk",
23074           "norsk nynorsk",
23075           "nn"
23076       ],
23077       [
23078           "Norwegian",
23079           "norsk bokmål",
23080           "no"
23081       ],
23082       [
23083           "Novial",
23084           "Novial",
23085           "nov"
23086       ],
23087       [
23088           "Nouormand",
23089           "Nouormand",
23090           "nrm"
23091       ],
23092       [
23093           "Northern Sotho",
23094           "Sesotho sa Leboa",
23095           "nso"
23096       ],
23097       [
23098           "Navajo",
23099           "Diné bizaad",
23100           "nv"
23101       ],
23102       [
23103           "Nyanja",
23104           "Chi-Chewa",
23105           "ny"
23106       ],
23107       [
23108           "Occitan",
23109           "occitan",
23110           "oc"
23111       ],
23112       [
23113           "Livvi-Karelian",
23114           "Livvinkarjala",
23115           "olo"
23116       ],
23117       [
23118           "Oromo",
23119           "Oromoo",
23120           "om"
23121       ],
23122       [
23123           "Odia",
23124           "ଓଡ଼ିଆ",
23125           "or"
23126       ],
23127       [
23128           "Ossetic",
23129           "Ирон",
23130           "os"
23131       ],
23132       [
23133           "Punjabi",
23134           "ਪੰਜਾਬੀ",
23135           "pa"
23136       ],
23137       [
23138           "Pangasinan",
23139           "Pangasinan",
23140           "pag"
23141       ],
23142       [
23143           "Pampanga",
23144           "Kapampangan",
23145           "pam"
23146       ],
23147       [
23148           "Papiamento",
23149           "Papiamentu",
23150           "pap"
23151       ],
23152       [
23153           "Picard",
23154           "Picard",
23155           "pcd"
23156       ],
23157       [
23158           "Pennsylvania German",
23159           "Deitsch",
23160           "pdc"
23161       ],
23162       [
23163           "Palatine German",
23164           "Pälzisch",
23165           "pfl"
23166       ],
23167       [
23168           "Pali",
23169           "पालि",
23170           "pi"
23171       ],
23172       [
23173           "Norfuk / Pitkern",
23174           "Norfuk / Pitkern",
23175           "pih"
23176       ],
23177       [
23178           "Polish",
23179           "polski",
23180           "pl"
23181       ],
23182       [
23183           "Piedmontese",
23184           "Piemontèis",
23185           "pms"
23186       ],
23187       [
23188           "Western Punjabi",
23189           "پنجابی",
23190           "pnb"
23191       ],
23192       [
23193           "Pontic",
23194           "Ποντιακά",
23195           "pnt"
23196       ],
23197       [
23198           "Pashto",
23199           "پښتو",
23200           "ps"
23201       ],
23202       [
23203           "Portuguese",
23204           "português",
23205           "pt"
23206       ],
23207       [
23208           "Quechua",
23209           "Runa Simi",
23210           "qu"
23211       ],
23212       [
23213           "Romansh",
23214           "rumantsch",
23215           "rm"
23216       ],
23217       [
23218           "Romani",
23219           "Romani",
23220           "rmy"
23221       ],
23222       [
23223           "Rundi",
23224           "Kirundi",
23225           "rn"
23226       ],
23227       [
23228           "Romanian",
23229           "română",
23230           "ro"
23231       ],
23232       [
23233           "Aromanian",
23234           "armãneashti",
23235           "roa-rup"
23236       ],
23237       [
23238           "tarandíne",
23239           "tarandíne",
23240           "roa-tara"
23241       ],
23242       [
23243           "Russian",
23244           "русский",
23245           "ru"
23246       ],
23247       [
23248           "Rusyn",
23249           "русиньскый",
23250           "rue"
23251       ],
23252       [
23253           "Kinyarwanda",
23254           "Kinyarwanda",
23255           "rw"
23256       ],
23257       [
23258           "Sanskrit",
23259           "संस्कृतम्",
23260           "sa"
23261       ],
23262       [
23263           "Sakha",
23264           "саха тыла",
23265           "sah"
23266       ],
23267       [
23268           "Sardinian",
23269           "sardu",
23270           "sc"
23271       ],
23272       [
23273           "Sicilian",
23274           "sicilianu",
23275           "scn"
23276       ],
23277       [
23278           "Scots",
23279           "Scots",
23280           "sco"
23281       ],
23282       [
23283           "Sindhi",
23284           "سنڌي",
23285           "sd"
23286       ],
23287       [
23288           "Northern Sami",
23289           "sámegiella",
23290           "se"
23291       ],
23292       [
23293           "Sango",
23294           "Sängö",
23295           "sg"
23296       ],
23297       [
23298           "Serbo-Croatian",
23299           "srpskohrvatski / српскохрватски",
23300           "sh"
23301       ],
23302       [
23303           "Sinhala",
23304           "සිංහල",
23305           "si"
23306       ],
23307       [
23308           "Simple English",
23309           "Simple English",
23310           "simple"
23311       ],
23312       [
23313           "Slovak",
23314           "slovenčina",
23315           "sk"
23316       ],
23317       [
23318           "Slovenian",
23319           "slovenščina",
23320           "sl"
23321       ],
23322       [
23323           "Samoan",
23324           "Gagana Samoa",
23325           "sm"
23326       ],
23327       [
23328           "Shona",
23329           "chiShona",
23330           "sn"
23331       ],
23332       [
23333           "Somali",
23334           "Soomaaliga",
23335           "so"
23336       ],
23337       [
23338           "Albanian",
23339           "shqip",
23340           "sq"
23341       ],
23342       [
23343           "Serbian",
23344           "српски / srpski",
23345           "sr"
23346       ],
23347       [
23348           "Sranan Tongo",
23349           "Sranantongo",
23350           "srn"
23351       ],
23352       [
23353           "Swati",
23354           "SiSwati",
23355           "ss"
23356       ],
23357       [
23358           "Southern Sotho",
23359           "Sesotho",
23360           "st"
23361       ],
23362       [
23363           "Saterland Frisian",
23364           "Seeltersk",
23365           "stq"
23366       ],
23367       [
23368           "Sundanese",
23369           "Basa Sunda",
23370           "su"
23371       ],
23372       [
23373           "Swedish",
23374           "svenska",
23375           "sv"
23376       ],
23377       [
23378           "Swahili",
23379           "Kiswahili",
23380           "sw"
23381       ],
23382       [
23383           "Silesian",
23384           "ślůnski",
23385           "szl"
23386       ],
23387       [
23388           "Tamil",
23389           "தமிழ்",
23390           "ta"
23391       ],
23392       [
23393           "Tulu",
23394           "ತುಳು",
23395           "tcy"
23396       ],
23397       [
23398           "Telugu",
23399           "తెలుగు",
23400           "te"
23401       ],
23402       [
23403           "Tetum",
23404           "tetun",
23405           "tet"
23406       ],
23407       [
23408           "Tajik",
23409           "тоҷикӣ",
23410           "tg"
23411       ],
23412       [
23413           "Thai",
23414           "ไทย",
23415           "th"
23416       ],
23417       [
23418           "Tigrinya",
23419           "ትግርኛ",
23420           "ti"
23421       ],
23422       [
23423           "Turkmen",
23424           "Türkmençe",
23425           "tk"
23426       ],
23427       [
23428           "Tagalog",
23429           "Tagalog",
23430           "tl"
23431       ],
23432       [
23433           "Tswana",
23434           "Setswana",
23435           "tn"
23436       ],
23437       [
23438           "Tongan",
23439           "lea faka-Tonga",
23440           "to"
23441       ],
23442       [
23443           "Tok Pisin",
23444           "Tok Pisin",
23445           "tpi"
23446       ],
23447       [
23448           "Turkish",
23449           "Türkçe",
23450           "tr"
23451       ],
23452       [
23453           "Tsonga",
23454           "Xitsonga",
23455           "ts"
23456       ],
23457       [
23458           "Tatar",
23459           "татарча/tatarça",
23460           "tt"
23461       ],
23462       [
23463           "Tumbuka",
23464           "chiTumbuka",
23465           "tum"
23466       ],
23467       [
23468           "Twi",
23469           "Twi",
23470           "tw"
23471       ],
23472       [
23473           "Tahitian",
23474           "reo tahiti",
23475           "ty"
23476       ],
23477       [
23478           "Tuvinian",
23479           "тыва дыл",
23480           "tyv"
23481       ],
23482       [
23483           "Udmurt",
23484           "удмурт",
23485           "udm"
23486       ],
23487       [
23488           "Uyghur",
23489           "ئۇيغۇرچە / Uyghurche",
23490           "ug"
23491       ],
23492       [
23493           "Ukrainian",
23494           "українська",
23495           "uk"
23496       ],
23497       [
23498           "Urdu",
23499           "اردو",
23500           "ur"
23501       ],
23502       [
23503           "Uzbek",
23504           "oʻzbekcha/ўзбекча",
23505           "uz"
23506       ],
23507       [
23508           "Venda",
23509           "Tshivenda",
23510           "ve"
23511       ],
23512       [
23513           "Venetian",
23514           "vèneto",
23515           "vec"
23516       ],
23517       [
23518           "Veps",
23519           "vepsän kel’",
23520           "vep"
23521       ],
23522       [
23523           "Vietnamese",
23524           "Tiếng Việt",
23525           "vi"
23526       ],
23527       [
23528           "West Flemish",
23529           "West-Vlams",
23530           "vls"
23531       ],
23532       [
23533           "Volapük",
23534           "Volapük",
23535           "vo"
23536       ],
23537       [
23538           "Walloon",
23539           "walon",
23540           "wa"
23541       ],
23542       [
23543           "Waray",
23544           "Winaray",
23545           "war"
23546       ],
23547       [
23548           "Wolof",
23549           "Wolof",
23550           "wo"
23551       ],
23552       [
23553           "Wu Chinese",
23554           "吴语",
23555           "wuu"
23556       ],
23557       [
23558           "Kalmyk",
23559           "хальмг",
23560           "xal"
23561       ],
23562       [
23563           "Xhosa",
23564           "isiXhosa",
23565           "xh"
23566       ],
23567       [
23568           "Mingrelian",
23569           "მარგალური",
23570           "xmf"
23571       ],
23572       [
23573           "Yiddish",
23574           "ייִדיש",
23575           "yi"
23576       ],
23577       [
23578           "Yoruba",
23579           "Yorùbá",
23580           "yo"
23581       ],
23582       [
23583           "Zhuang",
23584           "Vahcuengh",
23585           "za"
23586       ],
23587       [
23588           "Zeelandic",
23589           "Zeêuws",
23590           "zea"
23591       ],
23592       [
23593           "Chinese",
23594           "中文",
23595           "zh"
23596       ],
23597       [
23598           "Classical Chinese",
23599           "文言",
23600           "zh-classical"
23601       ],
23602       [
23603           "Chinese (Min Nan)",
23604           "Bân-lâm-gú",
23605           "zh-min-nan"
23606       ],
23607       [
23608           "Cantonese",
23609           "粵語",
23610           "zh-yue"
23611       ],
23612       [
23613           "Zulu",
23614           "isiZulu",
23615           "zu"
23616       ]
23617   ];
23618
23619   var wikipedia$1 = /*#__PURE__*/Object.freeze({
23620     default: wikipedia
23621   });
23622
23623   var require$$6 = ( wikipedia$1 && wikipedia ) || wikipedia$1;
23624
23625   var wikipedia$2 = require$$6;
23626
23627   var dataAddressFormats = [{format:[["housenumber","street"],["city","postcode"]]},{countryCodes:["au"],format:[["unit","housenumber","street"],["suburb","state","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:["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"]]}];
23628
23629   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"}}];
23630
23631   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,"SK53_bulk:load":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};
23632
23633   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-AU":{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}};
23634
23635   var dataPhoneFormats = {ag:"+1-268-555-1234",ai:"+1-264-555-1234",as:"+1-684-555-1234",at:"+43 1 123 45 67",bb:"+1-246-555-1234",bj:"+229 20 12 34 56",bm:"+1-441-555-1234",br:"+55 11 0982 1098",bs:"+1-242-555-1234",ca:"+1-226-555-1234",ci:"+225 20 12 34 56",cn:"+86 10 12345678",de:"+49 89 1234567",dm:"+1-767-555-1234","do":"+1-809-555-1234",es:"+34 989 12 34 56",fi:"+358 40 123 4567",fr:"+33 1 23 45 67 89",gb:"+44 1632 961234",gd:"+1-473-555-1234",gg:"+44 1632 961234",gu:"+1-671-555-1234",hk:"+852 1234 5678",hr:"+385 01 123 4567",hu:"+36 1 123 45 67",ie:"+353 20 912 3456",im:"+44 1632 961234",it:"+39 01 123 456",je:"+44 1632 961234",jm:"+1-876-555-1234",kn:"+1-869-555-1234",ky:"+1-345-555-1234",kz:"+7 495 1234567",lc:"+1-758-555-1234",mp:"+1-670-555-1234",ms:"+1-664-555-1234",nl:"+31 42 123 4567",no:"+47 22 12 34 56",pl:"+48 42 123 4567",pr:"+1-787-555-1234",pt:"+351 211 123456",ru:"+7 495 1234567",se:"+46 31 123 4567",si:"+386 31 123 4567",sj:"+47 22 12 34 56",sx:"+1-721-555-1234",tc:"+1-649-555-1234",tr:"+90 312 123 4567",tt:"+1-868-555-1234",tw:"+886 1 2345 6789",ua:"+380 44 123 4567",us:"+1-202-555-1234",va:"+39 01 123 456",vc:"+1-784-555-1234",vg:"+1-284-555-1234",vi:"+1-340-555-1234",vn:"+84 1 234 5678",za:"+27 11 907 1111"};
23636
23637   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:["sidebar.key"],text:"shortcuts.browsing.display_options.sidebar"},{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:["4"],text:"shortcuts.editing.drawing.add_note"},{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.detach_node.key"],text:"shortcuts.editing.operations.detach_node"},{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"}]}]}];
23638
23639   var type$2 = "FeatureCollection";
23640   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]]]}}];
23641   var dataImperial = {
23642   type: type$2,
23643   features: features
23644   };
23645
23646   var type$3 = "FeatureCollection";
23647   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]]]}}];
23648   var dataDriveLeft = {
23649   type: type$3,
23650   features: features$1
23651   };
23652
23653   var en = {icons:{download:"download",information:"info",remove:"remove",undo:"undo",zoom_to:"zoom to",copy:"copy",open_wikidata:"open on wikidata.org"},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."},add_note:{title:"Note",description:"Spotted an issue? Let other mappers know.",tail:"Click on the map to add a note."},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.",note:"Added a note."}},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:{from_vertex:{to_point:"Connected a way to a point.",to_vertex:"Connected a way to another.",to_line:"Connected a way to a line.",to_area:"Connected a way to an area.",to_adjacent_vertex:"Merged adjacent points in a way.",to_sibling_vertex:"Connected a way to itself."},from_point:{to_point:"Merged a point with another.",to_vertex:"Merged a point with a point in a way.",to_line:"Moved a point to a line.",to_area:"Moved a point 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 it would damage a \"{relation}\" relation.",relation:"These features can't be merged because they have conflicting relation roles.",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"}},detach_node:{title:"Detach",key:"E",description:"Detach this node from these lines/areas.",annotation:"Detached a node from parent lines/areas.",restriction:"This node can't be detached because it would damage a \"{relation}\" relation.",connected_to_hidden:"This node can't be detached because it is connected to a hidden feature."}},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:"Log In",logout:"Log Out",loading_auth:"Connecting to OpenStreetMap...",report_a_bug:"Report a bug",help_translate:"Help translate",sidebar:{key:"`",tooltip:"Toggle the sidebar."},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",note_no_history:"No History (New Note)",note_comments:"Comments",note_created_date:"Created Date",note_created_user:"Created By",note_link_text:"Note 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",note:"note"},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:",lock:{suggestion:"The \"{label}\" field is locked because there is a Wikidata tag. You can delete it or edit the tags in the \"All tags\" section."}},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",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"},notes:{tooltip:"Note data from OpenStreetMap",title:"OpenStreetMap notes"},custom:{tooltip:"Drag and drop a data file onto the page, or click the button to setup",title:"Custom Map Data",zoom:"Zoom to 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."}},settings:{custom_background:{tooltip:"Edit custom background",header:"Custom Background Settings",instructions:"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}",template:{placeholder:"Enter a url template"}},custom_data:{tooltip:"Edit custom data layer",header:"Custom Map Data Settings",file:{instructions:"Choose a local data file. Supported types are:\n   .gpx, .kml, .geojson, .json",label:"Browse files"},or:"Or",url:{instructions:"Enter a data file URL or vector tile URL template. Valid tokens are:\n   {zoom} or {z}, {x}, {y} for Z/X/Y tile scheme",placeholder:"Enter a url"}}},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",streetside:{tooltip:"Streetside photos from Microsoft",title:"Photo Overlay (Bing Streetside)",report:"Report a privacy concern with this image",view_on_bing:"View on Bing Maps",hires:"High resolution"},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"},note:{note:"Note",title:"Edit note",anonymous:"anonymous",closed:"(Closed)",commentTitle:"Comments",status:{opened:"opened {when}",reopened:"reopened {when}",commented:"commented {when}",closed:"closed {when}"},newComment:"New Comment",inputPlaceholder:"Enter a comment to share with other users.",close:"Close Note",open:"Reopen Note",comment:"Comment",close_comment:"Close and Comment",open_comment:"Reopen and Comment",report:"Report","new":"New Note",newDescription:"Describe the issue.",save:"Save Note",login:"You must log in to change or comment on this note.",upload_explanation:"Your comments will be publicly visible to all OpenStreetMap users.",upload_explanation_with_user:"Your comments as {user} will be publicly visible to all OpenStreetMap users."},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."},notes:{title:"Notes",intro:"*Notes* are used to alert other users that a feature requires fixing or attention. Notes mark a specific location on the map. To view existing notes or add new ones, click the {data} **Map data** panel to enable the OpenStreetMap notes layer.",add_note_h:"Adding Notes",add_note:"To add a new note, click the {note} **Note** button on the toolbar above the map, or press the shortcut key `4`. This will change the mouse cursor to a cross symbol. To place the new note on the map, position the mouse cursor where the note should go, then {leftclick} left-click or press `Space`.",move_note:"Only new notes can be moved. To move a note, place the mouse cursor over the new note, then press and hold the {leftclick} left mouse button while dragging the note to its new location.",update_note_h:"Closing, Reopening, and Commenting",update_note:"An existing note can be updated by closing it, reopening it, or adding a comment to it. Closing a note indicates that the problem has been resolved. Reopening a note indicates that the original issue is not resolved.",save_note_h:"Saving Notes",save_note:"You must save any note edits individually by clicking the buttons below the note comments. Note edits are **not** included in changesets that you upload to OpenStreetMap."},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 [Bing Streetside](https://www.microsoft.com/en-us/maps/streetside), [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",sidebar:"Toggle sidebar",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",add_note:"'Add note' mode",place_point:"Place a point or note",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",detach_node:"Detach selected node from parent lines/areas",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}"},wikidata:{identifier:"Identifier",label:"Label",description:"Description"},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-utility":{name:"Utility 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 allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}},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"},booth:{label:"Booth"},boules:{label:"Type"},boundary:{label:"Type"},brand:{label:"Brand"},brewery:{label:"Draft Beers"},bridge:{label:"Type",placeholder:"Default"},"bridge/support":{label:"Type"},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..."},cash_in:{label:"Cash In"},castle_type:{label:"Type"},clothes:{label:"Clothes"},club:{label:"Type"},collection_times:{label:"Collection Times"},colour:{label:"Color"},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"},conveying:{label:"Movement Direction",options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}},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"},design:{label:"Design"},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:"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"}},fireplace:{label:"Fireplace"},fitness_station:{label:"Equipment Type"},fixme:{label:"Fix Me"},"flag/type":{label:"Flag Type"},ford:{label:"Type",placeholder:"Default"},frequency:{label:"Operating Frequency"},from:{label:"From"},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"},"historic/wreck/date_sunk":{label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{label:"Visible At Low Tide"},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..."},language_multi:{label:"Languages"},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_pool:{label:"Location",options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}},location:{label:"Location"},man_made:{label:"Type"},manhole:{label:"Type"},map_size:{label:"Coverage"},map_type:{label:"Type"},material:{label:"Material"},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"}},passenger_information_display:{label:"Passenger information display"},payment_multi:{label:"Payment Types"},phases:{label:"Phases",placeholder:"1, 2, 3..."},phone:{label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{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/difficulty_nordic":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}},"piste/difficulty_skitour":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}},"piste/difficulty":{label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}},"piste/grooming_downhill":{label:"Grooming",options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}},"piste/grooming_hike":{label:"Grooming",options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}},"piste/grooming_nordic":{label:"Grooming",options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}},"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",connection:"Connection"}},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"},recycling_type:{label:"Type",placeholder:"Container, Center",options:{container:"Container",centre:"Center"}},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"},scuba_diving:{label:"Services"},"seamark/beacon_isolated_danger/shape":{label:"Shape"},"seamark/beacon_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}},"seamark/beacon_lateral/colour":{label:"Color",options:{red:"Red",green:"Green",grey:"Grey"}},"seamark/beacon_lateral/shape":{label:"Shape"},"seamark/beacon_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/buoy_lateral/category":{label:"Category",options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}},"seamark/buoy_lateral/colour":{label:"Color",options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}},"seamark/buoy_lateral/shape":{label:"Shape"},"seamark/buoy_lateral/system":{label:"System",options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}},"seamark/mooring/category":{label:"Category"},"seamark/type":{label:"Seamark"},"seamark/wreck/category":{label:"Category"},seasonal:{label:"Seasonal"},seats:{label:"Seats",placeholder:"2, 4, 6..."},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"},"siren/purpose":{label:"Purpose"},"siren/type":{label:"Type",options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}},site_type:{label:"Site 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"},swimming_pool:{label:"Type"},"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"}},to:{label:"To"},"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_sign:{label:"Traffic Sign"},"traffic_sign/direction":{label:"Direction",options:{forward:"Forward",backward:"Backward",both:"Both / All"}},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)"},wikidata:{label:"Wikidata"},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:""},embankment:{name:"Embankment",terms:""},highway:{name:"Highway",terms:""},place:{name:"Place",terms:""},power:{name:"Power",terms:""},railway:{name:"Railway",terms:""},roundabout:{name:"Roundabout",terms:""},seamark:{name:"Seamark",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:"aerodrome,aeroway,airplane,airport,jet,plane"},"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/recycling":{name:"Recycling",terms:"bin,can,bottle,glass,garbage,rubbish,scrap,trash"},"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:"Biergarten",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/dive_centre":{name:"Dive Center",terms:"diving,scuba"},"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/fast_food/burger":{name:"Burger Fast Food",terms:"breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/chicken":{name:"Chicken Fast Food",terms:"breakfast,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/fish_and_chips":{name:"Fish & Chips Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,french fries"},"amenity/fast_food/kebab":{name:"Kebab Fast Food",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/fast_food/pizza":{name:"Pizza Fast Food",terms:"dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/fast_food/sandwich":{name:"Sandwich Fast Food",terms:"breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"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/language_school":{name:"Language School",terms:"esl"},"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/money_transfer":{name:"Money Transfer Station",terms:"money order,check,bill,currency,finance,wire transfer,cable,person to person,cash to cash,exchange"},"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:"Parking Lot",terms:"automobile parking,car lot,car parking,rv parking,truck parking,vehicle parking"},"amenity/parking/multi-storey":{name:"Multilevel Parking Garage",terms:"car,indoor parking,multistorey car park,parkade,parking building,parking deck,parking garage,parking ramp,parking structure"},"amenity/payment_centre":{name:"Payment Center",terms:"check,tax pay,bill pay,currency,finance,cash,money"},"amenity/payment_terminal":{name:"Payment Terminal",terms:"interactive kiosk,ekiosk,atm,bill pay,tax pay,phone pay,finance,cash,money transfer,card"},"amenity/pharmacy":{name:"Pharmacy",terms:"apothecary,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_container":{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/restaurant/american":{name:"American Restaurant",terms:"bar,breakfast,cafe,café,canteen,coffee,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/asian":{name:"Asian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/chinese":{name:"Chinese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/french":{name:"French Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/german":{name:"German Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/greek":{name:"Greek Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,gyros,pitas,olives"},"amenity/restaurant/indian":{name:"Indian Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,curry"},"amenity/restaurant/italian":{name:"Italian Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,pasta,pizza"},"amenity/restaurant/japanese":{name:"Japanese Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/mexican":{name:"Mexican Restaurant",terms:"bar,breakfast,dine,dining,dinner,drive-in,eat,grill,lunch,table,tacos,burritos,enchiladas,fajitas,nachos,tortillas,salsa,tamales,quesadillas"},"amenity/restaurant/noodle":{name:"Noodle Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,ramen noodles,soup,soba noodles,cellophane noodles,rice noodles"},"amenity/restaurant/pizza":{name:"Pizza Restaurant",terms:"bar,dine,dining,dinner,drive-in,eat,lunch,table,deep dish,thin crust,slice"},"amenity/restaurant/seafood":{name:"Seafood Restaurant",terms:"bar,breakfast,cafe,café,dine,dining,dinner,drive-in,eat,grill,lunch,table,fish,shellfish,molluscs,crustaceans,clams,oysters,lobsters,crab,shrimp,squid,octopus"},"amenity/restaurant/steakhouse":{name:"Steakhouse",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table,steak house,chop house,beef"},"amenity/restaurant/sushi":{name:"Sushi Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/thai":{name:"Thai Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/turkish":{name:"Turkish Restaurant",terms:"bar,breakfast,cafe,café,canteen,dine,dining,dinner,drive-in,eat,grill,lunch,table"},"amenity/restaurant/vietnamese":{name:"Vietnamese Restaurant",terms:"bar,breakfast,cafe,café,canteen,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/shelter/gazebo":{name:"Gazebo",terms:""},"amenity/shelter/lean_to":{name:"Lean-To",terms:""},"amenity/shelter/picnic_shelter":{name:"Picnic Shelter",terms:"pavilion"},"amenity/shelter/public_transport":{name:"Transit Shelter",terms:"bus stop,metro stop,waiting"},"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/theatre/type/amphi":{name:"Amphitheatre",terms:"open air,outdoor,greek,ampi"},"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/vehicle_inspection":{name:"Vehicle Inspection",terms:"car inspection"},"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 Locker",terms:"mail,parcel,pickup"},"amenity/vending_machine/parcel_pickup":{name:"Parcel Pickup Locker",terms:"amazon,locker,mail,parcel,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/summer_toboggan":{name:"Summer Toboggan",terms:"alpine slide,mountain coaster"},"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/fence/railing":{name:"Railing",terms:"railing,handrail,guard rail"},"barrier/gate":{name:"Gate",terms:""},"barrier/guard_rail":{name:"Guard Rail",terms:"guardrail,traffic barrier,crash barrier,median barrier,roadside barrier,Armco barrier"},"barrier/hedge":{name:"Hedge",terms:""},"barrier/kerb":{name:"Curb",terms:""},"barrier/kerb/flush":{name:"Flush Curb",terms:"even curb,level curb,tactile curb"},"barrier/kerb/lowered":{name:"Lowered Curb",terms:"curb cut,curb ramp,kerb ramp,dropped kerb,pram ramp"},"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:""},"bridge/support":{name:"Bridge Support",terms:""},"bridge/support/pier":{name:"Bridge Pier",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/carport":{name:"Carport",terms:"covered parking space,garage,car,porch"},"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/grandstand":{name:"Grandstand",terms:"tribune,stand,stands,bleachers"},"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/pavilion":{name:"Pavilion Building",terms:"sports"},"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:""},"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_alarm":{name:"Fire Alarm Call Box",terms:""},"emergency/fire_extinguisher":{name:"Fire Extinguisher",terms:""},"emergency/fire_hydrant":{name:"Fire Hydrant",terms:"fire plug"},"emergency/first_aid_kit":{name:"First Aid Kit",terms:"bandage,first aid,med,med kit,medic*,medkit"},"emergency/life_ring":{name:"Life Ring",terms:"life buoy,kisby ring,kisbie ring,perry buoy"},"emergency/lifeguard":{name:"Lifeguard",terms:"CPR,rescue"},"emergency/phone":{name:"Emergency Phone",terms:""},"emergency/siren":{name:"Siren",terms:"air raid,loud,noise,storm,tornado,warning"},"emergency/water_tank":{name:"Emergency Water Tank",terms:"water tank,cistern,reservoir"},entrance:{name:"Entrance/Exit",terms:"entrance,exit,door"},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,trail"},"highway/bus_guideway":{name:"Bus Guideway",terms:""},"highway/corridor":{name:"Indoor Corridor",terms:"gallery,hall,hallway,indoor,passage,passageway"},"highway/crossing/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/crossing/marked":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/crossing/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/crossing/unmarked":{name:"Unmarked Crossing",terms:""},"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/footway/zebra-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/zebra":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/footway/conveying":{name:"Moving Walkway",terms:"moving sidewalk,autwalk,skywalk,travolator,travelator,travellator,conveyor"},"highway/footway/marked-raised":{name:"Marked Crosswalk (Raised)",terms:"zebra crossing,marked crossing,crosswalk,flat top,hump,speed,slow"},"highway/footway/marked":{name:"Marked Crosswalk",terms:"zebra crossing,marked crossing,crosswalk"},"highway/footway/sidewalk":{name:"Sidewalk",terms:"pavement,sidepath"},"highway/footway/unmarked-raised":{name:"Unmarked Crossing (Raised)",terms:"flat top,hump,speed,slow"},"highway/footway/unmarked":{name:"Unmarked Crossing",terms:""},"highway/give_way":{name:"Yield Sign",terms:"give way,yield,sign"},"highway/living_street":{name:"Living Street",terms:""},"highway/milestone":{name:"Highway Milestone",terms:"milestone,marker"},"highway/mini_roundabout":{name:"Mini-Roundabout",terms:""},"highway/motorway_junction":{name:"Motorway Junction / Exit",terms:"exit"},"highway/motorway_link":{name:"Motorway Link",terms:"exit,ramp,road,street,on ramp,off ramp"},"highway/motorway":{name:"Motorway",terms:"autobahn,expressway,freeway,highway,interstate,parkway,road,street,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:"on ramp,off ramp,ramp,road,street"},"highway/primary":{name:"Primary Road",terms:"road,street"},"highway/raceway":{name:"Racetrack (Motorsport)",terms:"auto*,formula one,kart,motocross,nascar,race*,track"},"highway/residential":{name:"Residential Road",terms:"road,street"},"highway/rest_area":{name:"Rest Area",terms:"rest stop"},"highway/road":{name:"Unknown Road",terms:"road,street"},"highway/secondary_link":{name:"Secondary Link",terms:"on ramp,off ramp,ramp,road,street"},"highway/secondary":{name:"Secondary Road",terms:"road,street"},"highway/service":{name:"Service Road",terms:"road,street"},"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/steps/conveying":{name:"Escalator",terms:"moving staircase,moving stairway,people mover"},"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:"on ramp,off ramp,ramp,road,street"},"highway/tertiary":{name:"Tertiary Road",terms:"road,street"},"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:"on ramp,off ramp,ramp,road,street"},"highway/trunk":{name:"Trunk Road",terms:"road,street"},"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:"road,street"},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:""},"historic/wreck":{name:"Shipwreck",terms:"hull,mast,maritime,remains,ship,boat"},"internet_access/wlan":{name:"Wi-Fi Hotspot",terms:"wi-fi,wifi,hotspot"},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:"cut,forest,lumber,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:"aerodrome,aeroway,air force,airplane,airport,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/bandstand":{name:"Bandstand",terms:""},"leisure/beach_resort":{name:"Beach Resort",terms:""},"leisure/bird_hide":{name:"Bird Hide",terms:"machan,ornithology"},"leisure/bleachers":{name:"Bleachers",terms:"crowd,bench,sports,stand,stands,seat,seating"},"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/fishing":{name:"Fishing Spot",terms:"angler"},"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/badminton":{name:"Badminton Court",terms:""},"leisure/pitch/baseball":{name:"Baseball Field",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/softball":{name:"Softball Field",terms:"softball,diamond"},"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,boat landing"},"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,aquatics"},"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/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/bunker_silo":{name:"Bunker Silo",terms:"Silage,Storage"},"man_made/chimney":{name:"Chimney",terms:""},"man_made/clearcut":{name:"Clearcut Forest",terms:"cut,forest,lumber,tree,wood"},"man_made/crane":{name:"Crane",terms:""},"man_made/cutline":{name:"Cut line",terms:""},"man_made/embankment":{name:"Embankment",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/mast/communication":{name:"Communication 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/mast/communication/mobile_phone":{name:"Mobile Phone Mast",terms:"antenna,cell mast,cell phone mast,cell phone tower,cell tower,communication mast,communication tower,guyed tower,mobile phone tower,transmission mast,transmission tower"},"man_made/mast/communication/radio":{name:"Radio Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,radio mast,radio tower,transmission mast,transmission tower"},"man_made/mast/communication/television":{name:"Television Broadcast Mast",terms:"antenna,broadcast tower,communication mast,communication tower,guyed tower,television mast,television tower,transmission mast,transmission tower,tv mast,tv tower"},"man_made/monitoring_station":{name:"Monitoring Station",terms:"weather,earthquake,seismology,air,gps"},"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:"oil,natural gas,water,sewer,sewage"},"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":{name:"Surveillance",terms:"anpr,alpr,camera,car plate recognition,cctv,guard,license plate recognition,monitoring,number plate recognition,security,video,webcam"},"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/survey_point":{name:"Survey Point",terms:"trig point,triangulation pillar,trigonometrical station"},"man_made/tower":{name:"Tower",terms:""},"man_made/tower/communication":{name:"Communication Tower",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/tower/observation":{name:"Observation Tower",terms:"lookout tower,fire tower"},"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:"crag,escarpment,rock face,scarp"},"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/reef":{name:"Reef",terms:"barrier,coral,ocean,sand,shoal"},"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/religion":{name:"Religious Office",terms:""},"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/downhill":{name:"Downhill Piste/Ski Run",terms:"ski,alpine,snowboard,downhill,piste"},"piste/hike":{name:"Snowshoeing or Winter Hiking Trail",terms:"hike,winter hiking,snowshoe,snowshoeing,piste,ski"},"piste/ice_skate":{name:"Ice Skating Piste",terms:"ice,skating,ski,piste"},"piste/nordic":{name:"Nordic or Crosscountry Piste/Ski Trail",terms:"ski,nordic,crosscountry,skating,piste"},"piste/piste":{name:"Winter Sport Trails",terms:"ski,nordic,crosscountry,downhill,alpine,snowboard,skitour,ski touring,sled,luge,sleigh,sledge,ski-joring,husky,horse,winter hiking,snowshoe,snowshoeing,ice,skating"},"piste/skitour":{name:"Ski Touring Trail",terms:"ski,skitour,crosscountry,ski touring,piste"},"piste/sled":{name:"Sled Piste",terms:"ski,sled,luge,sleigh,sledge,piste"},"piste/sleigh":{name:"Sleigh Piste",terms:"ski,piste,sled,luge,sleigh,sledge,ski-joring,husky,horse"},"place/farm":{name:"Farm",terms:""},"place/city_block":{name:"City Block",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/cable/underground":{name:"Underground Power Cable",terms:""},"power/generator":{name:"Power Generator",terms:"hydro,solar,turbine,wind"},"power/generator/method/photovoltaic":{name:"Solar Panel",terms:"photovoltaic module,PV module,sunlight"},"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"},"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:""},"seamark/beacon_isolated_danger":{name:"Danger Beacon",terms:"beacon isolated danger,isolated danger beacon,iala"},"seamark/beacon_lateral":{name:"Channel Beacon",terms:"lateral beacon,beacon lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral":{name:"Channel Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/green":{name:"Green Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/buoy_lateral/red":{name:"Red Buoy",terms:"lateral buoy,buoy lateral,cevni,channel marker,iala,lateral mark"},"seamark/mooring":{name:"Mooring",terms:"dolphin,pile,bollard,buoy,post"},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/catalogue":{name:"Catalog Shop",terms:""},"shop/charity":{name:"Charity Store",terms:"thrift,op shop,nonprofit"},"shop/cheese":{name:"Cheese Store",terms:""},"shop/chemist":{name:"Drugstore",terms:"apothecary,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/country_store":{name:"Country 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_supply":{name:"Hairdresser Supply Store",terms:"barber,shampoo,conditioner"},"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_repair":{name:"Motorcycle Repair Shop",terms:"auto,bike,garage,motorcycle,repair,service"},"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/party":{name:"Party Supply Store",terms:"balloons,costumes,decorations,invitations"},"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:"diving,scuba"},"shop/seafood":{name:"Seafood Shop",terms:"fishmonger"},"shop/second_hand":{name:"Consignment/Thrift Store",terms:"secondhand,second hand,resale,thrift,used"},"shop/sewing":{name:"Sewing Supply Shop",terms:"haberdashery"},"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/artwork/mural":{name:"Mural",terms:"fresco,wall painting"},"tourism/artwork/sculpture":{name:"Sculpture",terms:"statue,figure,carving"},"tourism/artwork/statue":{name:"Statue",terms:"sculpture,figure,carving"},"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"},traffic_sign_vertex:{name:"Traffic Sign",terms:"road,highway"},traffic_sign:{name:"Traffic Sign",terms:"road,highway"},"traffic_sign/city_limit_vertex":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/city_limit":{name:"City Limit Sign",terms:"town,village,hamlet,boundary,edge,border,road,highway"},"traffic_sign/maxspeed_vertex":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"traffic_sign/maxspeed":{name:"Speed Limit Sign",terms:"max speed,maximum speed,road,highway"},"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/milestone":{name:"Waterway Milestone",terms:"milestone,marker"},"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:{AGIV:{attribution:{text:"Orthophoto Flanders most recent © AGIV"},name:"AGIV Flanders most recent aerial imagery"},AGIV10cm:{attribution:{text:"Orthophoto Flanders © AGIV"},name:"AGIV Flanders 2013-2015 aerial imagery 10cm"},AGIVFlandersGRB:{attribution:{text:"GRB Flanders © AGIV"},name:"AGIV Flanders GRB"},Bing:{description:"Satellite and aerial imagery.",name:"Bing aerial imagery"},"DigitalGlobe-Premium":{attribution:{text:"Terms & Feedback"},description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",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:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",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"},SPW_ORTHO_LAST:{name:"SPW(allonie) most recent aerial imagery"},SPW_PICC:{name:"SPW(allonie) PICC numerical imagery"},"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-TIGER-Roads-2018":{description:"Yellow = Public domain map data from the US Census. Red = Data not found in OpenStreetMap",name:"TIGER Roads 2018"},US_Forest_Service_roads_overlay:{description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",name:"U.S. Forest Roads Overlay"},UrbISOrtho2016:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2016"},UrbISOrtho2017:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2017"},UrbISOrtho2018:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbIS-Ortho 2018"},UrbisAdmFR:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm FR"},UrbisAdmNL:{attribution:{text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB"},name:"UrbisAdm NL"},"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"},"eufar-balaton":{attribution:{text:"EUFAR Balaton ortofotó 2010"},description:"1940 geo-tagged photography from Balaton Limnological Institute.",name:"EUFAR Balaton orthophotos"},"finds.jp_KBN_2500":{attribution:{text:"GSI KIBAN 2500"},description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older.",name:"Japan GSI KIBAN 2500"},"gsi.go.jp":{attribution:{text:"GSI Japan"},description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older.",name:"Japan GSI ortho Imagery"},"gsi.go.jp_std_map":{attribution:{text:"GSI Japan"},description:"Japan GSI Standard Map. Widely covered.",name:"Japan GSI Standard Map"},"helsingborg-orto":{attribution:{text:"© Helsingborg municipality"},description:"Orthophotos from the municipality of Helsingborg 2016, public domain",name:"Helsingborg Orthophoto"},"kalmar-orto-2014":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the north coast of the municipality of Kalmar 2014",name:"Kalmar North Orthophoto 2014"},"kalmar-orto-2016":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for the south coast of the municipality of Kalmar 2016",name:"Kalmar South Orthophoto 2016"},"kalmar-orto-2018":{attribution:{text:"© Kalmar municipality"},description:"Orthophotos for urban areas of the municipality of Kalmar 2018",name:"Kalmar Urban Orthophoto 2018"},kelkkareitit:{attribution:{text:"© Kelkkareitit.fi"},description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",name:"Nordic snowmobile overlay"},"lantmateriet-orto1960":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",name:"Lantmäteriet Historic Orthophoto 1960"},"lantmateriet-orto1975":{attribution:{text:"© Lantmäteriet, CC0"},description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",name:"Lantmäteriet Historic Orthophoto 1975"},"lantmateriet-topowebb":{attribution:{text:"© Lantmäteriet, CC0"},description:"Topographic map of Sweden 1:50 000",name:"Lantmäteriet Topographic Map"},"linkoping-orto":{attribution:{text:"© Linköping municipality"},description:"Orthophotos from the municipality of Linköping 2010, open data",name:"Linköping Orthophoto"},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)"},"osmse-ekonomiska":{attribution:{text:"© Lantmäteriet"},description:"Scan of \"Economic maps\" ca. 1950–1980",name:"Lantmäteriet Economic Map 1950–1980"},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"},skoterleder:{attribution:{text:"© Skoterleder.org"},description:"Snowmobile trails",name:"Snowmobile map Sweden"},"stamen-terrain-background":{attribution:{text:"Map tiles by Stamen Design, under CC BY 3.0. Data by OpenStreetMap, under ODbL"},name:"Stamen Terrain"},"stockholm-orto":{attribution:{text:"© Stockholm municipality, CC0"},description:"Orthophotos from the municipality of Stockholm 2015, CC0 license",name:"Stockholm Orthophoto"},"tf-cycle":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest OpenCycleMap"},"tf-landscape":{attribution:{text:"Maps © Thunderforest, Data © OpenStreetMap contributors"},name:"Thunderforest Landscape"},"trafikverket-baninfo":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network, including sidings",name:"Trafikverket Railway Network"},"trafikverket-baninfo-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish railway network with several options for map layers",name:"Trafikverket Railway Network options"},"trafikverket-vagnat":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network",name:"Trafikverket Road Network"},"trafikverket-vagnat-extra":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB extra details: Highway reference, traffic calming, rest area, bus stop, bridge, tunnel, speed camera",name:"Trafikverket Road Network extra"},"trafikverket-vagnat-navn":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB street names",name:"Trafikverket Street Names"},"trafikverket-vagnat-option":{attribution:{text:"© Trafikverket, CC0"},description:"Swedish NVDB road network with several options for map layers",name:"Trafikverket Road Network options"}},community:{"bw-facebook":{name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana"},"bw-twitter":{name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana"},"cape-coast-youthmappers":{name:"University of Cape Coast YouthMappers",description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable."},"osm-gh-facebook":{name:"OpenStreetMap Ghana on Facebook",description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us."},"osm-gh-twitter":{name:"OpenStreetMap Ghana on Twitter",description:"Follow us on Twitter: {url}"},"talk-gh":{name:"Talk-gh Mailing List",description:"Talk-gh is the official mailing list for Ghana OSM 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!",events:{sotmasia2018:{name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India"}}},"osm-india-forum":{name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum"},"osm-india-github":{name:"OpenStreetMap India GitHub",description:"Code with us: {url}"},"OSM-india-mailinglist":{name:"OpenStreetMap India Mailinglist",description:"Talk-in is the official Mailinglist for Indian Community"},"osm-india-telegram":{name:"OpenStreetMap India Telegram",description:"Join our family: {url}"},"OSM-india-twitter":{name:"OpenStreetMap India Twitter",description:"We are just a tweet away: {url}"},"osm-india-website":{name:"OpenStreetMap India",description:"Mappers and OpenStreetMap users in India"},"osm-india-wiki":{name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}"},"osm-india-youtube":{name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {url}"},"OSM-India-Puducherry-Facebook":{name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events."},"OSM-Puducherry-Mailing-List":{name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap."},"OSM-India-Puducherry-Matrix":{name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism."},"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-japan-website":{name:"OpenStreetMap Japan",description:"Mappers and OpenStreetMap users in Japan"},"OSM-korea-telegram":{name:"OSM Korea Telegram Channel",description:"Unofficial Channnel for OpenStreetMap contributors, communities and users in Korea to share and discuss."},"OSM-MY-facebook":{name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!"},"OSM-MY-forum":{name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum"},"OSM-MY-matrix":{name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}"},"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-MMR-facebook":{name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? 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"},"OSM-TH-CNX-meetup":{name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled"},"OSM-TH-facebook":{name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand"},"OSM-TH-forum":{name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum"},"al-forum":{name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum"},"al-maptime-tirana":{name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time."},"al-telegram":{name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel"},"at-forum":{name:"OpenStreetMap Austria Forum",description:"The official forum for OpenStreetMap questions in and around Austria"},"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}"},"osmgraz-meetup":{name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz"},"osmgraz-twitter":{name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter"},"osm-at":{name:"OpenStreetMap Austria",description:"The platform for information on OpenStreetMap in Austria"},byosm:{name:"OpenStreetMap Belarus",description:"OpenStreetMap Belarus telegram chat"},"be-facebook":{name:"OpenStreetMap BE Community",description:"Mappers and OpenStreetMap on 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 the Belgian OSM community"},"be-matrix":{name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects."},"be-meetup":{name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!"},"be-twitter":{name:"OpenStreetMap Belgium Twitter",description:"OSM Belgium on Twitter: @osm_be"},"hr-facebook":{name:"OpenStreetMap Croatia Facebook group",description:"OpenStreetMap Croatia Facebook group"},"hr-irc":{name:"OpenStreetMap Croatia on IRC",description:"Join #osm-hr on irc.freenode.org (port 6667)"},"hr-mailinglist":{name:"Talk-hr Mailing List",description:"Talk-hr mailing list"},"czech-community":{name:"Czech OSM community",description:"Map portal, website and contacts on OSM members in Czechia"},"osmcz-facebook":{name:"OpenStreetMap CZ on Facebook",description:"Follow czech community on Facebook - including translated WeeklyOSM!"},"osmcz-twitter":{name:"Czech twitter @osmcz",description:"Follow czech community on Twitter - including translated WeeklyOSM!"},"talk-cz-mailinglist":{name:"Czech mailing list (talk-cz)",description:"Talk-cz is the official mailing list for Czech community"},"dk-forum":{name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum"},"dk-irc":{name:"OpenStreetMap Denmark IRC",description:"Join #osm-dk on irc.oftc.net (port 6667)"},"dk-mailinglist":{name:"Talk-dk Mailing List",description:"A mailing list to discuss OpenStreetMap in Denmark"},"fi-forum":{name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum"},"fi-irc":{name:"OpenStreetMap Finland IRC",description:"Join #osm-fi on irc.oftc.net (port 6667)"},"fi-mailinglist":{name:"Talk-fi Mailing List",description:"Talk-fi is the official mailing list for the Finnish OSM community"},"fr-facebook":{name:"OpenStreetMap France Facebook page",description:"OpenStreetMap France Facebook page"},"fr-forum":{name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum"},"fr-irc":{name:"OpenStreetMap France on IRC",description:"Join #osm-fr on irc.oftc.net (port 6667)"},"fr-mailinglist":{name:"Talk-fr Mailing List",description:"Talk-fr mailing list"},"fr-twitter":{name:"OpenStreetMap France on Twitter",description:"OpenStreetMap France on Twitter: {url}"},"de-berlin-mailinglist":{name:"Berlin Mailing List",description:"This is the mailing list for the Berlin OSM community"},"de-berlin-meetup":{name:"OpenStreetMap Berlin-Brandenburg Meetup",description:"Mappers and OpenStreetMap users in the Berlin area"},"de-berlin-telegram":{name:"@osmberlin on Telegram",description:"OpenStreetMap Berlin Telegram chat"},"de-berlin-twitter":{name:"OpenStreetMap Berlin Twitter",description:"Follow us on Twitter: {url}"},"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"},"de-ostwestfalen-lippe-mailinglist":{name:"OWL Mailing List",description:"This is the mailing list for the Ostwestfalen-Lippe OSM community"},"de-telegram":{name:"OpenStreetMap Germany Telegram",description:"Join the OpenStreetMap Germany Telegram supergroup at {url}"},"osm-de":{name:"OpenStreetMap Germany",description:"The platform for information on OpenStreetMap in Germany"},"hu-facebook":{name:"OpenStreetMap HU on Facebook",description:"Mappers and OpenStreetMap Facebook in Hungary"},"hu-forum":{name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum"},"hu-meetup":{name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary"},"is-facebook":{name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland"},"is-mailinglist":{name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community"},"is-twitter":{name:"OSM Iceland on Twittter",description:"Twitter of OpenStreetMap in Iceland"},"it-facebook":{name:"OpenStreetMap Italy Facebook",description:"Join the OpenStreetMap Italy community on Facebook"},"it-irc":{name:"OpenStreetMap Italy IRC",description:"Join #osm-it on irc.oftc.net (port 6667)"},"it-mailinglist":{name:"Talk-it Mailing List",description:"Talk-it is the official mailing list for the Italian OSM community"},"it-telegram":{name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat"},"it-twitter":{name:"OpenStreetMap Italy Twitter",description:"Follow us on Twitter at {url}"},"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."},"South-Tyrol-Mailing-List":{name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol"},"talk-it-lazio":{name:"OpenStreetMap IT Lazio",description:"All are welcome! Sign up at {signupUrl}",extendedDescription:"Mailinglist for Rome and Lazio area."},"Trentino-Mailing-List":{name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino"},"kosovo-telegram":{name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language."},"no-forum":{name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum"},"no-irc":{name:"OpenStreetMap Norway on IRC",description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"no-mailinglist":{name:"OpenStreetMap Norway mailing list",description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway"},"OSM-PL-facebook-group":{name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland"},"OSM-PL-forum":{name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community"},"si-forum":{name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia"},"si-mailinglist":{name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia"},"OSM-ES-mailinglist":{name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain"},"OSM-ES-telegram":{name:"@OSMes on Telegram",description:"OpenStreetMap Spain Telegram chat"},"osm-se":{name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden"},"se-facebook":{name:"OpenStreetMap Sweden Facebook",description:"OpenStreetMap Sweden on Facebook"},"se-forum":{name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum"},"se-irc":{name:"OpenStreetMap Sweden IRC",description:"Join #osm.se on irc.oftc.net (port 6667)"},"se-mailinglist":{name:"Talk-se Mailing List",description:"A mailing list to discuss OpenStreetMap in Sweden"},"se-twitter":{name:"OpenStreetMap Sweden on Twitter",description:"Follow us on Twitter: {url}"},"Nottingham-OSM-pub-meetup":{name:"East Midlands (Nottingham) Monthly pub meet-up",description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose."},"gb-mailinglist":{name:"Talk-gb Mailing List",description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community"},"mappa-mercia-group":{name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data."},"gb-irc":{name:"OpenStreetMap United Kingdom IRC",description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question"},"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"},"OSM-CU-telegram":{name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat"},"OSM-NI-telegram":{name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat"},"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."},"MaptimeHRVA-twitter":{name:"MaptimeHRVA Twitter",description:"Follow us on Twitter at {url}"},"us-ma-mailinglist":{name:"Talk-us-massachusetts Mailing List",description:"Email mailing list for the Massachusetts OSM community"},"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-forum":{name:"OpenStreetMap PDX Google Group",description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner."},"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}",events:{sotmus2018:{name:"State of the Map US 2018",description:"Join the OpenStreetMap community at State of the Map US in Detroit, Michigan. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Detroit, Michigan"}}},"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:"News from the local community"},"OSM-AR-forum":{name:"OpenStreetMap Argentina web forum",description:"Join the OpenStreetMap Argentina web forum",extendedDescription:"Ideal for long or important discussions. Slow response time."},"OSM-AR-irc":{name:"OpenStreetMap Argentina IRC",description:"Join #osm-ar on irc.oftc.net (port 6667)",extendedDescription:"You may find the most geeky user in the community."},"OSM-AR-mailinglist":{name:"Talk-ar Mailing List",description:"Historic mailing list. Almost unused today."},"OSM-AR-telegram":{name:"OpenStreetMap Argentina Telegram",description:"Join the OpenStreetMap Argentina community on Telegram",extendedDescription:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. Everyone is welcome!"},"OSM-AR-twitter":{name:"OpenStreetMap Argentina Twitter",description:"Follow us on Twitter at {url}",extendedDescription:"News from the local community and OpenStreetMap in general."},"OSM-BO-mailinglist":{name:"Talk-bo Mailing List",description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!"},"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!"},"DF-telegram":{name:"OpenStreetMap Brasília Telegram Group",description:"Join the OpenStreetMap Brasília 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}"},"RS-telegram":{name:"OpenStreetMap Rio Grande do Sul Telegram Group",description:"Join the OpenStreetMap Rio Grande do Sul community on Telegram",extendedDescription:"Join the community to learn more about OpenStreetMap, ask questions or participate in our meetings. Everyone is welcome!"},"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}"},"Maptime-Bogota":{name:"Maptime Bogotá",description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap.  It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun."},"OSM-CO-facebook":{name:"OpenStreetMap Colombia Facebook",description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!"},"OSM-CO-mailinglist":{name:"Talk-co Mailing List",description:"A mailing list to discuss OpenStreetMap in Colombia"},"OSM-CO-telegram":{name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat"},"OSM-CO-twitter":{name:"OpenStreetMap Colombia Twitter",description:"Follow us on Twitter at {url}"},"OSM-CO":{name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation"},"OSM-EC-telegram":{name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat"},"OSM-PY-telegram":{name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat"},"OSM-PE-facebook":{name:"OpenStreetMap Peru Facebook",description:"Join the OpenStreetMap Peru community on Facebook"},"OSM-PE-mailinglist":{name:"Talk-pe Mailing List",description:"The official mailing list for the OpenStreetMap Peru community"},"OSM-PE-matrix":{name:"OpenStreetMap Peru Matrix Chat",description:"Chat with other members of the OpenStreetMap Peru community in Matrix."},"OSM-PE-telegram":{name:"OpenStreetMap Peru Telegram",description:"Join the OpenStreetMap Peru community on Telegram"},"OSM-PE-twitter":{name:"OpenStreetMap Peru Twitter",description:"Follow us on Twitter at {url}"},"OSM-PE":{name:"OpenStreetMap Peru",description:"News and resources for the OpenStreetMap Peru community"},"LATAM-Facebook":{name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook"},"LATAM-Telegram":{name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America"},"LATAM-Twitter":{name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}"},"osm-latam":{name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",events:{"sotm-latam-2018":{name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina"}}},"OSM-Discord":{name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord"},"OSM-Facebook":{name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap."},"OSM-help":{name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap.  Whether you are a beginner mapper or have a technical question, we're here to help!"},"OSM-IRC":{name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)"},"OSM-Reddit":{name:"OpenStreetMap on Reddit",description:"/r/openstreetmap/ is a great place to learn more about OpenStreetMap.  Ask us anything!"},"OSM-Telegram":{name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}"},"OSM-Twitter":{name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}"},OSMF:{name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",events:{sotm2018:{name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy"}}}}};
23654
23655   var features$2 = {botswana:{type:"Feature",id:"botswana",properties:{},geometry:{type:"Polygon",coordinates:[[[25.65423,-18.48085],[25.70131,-18.56629],[25.79198,-18.60814],[25.83557,-18.82958],[25.95414,-18.89236],[26.00296,-19.02313],[25.9925,-19.058],[26.17908,-19.52356],[26.25057,-19.57064],[26.32554,-19.57064],[26.37611,-19.62121],[26.35344,-19.64562],[26.70741,-19.87404],[26.73356,-19.91763],[26.97419,-20.00133],[27.04394,-19.99784],[27.13984,-20.06585],[27.22005,-20.07456],[27.30723,-20.22626],[27.31769,-20.45643],[27.73269,-20.4913],[27.74664,-20.70926],[27.71525,-21.07718],[27.9088,-21.2777],[28.02562,-21.55668],[28.19825,-21.5933],[28.37261,-21.59679],[28.50339,-21.65433],[28.58011,-21.62643],[28.8033,-21.71362],[29.08577,-21.80603],[29.03346,-21.90193],[29.06659,-22.02399],[29.17645,-22.07107],[29.25665,-22.05189],[29.38569,-22.19312],[29.32117,-22.21231],[29.0387,-22.23323],[29.01428,-22.27159],[28.97941,-22.31344],[28.98115,-22.34482],[28.94105,-22.45991],[28.52257,-22.59766],[28.36041,-22.58371],[28.18255,-22.70053],[28.18255,-22.74761],[28.06747,-22.89931],[27.95239,-22.9708],[27.96285,-23.03532],[27.74838,-23.24107],[27.68561,-23.21666],[27.62109,-23.23758],[27.56006,-23.36836],[27.2741,-23.49565],[27.08578,-23.66304],[27.00034,-23.70489],[26.88875,-24.10593],[26.87654,-24.26635],[26.74228,-24.31343],[26.57663,-24.45292],[26.42842,-24.64821],[25.8844,-24.77724],[25.89486,-24.88012],[25.76585,-25.17485],[25.66467,-25.48682],[25.58448,-25.64908],[25.3456,-25.78509],[25.11021,-25.76939],[25.02517,-25.71967],[24.92538,-25.81822],[24.69696,-25.83042],[24.46156,-25.74324],[24.37786,-25.76765],[24.21127,-25.67022],[23.92974,-25.64036],[23.66819,-25.44158],[23.3121,-25.26869],[22.88179,-25.50087],[22.72835,-26.01351],[22.63768,-26.10767],[22.56793,-26.2367],[22.48424,-26.21054],[22.35521,-26.33609],[22.24971,-26.35352],[22.07317,-26.63251],[21.9668,-26.67131],[21.79767,-26.66956],[21.77761,-26.69223],[21.80377,-26.78465],[21.6913,-26.87096],[21.59889,-26.8605],[21.5274,-26.86224],[21.32339,-26.84349],[21.14248,-26.87375],[21.00386,-26.84873],[20.98729,-26.81621],[20.85826,-26.80575],[20.68477,-26.92022],[20.61677,-26.79293],[20.61589,-26.68718],[20.622,-26.60461],[20.5941,-26.47558],[20.82252,-26.153],[20.78939,-25.92458],[20.63769,-25.63862],[20.63595,-25.55143],[20.36045,-25.06321],[20.25583,-24.93766],[20.11982,-24.89756],[19.98556,-24.76853],[19.99602,-21.99435],[20.9934,-22.00132],[20.99514,-18.30648],[21.45547,-18.31171],[23.10324,-17.98913],[23.31422,-17.98913],[23.43105,-18.18268],[23.54439,-18.26289],[23.60542,-18.48085],[23.77455,-18.36577],[23.91928,-18.20884],[24.18606,-18.01355],[24.36915,-17.94031],[24.47377,-17.956],[24.51038,-18.03621],[24.57839,-18.05714],[24.615,-17.98565],[24.71439,-17.89498],[24.97594,-17.77466],[25.09102,-17.82174],[25.15903,-17.76246],[25.27411,-17.79559],[25.25493,-17.91241],[25.31596,-18.06062],[25.40489,-18.1077],[25.5374,-18.37972],[25.65423,-18.48085]]]}},cape_coast_gh:{type:"Feature",id:"cape_coast_gh",properties:{},geometry:{type:"Polygon",coordinates:[[[-1.6,5],[-1.6,5.4],[-1,5.4],[-1,5],[-1.6,5]]]}},ghana:{type:"Feature",properties:{},id:"ghana",geometry:{type:"Polygon",coordinates:[[[-3.11256,5.13335],[-2.97215,5.11112],[-2.94811,5.12753],[-2.75757,5.10599],[-2.7253,5.14087],[-2.78641,5.28242],[-2.78297,5.29541],[-2.76993,5.2937],[-2.76546,5.31797],[-2.77748,5.33079],[-2.77319,5.35557],[-2.72495,5.34224],[-2.78023,5.60642],[-2.86022,5.65049],[-2.92889,5.61838],[-2.96631,5.64127],[-2.95292,5.71643],[-3.02639,5.7096],[-3.01987,5.8575],[-3.07411,5.98624],[-3.10226,6.15284],[-3.15514,6.25114],[-3.17574,6.25182],[-3.17162,6.29755],[-3.23753,6.54183],[-3.23341,6.60049],[-3.26157,6.61959],[-3.21007,6.73417],[-3.24028,6.83031],[-2.95326,7.23817],[-2.97558,7.27018],[-2.92236,7.61436],[-2.77611,7.94432],[-2.60513,8.03747],[-2.62985,8.11769],[-2.48978,8.20877],[-2.64221,9.00988],[-2.77679,9.03972],[-2.76581,9.15633],[-2.66968,9.26478],[-2.93884,10.66601],[-2.82898,11.0113],[-0.68939,11.00051],[-0.60974,10.91962],[-0.43121,11.04095],[-0.43396,11.10295],[-0.27843,11.17672],[-0.13424,11.13967],[-0.14214,11.10632],[-0.05905,11.08341],[-0.0388,11.10733],[-0.01339,11.11204],[0.02369,11.05308],[0.03296,10.97793],[-0.00549,10.96411],[-0.02266,10.81914],[-0.07141,10.76856],[-0.07999,10.69806],[-0.05905,10.63294],[0.04257,10.60257],[0.0618,10.56207],[0.14351,10.52629],[0.17097,10.42265],[0.26711,10.41151],[0.28633,10.42096],[0.34264,10.31357],[0.39757,10.31492],[0.39722,10.30546],[0.37148,10.28283],[0.35225,10.10746],[0.41817,10.06487],[0.40924,10.01822],[0.36461,10.03174],[0.34676,9.66506],[0.26779,9.64678],[0.24994,9.44771],[0.42847,9.48564],[0.56168,9.40977],[0.48203,8.80501],[0.3804,8.74122],[0.47653,8.59324],[0.65369,8.49546],[0.65781,8.42347],[0.70862,8.38339],[0.72784,8.28964],[0.60425,8.21693],[0.62004,7.70623],[0.59464,7.70283],[0.5809,7.62253],[0.52322,7.5953],[0.52734,7.45099],[0.56168,7.39243],[0.62759,7.40741],[0.66055,7.30935],[0.59395,7.11248],[0.61317,7.09306],[0.59601,7.00549],[0.52322,6.97823],[0.52322,6.94006],[0.56442,6.92234],[0.53284,6.82962],[0.65094,6.73962],[0.63446,6.63733],[0.74707,6.57048],[0.71411,6.51864],[0.90242,6.33355],[1.00405,6.33543],[1.02516,6.25319],[1.05537,6.22964],[1.1,6.17],[1.2,6.17],[1.2,4],[-3,4.5],[-3.11256,5.13335]]]}},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_andhrapradesh:{type:"Feature",id:"india_andhrapradesh",properties:{},geometry:{type:"Polygon",coordinates:[[[76.76365,14.98503],[76.78952,15.01589],[76.77614,15.05336],[76.80034,15.09466],[76.86072,15.05669],[76.87678,15.02859],[76.94279,15.02725],[76.98159,15.0103],[77.00077,15.02948],[77.04671,15.02904],[77.07882,15.00004],[77.1096,15.02859],[77.12744,15.09371],[77.14751,15.10753],[77.16873,15.17462],[77.14554,15.22413],[77.15223,15.29148],[77.12118,15.29418],[77.11387,15.3334],[77.07705,15.32577],[77.0421,15.36103],[77.027,15.44075],[76.97414,15.50807],[77.02697,15.5037],[77.03509,15.63815],[77.08728,15.65733],[77.08192,15.69524],[77.05293,15.72914],[77.05561,15.82458],[77.03333,15.85326],[77.07659,15.90991],[77.14448,15.94265],[77.2479,15.96378],[77.3564,15.95008],[77.42745,15.94836],[77.46652,15.93453],[77.61152,15.91691],[77.6536,15.88393],[77.72205,15.89199],[77.80554,15.87083],[77.8616,15.88138],[77.89376,15.90154],[78.00803,15.86506],[78.03641,15.90188],[78.06997,15.85048],[78.10755,15.83401],[78.17153,15.85511],[78.17371,15.89569],[78.20995,15.9197],[78.2507,15.96993],[78.2682,16.02857],[78.29785,16.01169],[78.40727,16.0756],[78.45394,16.07503],[78.55814,16.04517],[78.59917,16.08361],[78.64311,16.08312],[78.68277,16.03346],[78.73718,16.0097],[78.78267,16.02125],[78.8419,16.08707],[78.83228,16.13919],[78.87606,16.13902],[78.88876,16.0879],[78.92138,16.10307],[78.9049,16.17711],[78.92807,16.19871],[78.98352,16.21074],[79.01236,16.24173],[79.09802,16.2236],[79.12305,16.23187],[79.1593,16.20893],[79.22111,16.23251],[79.23438,16.32518],[79.21143,16.35493],[79.21112,16.44396],[79.22091,16.51631],[79.25265,16.57381],[79.37802,16.58412],[79.41773,16.57986],[79.44409,16.61796],[79.49421,16.63408],[79.53884,16.63046],[79.60613,16.67239],[79.63566,16.6594],[79.68544,16.69755],[79.72286,16.68966],[79.74673,16.72106],[79.79256,16.72485],[79.81796,16.69098],[79.84286,16.70561],[79.88555,16.68642],[79.90723,16.63408],[79.95306,16.63621],[80.00576,16.70857],[80.05536,16.74833],[80.07093,16.81323],[80.0332,16.85233],[79.99173,16.86303],[80.04569,16.96517],[80.08405,16.96339],[80.134,16.98524],[80.18217,17.04501],[80.19555,17.01825],[80.26201,17.01066],[80.28877,16.97677],[80.31553,16.91254],[80.3191,16.87106],[80.35879,16.85501],[80.37306,16.8113],[80.41856,16.84252],[80.45647,16.78989],[80.56262,16.76268],[80.6041,16.78766],[80.55593,16.81843],[80.56485,16.86883],[80.59027,16.91165],[80.53184,16.95001],[80.44264,16.9451],[80.35835,16.97052],[80.38778,17.0071],[80.36682,17.0566],[80.39001,17.07623],[80.42034,17.02494],[80.48234,17.05036],[80.49616,17.10789],[80.56039,17.13822],[80.68393,17.06865],[80.82309,17.03787],[80.85877,17.05081],[80.87714,17.10478],[80.88011,17.1644],[80.91689,17.15439],[80.91892,17.22003],[80.99838,17.19012],[81.03576,17.19196],[81.05653,17.22041],[81.16295,17.23278],[81.18035,17.25463],[81.17053,17.29656],[81.19016,17.32733],[81.26732,17.3202],[81.31385,17.37576],[81.24132,17.40667],[81.22725,17.43762],[81.17746,17.45203],[81.15755,17.47938],[81.11343,17.49477],[81.08374,17.45957],[81.01198,17.49248],[80.99962,17.53013],[80.95671,17.58749],[80.85431,17.59347],[80.86444,17.62914],[80.90266,17.63912],[80.90684,17.67993],[80.89153,17.74125],[80.94636,17.76025],[81.03556,17.74495],[81.07481,17.76038],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.61119,17.81527],[81.66293,17.87682],[81.70307,17.86121],[81.78246,17.90982],[81.80119,17.93614],[81.89932,17.9687],[82.0019,18.02356],[82.03316,18.06597],[82.08072,18.07378],[82.14091,18.0439],[82.17228,18.04993],[82.25028,17.9883],[82.27583,17.995],[82.2667,18.04332],[82.29628,18.06899],[82.34354,18.07485],[82.33329,18.1422],[82.30608,18.19572],[82.33284,18.21579],[82.33685,18.26619],[82.37209,18.27421],[82.39305,18.30633],[82.33462,18.31703],[82.38458,18.36922],[82.36138,18.4098],[82.43513,18.48477],[82.48969,18.52285],[82.53139,18.51177],[82.54422,18.41638],[82.60918,18.37427],[82.59758,18.26516],[82.64005,18.23708],[82.67329,18.29908],[82.70644,18.30476],[82.77538,18.33958],[82.79251,18.36262],[82.78448,18.42803],[82.80742,18.44772],[82.89919,18.40074],[82.91103,18.36453],[82.98471,18.36362],[83.0002,18.38368],[83.04775,18.37883],[83.07472,18.401],[83.04552,18.44345],[83.05997,18.48603],[83.09665,18.54123],[83.05931,18.54334],[83.0336,18.57266],[83.05776,18.62215],[83.09414,18.63021],[83.15495,18.70089],[83.23099,18.75616],[83.27407,18.76523],[83.28745,18.79777],[83.36791,18.81557],[83.40661,18.84174],[83.39569,18.87914],[83.35554,18.92896],[83.36892,18.96132],[83.32119,18.97447],[83.3428,19.01449],[83.41665,19.00408],[83.45049,18.95576],[83.48237,19.00825],[83.46716,19.07746],[83.51314,19.07262],[83.52143,19.03271],[83.61209,19.10076],[83.62679,19.14969],[83.69206,19.05202],[83.71342,18.99346],[83.73398,18.98382],[83.79596,19.01607],[83.84255,18.9178],[83.85136,18.86003],[83.87788,18.82716],[84.05557,18.79246],[84.0894,18.75373],[84.16689,18.78415],[84.22422,18.79642],[84.2535,18.78262],[84.2914,18.8],[84.33966,18.80123],[84.39349,18.89211],[84.43671,18.92277],[84.42292,18.94711],[84.47894,18.99017],[84.51711,19.04634],[84.62687,19.08543],[84.61653,19.12624],[84.66828,19.13065],[84.6721,19.16552],[84.71352,19.1524],[84.70468,19.11772],[84.76857,19.08003],[85.15481,18.87834],[85.14492,18.85295],[85.05442,18.77126],[85.01176,18.69225],[84.94947,18.67649],[84.44354,18.21885],[83.98107,17.79763],[83.77893,17.63361],[83.20925,17.15734],[82.8246,16.92714],[82.20846,16.16914],[81.78413,16.05362],[81.60171,16.04774],[80.84225,15.52037],[80.65306,15.4875],[80.54735,15.42991],[80.4922,15.34128],[80.47381,15.25261],[80.48624,15.06582],[80.49835,15.0251],[80.66968,13.56514],[80.26863,13.56255],[80.24181,13.46797],[80.22545,13.48346],[80.14774,13.49443],[80.08045,13.49111],[80.08,13.52565],[80.00213,13.53964],[80.01841,13.50074],[79.97441,13.46419],[79.96622,13.38714],[79.93821,13.34898],[79.86379,13.31632],[79.8129,13.31712],[79.79245,13.29487],[79.73437,13.27843],[79.79598,13.24103],[79.75102,13.21106],[79.68369,13.24845],[79.68102,13.29448],[79.57781,13.26176],[79.54809,13.32329],[79.42941,13.33391],[79.41957,13.24971],[79.43293,13.1966],[79.39666,13.19679],[79.36005,13.17504],[79.36244,13.13752],[79.31106,13.1268],[79.28351,13.14994],[79.23853,13.1464],[79.20549,13.10147],[79.16498,13.01908],[79.06532,13.04951],[78.99361,13.08754],[78.95768,13.07478],[78.81243,13.08649],[78.75104,13.05634],[78.71387,13.06691],[78.70525,13.01518],[78.6625,13.02861],[78.63167,12.98455],[78.63629,12.92494],[78.60313,12.84933],[78.59178,12.77804],[78.55737,12.73938],[78.55312,12.69582],[78.50595,12.74103],[78.50517,12.68031],[78.46933,12.67292],[78.47136,12.62811],[78.3799,12.62235],[78.30177,12.66322],[78.27563,12.70205],[78.23857,12.6994],[78.23025,12.75702],[78.2528,12.82236],[78.25198,12.85741],[78.31411,12.85733],[78.32741,12.90272],[78.35638,12.93819],[78.38944,12.90542],[78.41213,12.94302],[78.46924,12.97546],[78.46092,13.03126],[78.5219,13.06638],[78.54509,13.11098],[78.57956,13.21461],[78.57797,13.28201],[78.51185,13.28722],[78.44649,13.30825],[78.43949,13.327],[78.36546,13.36503],[78.38151,13.40071],[78.37259,13.46181],[78.38241,13.52477],[78.40574,13.57659],[78.39268,13.5915],[78.32632,13.59445],[78.25894,13.58461],[78.20436,13.60369],[78.16645,13.65721],[78.11784,13.65587],[78.12295,13.71405],[78.09423,13.74251],[78.12795,13.78565],[78.11441,13.8625],[78.04999,13.89494],[78.04642,13.86104],[78.00476,13.87355],[77.95566,13.82664],[77.95098,13.88825],[77.98752,13.89784],[77.97015,13.95827],[77.92868,13.90698],[77.89567,13.93954],[77.83858,13.93508],[77.81494,13.91679],[77.83635,13.86863],[77.79261,13.8211],[77.6267,13.76984],[77.53033,13.69514],[77.45805,13.68671],[77.47014,13.7502],[77.45855,13.79212],[77.41662,13.80595],[77.43223,13.84163],[77.32787,13.83226],[77.31449,13.86393],[77.25829,13.84609],[77.21904,13.86794],[77.18236,13.8682],[77.15308,13.84278],[77.18088,13.78098],[77.17444,13.76135],[77.10308,13.76759],[77.06516,13.74405],[77.0277,13.77651],[77.00003,13.74482],[76.97723,13.81547],[77.01323,13.85558],[77.04239,13.9332],[76.99574,13.96114],[77.00108,13.98729],[76.93324,14.03009],[76.97878,14.07002],[76.89779,14.16518],[76.96469,14.18169],[77.02696,14.17477],[77.02154,14.13052],[77.03389,14.05587],[77.13014,14.04533],[77.1441,14.00245],[77.28518,14.01342],[77.31997,14.03126],[77.3503,13.95767],[77.35476,13.90325],[77.39713,13.90415],[77.42702,13.98353],[77.39,14.01386],[77.33291,14.02947],[77.40204,14.1102],[77.38331,14.13607],[77.39624,14.17175],[77.51711,14.17844],[77.49659,14.23419],[77.50284,14.27834],[77.45021,14.28414],[77.44887,14.31625],[77.37617,14.33081],[77.38984,14.26937],[77.28608,14.2828],[77.28786,14.33766],[77.23835,14.31759],[77.1661,14.34301],[77.13845,14.33721],[77.11838,14.29395],[77.11539,14.22104],[77.0818,14.2159],[77.05638,14.24623],[76.9426,14.2444],[76.92967,14.27651],[76.94748,14.31179],[76.9038,14.32379],[76.88373,14.35055],[76.88774,14.3947],[76.97828,14.48256],[76.91138,14.48836],[76.87481,14.47275],[76.83244,14.52761],[76.80434,14.53207],[76.76554,14.60075],[76.77639,14.68002],[76.80359,14.7398],[76.78371,14.78455],[76.83756,14.78968],[76.86771,14.96792],[76.76736,14.97267],[76.76365,14.98503]]]}},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]]]]}},india_karnataka:{type:"Feature",id:"india_karnataka",properties:{},geometry:{type:"Polygon",coordinates:[[[73.87267,14.75312],[74.17989,14.95708],[74.2532,14.95804],[74.29821,15.04123],[74.31574,15.18805],[74.27607,15.27727],[74.32187,15.34414],[74.28027,15.38891],[74.27464,15.54999],[74.24074,15.66684],[74.11652,15.65308],[74.16212,15.75075],[74.28923,15.73953],[74.36893,15.78648],[74.34579,15.84959],[74.43203,15.95338],[74.46484,16.0421],[74.37226,16.07692],[74.48045,16.14527],[74.50509,16.22265],[74.31843,16.32588],[74.33806,16.40125],[74.26427,16.53936],[74.33986,16.54825],[74.54427,16.63407],[74.6313,16.57831],[74.68877,16.71489],[74.91203,16.7883],[74.99259,16.95146],[75.09075,16.95064],[75.18186,16.84374],[75.26705,16.86247],[75.28311,16.95524],[75.46783,16.98524],[75.51065,16.94733],[75.66898,16.97766],[75.67389,17.11369],[75.62834,17.18928],[75.65739,17.27069],[75.58469,17.34963],[75.63468,17.47651],[75.77995,17.37683],[75.89432,17.40292],[75.93159,17.32197],[76.11996,17.37007],[76.22917,17.36301],[76.38171,17.31172],[76.37153,17.4341],[76.33086,17.46872],[76.41561,17.60431],[76.48659,17.66155],[76.48652,17.71358],[76.56488,17.76523],[76.66314,17.68771],[76.8094,17.8693],[76.92164,17.94103],[76.9513,18.05843],[76.92422,18.14531],[77.14325,18.20848],[77.20119,18.27828],[77.24726,18.41311],[77.31257,18.43674],[77.41407,18.39352],[77.3672,18.30846],[77.46332,18.26219],[77.57345,18.24294],[77.59821,18.0861],[77.64737,17.99934],[77.6208,17.9031],[77.5709,17.86625],[77.53999,17.72825],[77.45138,17.69052],[77.44541,17.58272],[77.6912,17.50865],[77.53911,17.44295],[77.52471,17.36431],[77.45747,17.34038],[77.3772,17.14285],[77.46328,17.11129],[77.50069,17.01255],[77.45223,16.91995],[77.47617,16.7804],[77.46008,16.61106],[77.37653,16.48644],[77.25617,16.47308],[77.28927,16.408],[77.41673,16.36775],[77.52418,16.3753],[77.59655,16.31743],[77.49303,16.25534],[77.51178,15.92828],[77.2479,15.96378],[77.07659,15.90991],[77.03509,15.63815],[77.027,15.44075],[77.0421,15.36103],[77.15223,15.29148],[77.16873,15.17462],[77.1096,15.02859],[76.98159,15.0103],[76.87678,15.02859],[76.80034,15.09466],[76.76736,14.97267],[76.86771,14.96792],[76.83756,14.78968],[76.77639,14.68002],[76.76554,14.60075],[76.87481,14.47275],[76.88373,14.35055],[76.94748,14.31179],[76.9426,14.2444],[77.05638,14.24623],[77.1661,14.34301],[77.28608,14.2828],[77.38984,14.26937],[77.44887,14.31625],[77.50284,14.27834],[77.51711,14.17844],[77.39624,14.17175],[77.40204,14.1102],[77.33291,14.02947],[77.42702,13.98353],[77.35476,13.90325],[77.31997,14.03126],[77.1441,14.00245],[77.03389,14.05587],[77.02696,14.17477],[76.89779,14.16518],[76.97878,14.07002],[76.93324,14.03009],[77.04239,13.9332],[76.97723,13.81547],[77.06516,13.74405],[77.17444,13.76135],[77.18236,13.8682],[77.32787,13.83226],[77.43223,13.84163],[77.47014,13.7502],[77.53033,13.69514],[77.6267,13.76984],[77.79261,13.8211],[77.89567,13.93954],[77.95098,13.88825],[78.04999,13.89494],[78.11441,13.8625],[78.11784,13.65587],[78.20436,13.60369],[78.40574,13.57659],[78.37068,13.46984],[78.40217,13.31113],[78.58854,13.26912],[78.5219,13.06638],[78.46924,12.97546],[78.35684,12.94022],[78.31447,12.8595],[78.25248,12.85994],[78.23196,12.76495],[78.08636,12.80344],[77.99036,12.80553],[77.93327,12.8876],[77.81099,12.8303],[77.74108,12.67162],[77.60006,12.6661],[77.58743,12.51473],[77.63575,12.48605],[77.61553,12.36799],[77.52722,12.27746],[77.51993,12.19264],[77.60853,12.20409],[77.73432,12.17555],[77.77447,12.12033],[77.67932,11.97287],[77.60217,11.93627],[77.49513,11.94251],[77.42332,11.77259],[77.29576,11.80871],[77.11315,11.77337],[77.01458,11.81306],[76.90977,11.79343],[76.8262,11.60485],[76.56305,11.62046],[76.51399,11.70565],[76.41621,11.67255],[76.20482,11.86247],[76.1155,11.8579],[76.11204,11.97862],[76.00455,11.93123],[75.86924,11.95161],[75.79654,12.0533],[75.63883,12.14712],[75.5804,12.1556],[75.4863,12.29074],[75.43456,12.29653],[75.37427,12.46113],[75.22345,12.56714],[75.1619,12.66883],[75.06067,12.66842],[75.00958,12.79255],[74.8591,12.76032],[74.64061,12.65899],[74.51827,12.99543],[74.32397,13.82179],[73.87267,14.75312]]]}},india_kerala:{type:"Feature",id:"india_kerala",properties:{},geometry:{type:"Polygon",coordinates:[[[74.64061,12.65899],[74.8591,12.76032],[74.88399,12.75347],[74.95843,12.78474],[75.00958,12.79255],[74.99766,12.73819],[75.05297,12.71899],[75.06067,12.66842],[75.11342,12.67842],[75.1619,12.66883],[75.14362,12.63805],[75.18287,12.63181],[75.22345,12.56714],[75.23683,12.56625],[75.28071,12.61847],[75.29121,12.59649],[75.27114,12.55367],[75.28095,12.51799],[75.33492,12.49034],[75.3573,12.46234],[75.39003,12.49736],[75.41661,12.49293],[75.4241,12.46603],[75.39599,12.45143],[75.37427,12.46113],[75.36747,12.41202],[75.38331,12.39011],[75.42333,12.37233],[75.41374,12.34763],[75.43456,12.29653],[75.4863,12.29074],[75.51484,12.25818],[75.53759,12.20064],[75.5804,12.1556],[75.63883,12.14712],[75.66604,12.09583],[75.68727,12.10816],[75.73047,12.07283],[75.75506,12.08318],[75.79833,12.08006],[75.79654,12.0533],[75.82391,12.01308],[75.82999,11.98372],[75.86924,11.95161],[76.00455,11.93123],[76.03621,11.9406],[76.07903,11.96914],[76.11204,11.97862],[76.1155,11.8579],[76.15528,11.87128],[76.20482,11.86247],[76.22662,11.80542],[76.27964,11.81018],[76.30774,11.78297],[76.31799,11.75041],[76.34252,11.73748],[76.41129,11.75913],[76.42399,11.72006],[76.40338,11.70748],[76.41621,11.67255],[76.44345,11.63744],[76.42497,11.62329],[76.37992,11.6224],[76.37056,11.59341],[76.29786,11.56442],[76.2711,11.59296],[76.2256,11.56442],[76.24255,11.52874],[76.24478,11.49439],[76.32105,11.44489],[76.33354,11.45871],[76.39063,11.42794],[76.44861,11.38155],[76.53826,11.35167],[76.54532,11.30094],[76.52349,11.27236],[76.45271,11.23905],[76.44934,11.20462],[76.51048,11.21163],[76.53385,11.19671],[76.60091,11.20654],[76.62971,11.19413],[76.69784,11.23906],[76.72537,11.22534],[76.72765,11.19388],[76.69301,11.17193],[76.69124,11.14472],[76.73852,11.12108],[76.74788,11.07514],[76.73718,11.04749],[76.69507,11.02252],[76.68644,10.98934],[76.66047,10.96052],[76.64932,10.92395],[76.73272,10.88113],[76.77286,10.88158],[76.81746,10.86195],[76.85983,10.79996],[76.88838,10.79996],[76.8973,10.77096],[76.875,10.70674],[76.85537,10.67507],[76.87277,10.62958],[76.80497,10.62646],[76.80854,10.59434],[76.82995,10.58498],[76.81746,10.43869],[76.8072,10.41505],[76.83932,10.35974],[76.82944,10.30749],[76.9018,10.26001],[76.90974,10.23668],[76.93976,10.23927],[76.98194,10.22077],[77.04075,10.25298],[77.06496,10.29751],[77.11964,10.31782],[77.17683,10.35777],[77.23655,10.35242],[77.21441,10.30577],[77.25054,10.25359],[77.25544,10.22549],[77.28042,10.20721],[77.26769,10.12222],[77.23784,10.12768],[77.20426,10.11207],[77.21976,10.07801],[77.26184,10.03015],[77.25908,9.9945],[77.27231,9.96404],[77.24834,9.95177],[77.21305,9.87549],[77.23646,9.85946],[77.22277,9.82317],[77.24656,9.80841],[77.20553,9.69439],[77.17963,9.65641],[77.16816,9.61495],[77.21264,9.60207],[77.23711,9.58089],[77.27684,9.57498],[77.3042,9.59951],[77.36511,9.54996],[77.3997,9.49683],[77.39331,9.45986],[77.36661,9.46037],[77.33693,9.40901],[77.33713,9.36507],[77.32506,9.33664],[77.28329,9.30039],[77.28844,9.27469],[77.26509,9.18184],[77.26714,9.15394],[77.24693,9.12483],[77.21199,9.101],[77.18667,9.04329],[77.16025,9.03584],[77.14986,9.01008],[77.17354,8.99121],[77.19759,8.95104],[77.19567,8.9236],[77.2559,8.8781],[77.25798,8.83758],[77.2292,8.78679],[77.19607,8.74588],[77.17517,8.73703],[77.20586,8.68645],[77.21552,8.64836],[77.27872,8.56521],[77.26344,8.50713],[77.20618,8.47859],[77.22506,8.44602],[77.18854,8.43476],[77.15375,8.37722],[77.14974,8.32192],[77.12209,8.32281],[77.09077,8.2973],[76.92132,8.09605],[76.6728,8.34299],[76.46487,8.59279],[76.22556,8.95652],[75.91159,10.04616],[75.68288,10.55908],[75.58764,10.89204],[75.55244,11.04304],[75.25797,11.51227],[75.53645,11.69255],[75.53089,11.70357],[75.25113,11.52458],[74.97117,11.94518],[74.71236,12.49398],[74.64061,12.65899]]]}},india_maharashtra:{type:"Feature",id:"india_maharashtra",properties:{name:"Maharashtra"},geometry:{type:"Polygon",coordinates:[[[72.53789,20.1498],[72.80202,20.12516],[72.87472,20.22596],[72.97061,20.21213],[72.97329,20.13096],[73.18604,20.05291],[73.29353,20.15371],[73.31137,20.20723],[73.43,20.20634],[73.41484,20.38162],[73.47594,20.49491],[73.51787,20.67019],[73.62224,20.62514],[73.63428,20.58232],[73.74801,20.56716],[73.84658,20.62336],[73.88538,20.72951],[73.93846,20.76073],[73.94515,20.84012],[73.79279,21.06787],[73.68111,21.15233],[73.82249,21.17195],[73.83231,21.2674],[73.94827,21.29773],[73.96879,21.39228],[74.10883,21.44803],[74.30776,21.48014],[74.2917,21.55864],[73.97926,21.54124],[73.86085,21.49576],[73.82294,21.60057],[73.88583,21.64517],[73.89029,21.71073],[73.83231,21.81064],[74.04684,21.92259],[74.14585,21.95425],[74.28991,21.93597],[74.38848,22.02026],[74.52764,21.90876],[74.50578,21.78254],[74.59053,21.66435],[74.83048,21.61038],[74.86438,21.63402],[75.05795,21.56489],[75.11504,21.45963],[75.21985,21.41101],[75.38443,21.38559],[75.46828,21.39406],[75.83267,21.38336],[75.95934,21.39629],[76.05255,21.35259],[76.09849,21.37399],[76.15915,21.25892],[76.16851,21.08587],[76.3826,21.07963],[76.45262,21.11486],[76.48741,21.19604],[76.61676,21.19871],[76.66091,21.28256],[76.62434,21.33519],[76.73227,21.40878],[76.79159,21.48996],[76.79516,21.59745],[76.90131,21.60101],[76.9972,21.68174],[77.1212,21.72545],[77.20728,21.69423],[77.27998,21.76113],[77.47756,21.77005],[77.57122,21.62688],[77.56721,21.52965],[77.45749,21.55641],[77.41869,21.52073],[77.48692,21.37756],[77.93873,21.38693],[78.16932,21.49843],[78.21526,21.55374],[78.3,21.58496],[78.41329,21.57782],[78.43024,21.50155],[78.50874,21.52831],[78.58501,21.48683],[78.932,21.48728],[78.91327,21.59254],[79.1278,21.62822],[79.22102,21.69646],[79.48862,21.67416],[79.50602,21.59031],[79.57604,21.54348],[79.73259,21.60235],[79.85703,21.53099],[80.06665,21.55686],[80.18842,21.63402],[80.26022,21.62019],[80.36905,21.52296],[80.41142,21.43822],[80.51936,21.3896],[80.63532,21.25],[80.45736,21.17284],[80.42391,21.0096],[80.46539,20.92709],[80.54166,20.93378],[80.54344,20.79195],[80.57823,20.67866],[80.50776,20.65458],[80.51177,20.585],[80.62239,20.60373],[80.58581,20.39544],[80.61659,20.32587],[80.38288,20.24157],[80.4141,20.19028],[80.54032,20.11],[80.54567,19.98734],[80.46048,19.82812],[80.66476,19.69075],[80.65673,19.61225],[80.82755,19.56274],[80.88553,19.50922],[80.84271,19.36605],[80.74905,19.28666],[80.67864,19.33089],[80.60751,19.31353],[80.58732,19.39674],[80.48071,19.3355],[80.39329,19.24591],[80.39154,19.1836],[80.3302,19.13746],[80.26929,18.94468],[80.35176,18.84592],[80.24684,18.70149],[80.10826,18.68928],[79.94712,18.78372],[79.95979,18.85795],[79.93945,19.0406],[79.85699,19.09508],[79.94349,19.16387],[79.92836,19.24777],[79.97469,19.38922],[79.92536,19.49855],[79.87599,19.5041],[79.75713,19.60733],[79.63608,19.57639],[79.60249,19.51309],[79.5317,19.55241],[79.42494,19.53529],[79.22736,19.61468],[79.22023,19.5286],[79.1725,19.46081],[79.08018,19.53261],[79.00213,19.54198],[78.89954,19.66954],[78.84245,19.65839],[78.82963,19.75513],[78.60098,19.81809],[78.48728,19.79375],[78.28109,19.90236],[78.3514,19.78327],[78.32909,19.71548],[78.26933,19.69184],[78.29475,19.60621],[78.29564,19.46794],[78.20778,19.43583],[78.16318,19.3551],[78.16675,19.2436],[78.03473,19.2436],[77.92412,19.3444],[77.84428,19.30426],[77.81484,19.13745],[77.74304,19.06118],[77.75106,18.98357],[77.83714,18.95414],[77.90751,18.8295],[77.83749,18.80764],[77.74829,18.60515],[77.65541,18.5316],[77.59709,18.54762],[77.54937,18.3875],[77.55171,18.29114],[77.46332,18.26219],[77.3672,18.30846],[77.41407,18.39352],[77.31257,18.43674],[77.2452,18.41278],[77.19913,18.27795],[77.14119,18.20815],[77.03495,18.18076],[76.95329,18.18881],[76.92422,18.14531],[76.9513,18.05843],[76.9075,18.00923],[76.92164,17.94103],[76.8094,17.8693],[76.66314,17.68771],[76.56488,17.76523],[76.48652,17.71358],[76.48659,17.66155],[76.41561,17.60431],[76.33086,17.46872],[76.37153,17.4341],[76.38171,17.31172],[76.22917,17.36301],[76.11996,17.37007],[75.93159,17.32197],[75.89432,17.40292],[75.77995,17.37683],[75.63468,17.47651],[75.58469,17.34963],[75.65739,17.27069],[75.62834,17.18928],[75.67389,17.11369],[75.66898,16.97766],[75.51065,16.94733],[75.46783,16.98524],[75.28311,16.95524],[75.26705,16.86247],[75.18186,16.84374],[75.09075,16.95064],[74.99259,16.95146],[74.96287,16.87942],[74.90306,16.86241],[74.91203,16.7883],[74.68877,16.71489],[74.6313,16.57831],[74.56843,16.55445],[74.54427,16.63407],[74.33986,16.54825],[74.26427,16.53936],[74.33806,16.40125],[74.31843,16.32588],[74.50509,16.22265],[74.48045,16.14527],[74.37226,16.07692],[74.46484,16.0421],[74.43203,15.95338],[74.34579,15.84959],[74.36893,15.78648],[74.28923,15.73953],[74.16212,15.75075],[74.11652,15.65308],[74.02811,15.60433],[73.97592,15.62887],[73.94515,15.74126],[73.88226,15.74929],[73.68072,15.72057],[73.32871,15.60794],[72.98859,16.57559],[72.71294,17.97077],[72.60935,19.26366],[72.53789,20.1498]]]}},india_puducherry:{type:"Feature",id:"india_puducherry",properties:{name:"Puducherry"},geometry:{type:"Polygon",coordinates:[[[79.87782,12.04973],[79.84726,11.95536],[79.83593,11.90229],[79.81979,11.85761],[79.81464,11.79006],[79.79645,11.7736],[79.77036,11.77191],[79.74564,11.78065],[79.6804,11.7988],[79.61655,11.82434],[79.58702,11.88549],[79.65672,11.93152],[79.64745,11.9594],[79.6423,12.0138],[79.66599,12.03865],[79.72813,12.04201],[79.79885,12.0457],[79.8452,12.05644],[79.87782,12.04973]]]}},india_tamilnadu:{type:"Feature",id:"india_tamilnadu",properties:{},geometry:{type:"Polygon",coordinates:[[[76.23882,11.52666],[76.42497,11.62329],[76.48321,11.69182],[76.56305,11.62046],[76.8262,11.60485],[76.90977,11.79343],[77.01458,11.81306],[77.11315,11.77337],[77.29576,11.80871],[77.33679,11.76902],[77.42332,11.77259],[77.49513,11.94251],[77.60217,11.93627],[77.67932,11.97287],[77.77447,12.12033],[77.73432,12.17555],[77.60853,12.20409],[77.51993,12.19264],[77.52722,12.27746],[77.61553,12.36799],[77.63575,12.48605],[77.58743,12.51473],[77.60006,12.6661],[77.74108,12.67162],[77.79267,12.74643],[77.81099,12.8303],[77.93327,12.8876],[77.99036,12.80553],[78.08636,12.80344],[78.23196,12.76495],[78.2273,12.71513],[78.36824,12.61165],[78.54754,12.68569],[78.62559,12.9194],[78.61355,12.97872],[78.70231,13.05633],[78.80801,13.07774],[78.97973,13.0764],[79.15278,13.00727],[79.1889,13.08443],[79.25625,13.13661],[79.34679,13.13482],[79.45292,13.33852],[79.53513,13.33423],[79.58006,13.24544],[79.68442,13.25659],[79.92572,13.33598],[79.96184,13.45149],[80.06933,13.53757],[80.15229,13.4787],[80.25978,13.44748],[80.68273,13.45353],[80.58546,12.88895],[80.57389,12.78634],[80.43092,12.33305],[80.32877,12.14],[80.20563,11.84284],[79.85031,11.95606],[79.74742,12.0054],[79.69629,11.95142],[79.76493,11.85315],[80.17499,11.74816],[80.13891,11.5158],[80.22104,11.03359],[80.22222,10.98402],[79.85413,10.97539],[79.73705,10.98906],[79.70405,10.91904],[79.85166,10.82788],[80.22599,10.82479],[80.03964,10.09642],[79.66744,9.97318],[79.55982,9.92323],[79.37812,9.6665],[79.42037,9.35343],[79.56652,9.25796],[79.57134,9.08722],[79.49634,8.89762],[79.37403,8.97879],[79.06914,9.02225],[78.73928,8.93257],[78.54484,8.84743],[78.46298,8.3509],[78.36123,8.16045],[78.10363,8.04096],[77.66766,7.85864],[76.92132,8.09605],[77.09077,8.2973],[77.14974,8.32192],[77.20618,8.47859],[77.27872,8.56521],[77.21552,8.64836],[77.19607,8.74588],[77.25798,8.83758],[77.14986,9.01008],[77.26714,9.15394],[77.28844,9.27469],[77.33693,9.40901],[77.3997,9.49683],[77.3042,9.59951],[77.27684,9.57498],[77.16816,9.61495],[77.24656,9.80841],[77.21305,9.87549],[77.26184,10.03015],[77.28042,10.20721],[77.17683,10.35777],[77.06496,10.29751],[76.98194,10.22077],[76.82944,10.30749],[76.81746,10.43869],[76.82995,10.58498],[76.8973,10.77096],[76.81746,10.86195],[76.64932,10.92395],[76.73718,11.04749],[76.72765,11.19388],[76.44934,11.20462],[76.52349,11.27236],[76.53826,11.35167],[76.39063,11.42794],[76.25772,11.47343],[76.23882,11.52666]]]}},india_telengana:{type:"Feature",id:"india_telengana",properties:{},geometry:{type:"Polygon",coordinates:[[[77.23521,16.47123],[77.29413,16.47453],[77.37516,16.48768],[77.37501,16.50885],[77.41861,16.51735],[77.42586,16.57007],[77.46147,16.58589],[77.45871,16.61229],[77.47627,16.64839],[77.43775,16.64241],[77.42132,16.66752],[77.46657,16.6772],[77.47337,16.71709],[77.42692,16.72829],[77.44309,16.76259],[77.4748,16.78164],[77.45754,16.82843],[77.46322,16.84476],[77.45223,16.91995],[77.48061,16.97751],[77.478,17.00152],[77.50069,17.01255],[77.49527,17.04601],[77.46328,17.11129],[77.40575,17.12751],[77.3772,17.14285],[77.36157,17.16669],[77.37179,17.19944],[77.39294,17.1981],[77.40662,17.2372],[77.45894,17.28058],[77.43826,17.29144],[77.45747,17.34038],[77.45274,17.37335],[77.50349,17.35735],[77.52471,17.36431],[77.53972,17.40645],[77.53911,17.44295],[77.57779,17.43051],[77.60849,17.44332],[77.61732,17.47261],[77.65946,17.48011],[77.69188,17.47463],[77.6912,17.50865],[77.66304,17.5217],[77.59762,17.53374],[77.59603,17.56309],[77.55361,17.55007],[77.52751,17.57308],[77.49462,17.56675],[77.44541,17.58272],[77.45732,17.63263],[77.45138,17.69052],[77.49398,17.7153],[77.53999,17.72825],[77.56532,17.74838],[77.55654,17.76872],[77.50997,17.78724],[77.51604,17.80424],[77.55572,17.81934],[77.5709,17.86625],[77.6208,17.9031],[77.61974,17.93865],[77.65529,17.97047],[77.64737,17.99934],[77.5862,18.01459],[77.55377,18.03572],[77.54914,18.06475],[77.59821,18.0861],[77.59705,18.15205],[77.57179,18.19195],[77.58611,18.21875],[77.57345,18.24294],[77.60614,18.28059],[77.57018,18.29238],[77.56676,18.31792],[77.51948,18.34914],[77.54937,18.3875],[77.56007,18.43522],[77.59709,18.54762],[77.64035,18.55386],[77.65775,18.5271],[77.71216,18.55431],[77.73669,18.55476],[77.74829,18.60515],[77.72956,18.64262],[77.73268,18.67607],[77.74963,18.6899],[77.78664,18.6841],[77.83749,18.80764],[77.90751,18.8295],[77.90895,18.86137],[77.88264,18.86984],[77.86524,18.91043],[77.82421,18.9131],[77.83714,18.95414],[77.79611,18.95146],[77.80057,18.98447],[77.75106,18.98357],[77.74081,19.03041],[77.74304,19.06118],[77.77693,19.07322],[77.78942,19.10534],[77.83179,19.09195],[77.81484,19.13745],[77.84205,19.18294],[77.82822,19.19008],[77.85097,19.25743],[77.88398,19.25832],[77.88442,19.27928],[77.84562,19.28597],[77.84428,19.30426],[77.89602,19.31987],[77.92412,19.3444],[77.96916,19.31095],[78.00172,19.29846],[78.02938,19.27304],[78.03473,19.2436],[78.1101,19.24851],[78.1333,19.232],[78.16675,19.2436],[78.16675,19.28106],[78.18057,19.33369],[78.16318,19.3551],[78.17121,19.39747],[78.20778,19.43583],[78.23543,19.43182],[78.25684,19.4559],[78.29564,19.46794],[78.2787,19.5393],[78.29475,19.57365],[78.29475,19.60621],[78.27111,19.65661],[78.26933,19.69184],[78.29966,19.69273],[78.32909,19.71548],[78.3514,19.78327],[78.3224,19.84125],[78.2778,19.85151],[78.27921,19.88196],[78.3679,19.8814],[78.38128,19.83858],[78.41205,19.8252],[78.45978,19.81851],[78.47762,19.79531],[78.50973,19.82386],[78.5686,19.8136],[78.58734,19.8194],[78.67966,19.79175],[78.70018,19.769],[78.72203,19.78149],[78.76842,19.7806],[78.79116,19.76008],[78.82774,19.76097],[78.84691,19.69898],[78.84245,19.65839],[78.87457,19.65705],[78.89954,19.66954],[78.9379,19.66553],[78.95262,19.65125],[78.94637,19.61914],[78.97626,19.56384],[79.00213,19.54198],[79.03513,19.54733],[79.08018,19.53261],[79.08821,19.51477],[79.12389,19.50318],[79.1725,19.46081],[79.2064,19.46973],[79.19034,19.49381],[79.22023,19.5286],[79.23361,19.57945],[79.22736,19.61468],[79.35492,19.56339],[79.39729,19.53529],[79.42494,19.53529],[79.45394,19.49961],[79.4972,19.52013],[79.5317,19.55241],[79.55367,19.52413],[79.60249,19.51309],[79.61596,19.55941],[79.63608,19.57639],[79.71198,19.58528],[79.75713,19.60733],[79.81825,19.57293],[79.82378,19.55743],[79.87599,19.5041],[79.92536,19.49855],[79.97171,19.42013],[79.97469,19.38922],[79.94937,19.29163],[79.9293,19.24996],[79.92636,19.20252],[79.94349,19.16387],[79.88262,19.13295],[79.85699,19.09508],[79.8741,19.04152],[79.92544,19.05312],[79.93945,19.0406],[79.9397,18.98616],[79.95302,18.96934],[79.95979,18.85795],[79.91056,18.82565],[79.94712,18.78372],[79.99276,18.76905],[80.03276,18.74654],[80.10826,18.68928],[80.24684,18.70149],[80.27513,18.72272],[80.30656,18.68345],[80.33809,18.59903],[80.379,18.60937],[80.38851,18.5972],[80.45022,18.62656],[80.48858,18.62656],[80.514,18.61318],[80.53184,18.58598],[80.59562,18.54896],[80.63264,18.51863],[80.65093,18.47224],[80.6991,18.43612],[80.74281,18.32194],[80.74459,18.30231],[80.7883,18.24968],[80.73344,18.21891],[80.73478,18.17163],[80.79811,18.16628],[80.81774,18.18724],[80.81729,18.22515],[80.85922,18.22605],[80.84807,18.1975],[80.86189,18.13283],[80.9007,18.13461],[80.95422,18.16717],[80.9725,18.14353],[80.94931,18.12302],[80.94396,18.08109],[80.96225,18.03158],[80.98455,17.92276],[80.99436,17.91428],[81.00417,17.83846],[81.03227,17.78985],[81.07375,17.78628],[81.08891,17.81081],[81.15938,17.85273],[81.19194,17.84694],[81.25394,17.81215],[81.40915,17.80501],[81.47025,17.8233],[81.48096,17.80278],[81.5541,17.81616],[81.56882,17.82776],[81.61119,17.81527],[81.64286,17.83935],[81.66293,17.87682],[81.68835,17.88485],[81.70307,17.86121],[81.75838,17.89332],[81.79272,17.85273],[81.78246,17.83177],[81.72939,17.81928],[81.68478,17.77067],[81.62323,17.76264],[81.5764,17.72607],[81.57105,17.68771],[81.50281,17.59003],[81.52377,17.57264],[81.50147,17.53919],[81.49345,17.44865],[81.44171,17.38175],[81.41584,17.36168],[81.37168,17.35722],[81.32262,17.38933],[81.28917,17.33759],[81.26732,17.3202],[81.19016,17.32733],[81.17053,17.29656],[81.18035,17.25463],[81.16295,17.23278],[81.11835,17.22475],[81.02603,17.18684],[80.99124,17.1797],[80.93058,17.20513],[80.90516,17.20111],[80.91318,17.14581],[80.87037,17.14625],[80.8552,17.11146],[80.86412,17.09585],[80.85877,17.05081],[80.82309,17.03787],[80.72586,17.06463],[80.68393,17.06865],[80.65673,17.08782],[80.56039,17.13822],[80.51936,17.10834],[80.49616,17.10789],[80.48234,17.05036],[80.42034,17.02494],[80.39001,17.07623],[80.36682,17.0566],[80.38778,17.0071],[80.35835,16.97052],[80.44264,16.9451],[80.48769,16.91745],[80.49126,16.94822],[80.53184,16.95001],[80.59027,16.91165],[80.5867,16.87374],[80.56485,16.86883],[80.55593,16.81843],[80.6041,16.78766],[80.56262,16.76268],[80.51088,16.76982],[80.45647,16.78989],[80.45245,16.81531],[80.41856,16.84252],[80.37306,16.8113],[80.35879,16.85501],[80.3191,16.87106],[80.31553,16.91254],[80.28877,16.97677],[80.26201,17.01066],[80.23569,17.00219],[80.19555,17.01825],[80.18217,17.04501],[80.134,16.98524],[80.08405,16.96339],[80.04569,16.96517],[80.03722,16.93663],[80.00957,16.90719],[79.99173,16.86303],[80.0332,16.85233],[80.04168,16.82602],[80.07093,16.81323],[80.054,16.74194],[80.02722,16.71251],[80.00576,16.70857],[79.95306,16.63621],[79.90723,16.63408],[79.88555,16.68642],[79.84286,16.70561],[79.81796,16.69098],[79.79256,16.72485],[79.74673,16.72106],[79.72286,16.68966],[79.68544,16.69755],[79.6621,16.68835],[79.63566,16.6594],[79.60613,16.67239],[79.53884,16.63046],[79.49421,16.63408],[79.44409,16.61796],[79.41773,16.57986],[79.37802,16.58412],[79.31162,16.57554],[79.27926,16.5816],[79.24543,16.57009],[79.24388,16.53515],[79.22091,16.51631],[79.21526,16.4846],[79.23202,16.46035],[79.21112,16.44396],[79.21143,16.35493],[79.23438,16.32518],[79.22111,16.23251],[79.1593,16.20893],[79.12305,16.23187],[79.09802,16.2236],[79.05373,16.23827],[79.01236,16.24173],[78.98352,16.21074],[78.92807,16.19871],[78.9049,16.17711],[78.92481,16.13259],[78.92138,16.10307],[78.88876,16.0879],[78.87606,16.13902],[78.83228,16.13919],[78.8419,16.08707],[78.82164,16.05227],[78.78267,16.02125],[78.73718,16.0097],[78.68277,16.03346],[78.64311,16.08312],[78.59917,16.08361],[78.55814,16.04517],[78.45394,16.07503],[78.40727,16.0756],[78.36075,16.04605],[78.32341,16.033],[78.29785,16.01169],[78.2682,16.02857],[78.25445,16.01627],[78.2507,15.96993],[78.20995,15.9197],[78.17371,15.89569],[78.17153,15.85511],[78.13252,15.8549],[78.10755,15.83401],[78.06997,15.85048],[78.03641,15.90188],[78.00803,15.86506],[77.97903,15.87982],[77.93428,15.88216],[77.89376,15.90154],[77.8616,15.88138],[77.80554,15.87083],[77.72205,15.89199],[77.689,15.87914],[77.6536,15.88393],[77.61152,15.91691],[77.58504,15.91532],[77.51178,15.92828],[77.52058,15.95112],[77.51562,16.00803],[77.49612,16.03679],[77.50848,16.07885],[77.49242,16.12134],[77.48889,16.16443],[77.50036,16.1925],[77.49303,16.25534],[77.59655,16.31743],[77.58991,16.33381],[77.54011,16.35849],[77.52418,16.3753],[77.4865,16.38299],[77.41673,16.36775],[77.37791,16.38517],[77.35761,16.3815],[77.28927,16.408],[77.26056,16.45344],[77.23521,16.47123]]]}},IDN:{type:"Feature",id:"IDN",properties:{},geometry:{type:"Polygon",coordinates:[[[109.538,1.92671],[109.58606,1.79192],[109.68554,1.78179],[109.66224,1.61881],[109.82759,1.48148],[109.93117,1.42466],[109.97919,1.29865],[110.09758,1.19756],[110.1922,1.18303],[110.30096,0.99575],[110.39497,0.99668],[110.49064,0.87637],[110.59486,0.858],[110.85815,0.94998],[110.9055,1.02835],[111.19759,1.06475],[111.22607,1.08799],[111.40504,1.0094],[111.48916,1.03442],[111.52219,0.95868],[111.66704,1.04281],[111.82599,0.98538],[111.934,1.10284],[112.13391,1.13752],[112.22581,1.39272],[112.20003,1.43709],[112.5171,1.57395],[112.77536,1.56153],[112.87744,1.58118],[113.05767,1.55877],[113.106,1.44495],[113.35493,1.35908],[113.41908,1.28549],[113.53549,1.32127],[113.63068,1.21597],[113.81508,1.30294],[113.85093,1.38715],[113.97573,1.45005],[114.14945,1.46149],[114.2027,1.4213],[114.41581,1.51111],[114.52646,1.44179],[114.58583,1.44665],[114.61498,1.57508],[114.71115,1.67148],[114.69469,1.81063],[114.74372,1.86954],[114.87834,1.91463],[114.80632,2.02438],[114.78024,2.14454],[114.79949,2.24936],[114.90604,2.25697],[114.95039,2.35132],[115.09508,2.41123],[115.13965,2.4776],[115.23743,2.50599],[115.09278,2.69409],[115.14115,2.74432],[115.11387,2.83327],[115.15001,2.90895],[115.24912,2.9667],[115.48328,3.01964],[115.56423,3.17109],[115.51617,3.26111],[115.53779,3.36201],[115.6344,3.45571],[115.57652,3.6094],[115.57965,3.74752],[115.61864,3.84247],[115.58177,3.88792],[115.64991,3.98828],[115.70731,4.19935],[115.8296,4.24118],[115.8779,4.39102],[116.00607,4.34818],[116.07901,4.27643],[116.18028,4.38255],[116.34851,4.39138],[116.43275,4.32567],[116.53602,4.37566],[116.61942,4.33622],[116.89887,4.36704],[116.97351,4.34488],[117.28899,4.31595],[117.52934,4.1615],[117.8992,4.16585],[117.95861,4.19058],[118.26478,4.09696],[127.3,5.2],[129,2.7],[141,-2.4],[141,-6.3],[140.83,-6.7],[141.02,-6.95],[141.02,-9.5],[128.5,-9.5],[127.3,-8.2],[125,-8.5],[123.96,-9.2],[124.11,-9.42],[124.22,-9.37],[124.269,-9.4],[124.287,-9.5],[124.358,-9.48564],[124.355,-9.43281],[124.383,-9.361],[124.444,-9.31899],[124.48,-9.15],[124.95,-8.9],[124.94064,-9.03565],[124.99695,-9.06413],[125.11368,-8.98275],[125.18234,-9.03293],[125.18234,-9.17396],[124.98459,-9.19429],[124.99283,-9.28646],[125.04913,-9.33254],[125.16,-9.7],[123,-11.4],[100,-7],[93.5,6.3],[96.6,6.1],[103,1.4],[103.75,1.14],[103.9,1.2],[104.5,1.3],[105,3],[108,5.1],[109.64501,2.08141],[109.62041,1.98321],[109.538,1.92671]]]}},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]]]}},korea:{type:"Feature",id:"korea",properties:{},geometry:{type:"Polygon",coordinates:[[[125,33],[124,39.5],[124.38171,40.12429],[124.87061,40.47202],[126.04614,40.95294],[126.60095,41.57231],[126.90308,41.79179],[127.24915,41.50446],[128.19397,41.41802],[128.28186,41.56614],[128.0127,42.0097],[128.8751,42.04521],[129.2926,42.43967],[129.67438,42.45589],[129.87762,43],[130.19348,42.92023],[130.31433,42.66224],[130.50385,42.59555],[130.68237,42.2895],[131.3,36.6],[127.3,33],[125,33]]]}},malaysia:{type:"Feature",id:"malaysia",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[109.538,1.92671],[109.62041,1.98321],[109.64501,2.08141],[113.8,4.8],[114.26015,4.50701],[114.33278,4.34889],[114.31645,4.26363],[114.45418,4.24183],[114.49579,4.14668],[114.6492,4.00624],[114.80762,4.14929],[114.85775,4.26957],[114.87758,4.42656],[114.82955,4.42966],[114.80229,4.67536],[114.85851,4.79751],[114.97133,4.80824],[115.02238,4.74977],[115.09879,4.4685],[115.15547,4.38302],[115.24582,4.34118],[115.28924,4.60384],[115.2375,4.79584],[115.15038,4.87204],[115.15825,5.02512],[115,5.3],[116.9,7.6],[117.5,7.4],[119.35011,5.53088],[119.43909,5.11578],[118.83773,4.45269],[118.26478,4.09696],[117.95861,4.19058],[117.8992,4.16585],[117.52934,4.1615],[117.28899,4.31595],[116.97351,4.34488],[116.89887,4.36704],[116.61942,4.33622],[116.53602,4.37566],[116.43275,4.32567],[116.34851,4.39138],[116.18028,4.38255],[116.07901,4.27643],[116.00607,4.34818],[115.8779,4.39102],[115.8296,4.24118],[115.70731,4.19935],[115.64991,3.98828],[115.58177,3.88792],[115.61864,3.84247],[115.57965,3.74752],[115.57652,3.6094],[115.6344,3.45571],[115.53779,3.36201],[115.51617,3.26111],[115.56423,3.17109],[115.48328,3.01964],[115.24912,2.9667],[115.15001,2.90895],[115.11387,2.83327],[115.14115,2.74432],[115.09278,2.69409],[115.23743,2.50599],[115.13965,2.4776],[115.09508,2.41123],[114.95039,2.35132],[114.90604,2.25697],[114.79949,2.24936],[114.78024,2.14454],[114.80632,2.02438],[114.87834,1.91463],[114.74372,1.86954],[114.69469,1.81063],[114.71115,1.67148],[114.61498,1.57508],[114.58583,1.44665],[114.52646,1.44179],[114.41581,1.51111],[114.2027,1.4213],[114.14945,1.46149],[113.97573,1.45005],[113.85093,1.38715],[113.81508,1.30294],[113.63068,1.21597],[113.53549,1.32127],[113.41908,1.28549],[113.35493,1.35908],[113.106,1.44495],[113.05767,1.55877],[112.87744,1.58118],[112.77536,1.56153],[112.5171,1.57395],[112.20003,1.43709],[112.22581,1.39272],[112.13391,1.13752],[111.934,1.10284],[111.82599,0.98538],[111.66704,1.04281],[111.52219,0.95868],[111.48916,1.03442],[111.40504,1.0094],[111.22607,1.08799],[111.19759,1.06475],[110.9055,1.02835],[110.85815,0.94998],[110.59486,0.858],[110.49064,0.87637],[110.39497,0.99668],[110.30096,0.99575],[110.1922,1.18303],[110.09758,1.19756],[109.97919,1.29865],[109.93117,1.42466],[109.82759,1.48148],[109.66224,1.61881],[109.68554,1.78179],[109.58606,1.79192],[109.538,1.92671]]],[[[99.45833,6.30667],[99.51167,6.48167],[99.68908,6.47146],[99.91691,6.5233],[100.07588,6.40615],[100.15906,6.48065],[100.17157,6.69376],[100.32605,6.6597],[100.36648,6.53967],[100.4962,6.52128],[100.66237,6.45103],[100.73937,6.49207],[100.81258,6.44219],[100.83515,6.29654],[100.90398,6.23379],[100.98414,6.27884],[101.0943,6.26044],[101.12667,6.19264],[101.0868,5.9109],[101.03707,5.91804],[100.98946,5.78393],[101.1192,5.67031],[101.25999,5.71155],[101.27615,5.81155],[101.39691,5.87241],[101.48454,5.86993],[101.58131,5.93436],[101.66236,5.86871],[101.69082,5.75576],[101.79332,5.75066],[101.94402,5.87247],[101.94265,5.98109],[102.05204,6.0785],[102.08029,6.22537],[102.2,6.5],[103.6,5.8],[104.8,2.5],[104.5,1.5],[104.31571,1.28352],[104.12518,1.27582],[104.07647,1.43092],[103.89786,1.42794],[103.81267,1.47847],[103.67389,1.42814],[103.56667,1.1955],[103,1.325],[99,4.5],[99.45833,6.30667]]]]}},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]]]}},MMR:{type:"Feature",id:"MMR",properties:{name:"Myanmar"},geometry:{type:"Polygon",coordinates:[[[92.10937,20.85881],[92.3291,21.49396],[92.68066,21.28937],[92.63672,22.08564],[92.98828,22.06528],[93.18604,22.22809],[93.14209,23.09994],[93.38379,23.22115],[93.36182,24.1267],[94.19678,23.92601],[94.70215,25.04579],[94.57031,25.26457],[95.20752,26.03704],[95.05371,26.49024],[97.66846,28.51697],[98.65723,27.50827],[98.56934,25.85922],[97.62451,24.8665],[97.73438,23.88584],[98.83301,24.14675],[98.85498,23.18076],[99.49219,23.05952],[99.1626,22.04491],[100.0415,21.96342],[100.32715,21.49396],[101.09619,21.71868],[101.16211,21.41216],[99.99756,20.36523],[97.91016,19.49766],[97.53662,18.29195],[98.83301,16.21467],[98.50342,15.32657],[98.21777,15.11455],[98.65723,14.24309],[99.18457,13.66734],[99.22852,12.85465],[99.66797,11.65224],[98.4375,9.90392],[97.77832,14.34955],[97.00928,16.80454],[95.42725,15.55954],[94.021,16.04581],[94.21875,18.0832],[92.10937,20.85881]]]}},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]]]}},thailand_cnx:{type:"Feature",id:"thailand_cnx",properties:{},geometry:{type:"Polygon",coordinates:[[[98.4375,18.2319],[98.4375,19.2255],[99.5306,19.2255],[99.5306,18.2319],[98.4375,18.2319]]]}},thailand_full:{type:"Feature",id:"thailand_full",properties:{},geometry:{type:"Polygon",coordinates:[[[97.50366,8.39358],[97.7124,9.60075],[99.47021,11.8566],[98.05298,14.84923],[98.32764,16.15137],[97.21802,18.39623],[97.38281,19.73568],[100.2832,20.66363],[101.37085,19.69431],[101.40381,18.27109],[104.08447,18.58377],[105.76538,16.06693],[105.52368,14.15788],[102.854,13.82741],[103.00781,11.69527],[102.12891,5.81276],[101.11542,5.4875],[100.66498,6.42448],[99.13788,6.34806],[97.50366,8.39358]]]}},"al-tirana":{type:"Feature",id:"al-tirana",properties:{},geometry:{type:"Polygon",coordinates:[[[19.77796,41.36244],[19.78028,41.36267],[19.78123,41.36014],[19.78004,41.35915],[19.78099,41.35803],[19.77752,41.35682],[19.78082,41.35409],[19.77658,41.35122],[19.78029,41.34936],[19.7832,41.35026],[19.7899,41.34976],[19.79536,41.34793],[19.80046,41.3502],[19.81074,41.35213],[19.81874,41.35044],[19.82238,41.35173],[19.83428,41.35186],[19.84174,41.35434],[19.84682,41.3589],[19.84829,41.35842],[19.85095,41.36008],[19.85159,41.35903],[19.8561,41.35843],[19.85488,41.3545],[19.85784,41.35167],[19.85518,41.35228],[19.85275,41.35145],[19.85276,41.34956],[19.85151,41.34955],[19.85462,41.34419],[19.85876,41.33995],[19.8642,41.33947],[19.86465,41.33789],[19.86829,41.33772],[19.86999,41.33882],[19.87262,41.33794],[19.87259,41.33606],[19.87543,41.3355],[19.87644,41.33126],[19.87554,41.33042],[19.87232,41.33102],[19.87095,41.32999],[19.86659,41.33088],[19.86535,41.32664],[19.86164,41.32543],[19.85813,41.3214],[19.85489,41.32066],[19.85575,41.31876],[19.84532,41.314],[19.84458,41.31212],[19.85095,41.30156],[19.84975,41.29748],[19.8457,41.29559],[19.83906,41.29791],[19.82955,41.29568],[19.82738,41.29791],[19.82504,41.29827],[19.82605,41.29986],[19.82333,41.30509],[19.82032,41.30525],[19.81821,41.3037],[19.81168,41.30787],[19.81162,41.31002],[19.80709,41.31302],[19.79827,41.31487],[19.79767,41.31238],[19.79374,41.313],[19.78954,41.31035],[19.7852,41.31117],[19.78057,41.3142],[19.77976,41.31244],[19.78765,41.30887],[19.78369,41.30473],[19.77721,41.30247],[19.77515,41.30039],[19.77077,41.30363],[19.76019,41.29972],[19.75706,41.30651],[19.75854,41.30874],[19.75473,41.31208],[19.75643,41.31314],[19.75571,41.31548],[19.76586,41.3199],[19.76813,41.32266],[19.77017,41.32139],[19.76811,41.31882],[19.76922,41.31754],[19.77559,41.31854],[19.77323,41.32284],[19.77378,41.32422],[19.77893,41.32349],[19.77968,41.32518],[19.78451,41.32399],[19.78734,41.32541],[19.78321,41.33328],[19.78343,41.33578],[19.77659,41.33783],[19.78083,41.34567],[19.76839,41.35239],[19.75832,41.35489],[19.76053,41.35931],[19.75484,41.3598],[19.75767,41.36542],[19.76169,41.36185],[19.76434,41.36249],[19.76411,41.36393],[19.76775,41.36369],[19.76857,41.36459],[19.77145,41.364],[19.77204,41.36125],[19.77796,41.36244]]]}},albania:{type:"Feature",id:"albania",properties:{},geometry:{type:"Polygon",coordinates:[[[19.39087,41.86138],[19.40186,42.09007],[19.27002,42.18376],[19.69849,42.67436],[19.81384,42.46399],[20.07202,42.55713],[20.25879,42.33824],[20.34668,42.32606],[20.51697,42.23665],[20.61584,41.92272],[20.52795,41.71803],[20.56091,41.57847],[20.44556,41.54559],[20.56091,41.40566],[20.50049,41.3397],[20.58289,41.09177],[20.65979,41.07521],[20.71472,40.90521],[20.95642,40.92181],[20.98389,40.7431],[21.07178,40.60978],[20.95093,40.47202],[20.85205,40.47202],[20.68726,40.10329],[20.43457,40.07387],[20.33569,39.99396],[20.43457,39.82119],[20.38513,39.77899],[20.28625,39.8001],[20.31921,39.72831],[20.20386,39.63954],[19.97314,39.69451],[20.0116,39.86759],[19.86328,40.04444],[19.35791,40.2921],[19.25354,40.51798],[19.4458,40.3298],[19.50073,40.43859],[19.31396,40.65564],[19.41833,40.90936],[19.53918,40.92181],[19.4458,41.00063],[19.43481,41.15384],[19.50623,41.2489],[19.4458,41.32733],[19.41284,41.4139],[19.51721,41.52092],[19.45129,41.60312],[19.52271,41.57847],[19.58862,41.62366],[19.59961,41.7836],[19.39087,41.86138]]]}},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]]]}},graz:{type:"Feature",id:"graz",properties:{},geometry:{type:"Polygon",coordinates:[[[15.26276,46.94182],[15.26276,47.16918],[15.62943,47.16918],[15.62943,46.94182],[15.26276,46.94182]]]}},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]]]}},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]]]}},be_brussels:{type:"Feature",id:"be_brussels",properties:{},geometry:{type:"Polygon",coordinates:[[[4.37973,50.76382],[4.37853,50.76811],[4.34522,50.77337],[4.34205,50.77164],[4.32952,50.77381],[4.31621,50.78624],[4.31458,50.79454],[4.30282,50.79709],[4.29802,50.80593],[4.28901,50.80691],[4.2854,50.80506],[4.27579,50.80696],[4.27218,50.81011],[4.25802,50.80935],[4.25519,50.8151],[4.24403,50.81548],[4.24343,50.82182],[4.25227,50.82697],[4.25107,50.83288],[4.25467,50.83695],[4.27193,50.84036],[4.28094,50.84215],[4.28042,50.85721],[4.27802,50.85911],[4.27699,50.86713],[4.28274,50.87227],[4.29561,50.88094],[4.29553,50.88262],[4.29149,50.88495],[4.29004,50.88982],[4.30634,50.89274],[4.31647,50.89605],[4.32892,50.90249],[4.34025,50.90411],[4.34857,50.90341],[4.36213,50.9033],[4.3726,50.90032],[4.38119,50.90319],[4.38462,50.91093],[4.39578,50.91407],[4.41543,50.91342],[4.41655,50.90757],[4.4296,50.90103],[4.43595,50.89502],[4.43106,50.89014],[4.44007,50.87845],[4.43183,50.87628],[4.4253,50.86615],[4.44599,50.85992],[4.44968,50.85591],[4.46238,50.85396],[4.46899,50.84573],[4.46959,50.83537],[4.47972,50.82036],[4.45947,50.81661],[4.45921,50.80626],[4.48238,50.79617],[4.4817,50.79134],[4.46427,50.78645],[4.435,50.775],[4.43028,50.77517],[4.38917,50.76377],[4.37973,50.76382]]]}},be_flanders:{type:"Feature",id:"be_flanders",properties:{},geometry:{type:"Polygon",coordinates:[[[2.52239,51.10172],[3.12606,51.34118],[3.17493,51.38246],[3.37615,51.38784],[3.41065,51.3304],[3.40202,51.28548],[3.49114,51.2567],[3.48251,51.30345],[3.57737,51.32322],[3.81309,51.27289],[3.82172,51.23691],[3.93095,51.23691],[4.05456,51.27469],[4.20116,51.35195],[4.16954,51.38067],[4.34202,51.39502],[4.36502,51.46491],[4.53749,51.50072],[4.57199,51.47924],[4.56049,51.44879],[4.63811,51.45058],[4.75022,51.52397],[4.83645,51.50787],[5.0808,51.49893],[5.13541,51.447],[5.10667,51.39143],[5.26477,51.31783],[5.26477,51.28727],[5.4085,51.29267],[5.48612,51.32501],[5.58098,51.28368],[5.58385,51.23511],[5.76783,51.2045],[5.87706,51.16125],[5.70459,50.80293],[5.90581,50.78657],[5.93743,50.73202],[5.90293,50.70108],[5.81382,50.69379],[5.61547,50.76112],[5.50049,50.712],[5.2044,50.7029],[5.16416,50.67558],[5.03768,50.70108],[4.98881,50.75021],[4.91694,50.72656],[4.79046,50.76658],[4.68122,50.77021],[4.66973,50.73566],[4.2874,50.67922],[3.91083,50.6774],[3.71823,50.75203],[3.65499,50.712],[3.53426,50.71018],[3.51413,50.74112],[3.45664,50.74384],[3.37328,50.69562],[3.31004,50.70745],[3.28991,50.73657],[3.16487,50.74294],[3.13181,50.77203],[3.08007,50.76021],[2.87453,50.7393],[2.89609,50.71109],[2.87453,50.69562],[2.79692,50.7029],[2.69918,50.8002],[2.62013,50.79747],[2.56982,50.8583],[2.56695,50.92358],[2.60288,50.94985],[2.5497,50.99601],[2.52239,51.10172]]]}},be_wallonia:{type:"Feature",id:"be_wallonia",properties:{},geometry:{type:"Polygon",coordinates:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]]]}},croatia:{type:"Feature",id:"croatia",properties:{},geometry:{type:"Polygon",coordinates:[[[18.55316,42.39709],[18.487,42.33],[16,42.2],[13,45],[13.48,45.55],[13.6,45.46],[13.67282,45.45244],[13.78445,45.47445],[13.87695,45.43477],[13.98354,45.46061],[13.95607,45.5049],[13.99868,45.52812],[14.07402,45.49231],[14.19361,45.48114],[14.23361,45.51383],[14.33098,45.47073],[14.4841,45.54339],[14.55276,45.65149],[15.16462,45.43061],[15.36301,45.48661],[15.28061,45.60731],[15.34584,45.65341],[15.24587,45.72718],[15.55939,45.85272],[15.68573,45.84315],[15.71043,46.04506],[15.61913,46.08657],[15.60059,46.16509],[15.67131,46.23068],[15.78049,46.21928],[15.79422,46.26439],[16.073,46.34266],[16.04759,46.3891],[16.15145,46.40378],[16.30028,46.38152],[16.24191,46.49508],[16.36894,46.55083],[16.66077,46.45725],[16.72462,46.39715],[16.86058,46.35783],[16.97456,46.22688],[17.17232,46.1551],[17.31102,45.97167],[17.58087,45.93874],[17.66574,45.84483],[17.86118,45.77993],[18.15765,45.79625],[18.43522,45.74655],[18.68019,45.91486],[18.77838,45.88666],[18.82507,45.91724],[18.9164,45.70714],[18.96652,45.66972],[18.89717,45.56551],[18.94817,45.54136],[19.01686,45.56369],[19.10858,45.5144],[19.08125,45.47585],[19.00341,45.48553],[18.99315,45.44969],[19.03735,45.40735],[18.9792,45.37883],[19.09424,45.3367],[19.10972,45.30469],[19.2687,45.24886],[19.42108,45.23622],[19.45198,45.16219],[19.2041,45.17236],[19.14345,45.119],[19.09331,45.13091],[19.08464,45.11852],[19.11231,45.08359],[19.1011,44.98811],[19.16343,44.94855],[19.06865,44.88961],[18.99843,44.89696],[19.01991,44.84386],[18.83764,44.84591],[18.75065,44.90197],[18.73803,44.94119],[18.75375,44.95245],[18.78491,44.94261],[18.77858,44.98426],[18.72157,44.98326],[18.66267,45.04785],[18.46602,45.05359],[18.41889,45.09637],[18.22841,45.09274],[18.2011,45.0684],[18.11746,45.06832],[18.0011,45.14282],[17.93745,45.09903],[17.93891,45.07086],[17.84756,45.03242],[17.66404,45.12204],[17.59713,45.09425],[17.16882,45.13674],[16.92275,45.23503],[16.81812,45.17296],[16.5105,45.20898],[16.46738,45.13326],[16.40374,45.10639],[16.36047,44.99622],[16.29175,44.9865],[16.11145,45.08758],[15.99747,45.21978],[15.81894,45.2072],[15.77283,45.16143],[15.80439,45.1121],[15.75505,45.05587],[15.78598,44.96966],[15.7338,44.9371],[15.78598,44.84029],[15.74818,44.81311],[15.82858,44.72686],[15.90458,44.75089],[16.14789,44.48088],[16.15253,44.38405],[16.39709,44.06983],[17.1476,43.49677],[17.22656,43.49776],[17.282,43.47769],[17.30151,43.4393],[17.26227,43.39108],[17.37488,43.2502],[17.44734,43.1998],[17.43805,43.18365],[17.63424,43.09863],[17.71339,42.97351],[17.53967,42.93531],[17.64267,42.88351],[17.67975,42.92174],[17.7903,42.89961],[17.80815,42.92073],[17.85896,42.89458],[17.90239,42.81647],[18.24898,42.61375],[18.3609,42.61526],[18.44437,42.56076],[18.43575,42.48273],[18.55316,42.39709]]]}},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]]]}},denmark:{type:"Feature",id:"denmark",properties:{},geometry:{type:"Polygon",coordinates:[[[7.99805,55.11608],[7.9541,56.94497],[10.62378,57.94401],[12.65625,56.01681],[12.65625,55.91535],[12.82928,55.5566],[12.60956,55.42122],[12.66449,55.25095],[14.82605,55.37911],[15.28198,55.22902],[15.11719,54.85448],[12.87598,54.85922],[12.07672,54.44769],[10.849,54.73414],[10.67871,54.58002],[9.88083,54.83708],[9.73972,54.82265],[9.60823,54.8525],[9.63158,54.87996],[9.59038,54.88668],[9.4994,54.83886],[9.43176,54.82601],[9.41013,54.84242],[9.38198,54.83827],[9.37443,54.82047],[9.34422,54.80108],[9.25152,54.80979],[9.23985,54.84993],[9.13822,54.87483],[9.06338,54.87048],[8.90167,54.90386],[8.85532,54.89517],[8.82408,54.90662],[8.79765,54.90445],[8.77602,54.893],[8.72761,54.89181],[8.67645,54.91195],[8.66066,54.90859],[8.55698,54.92063],[8.47355,55.05537],[7.99805,55.11608]]]}},finland:{type:"Feature",id:"finland",properties:{},geometry:{type:"Polygon",coordinates:[[[24.16992,65.34851],[23.90625,66.14274],[23.68652,66.44311],[23.99414,66.80922],[23.51074,67.27204],[23.37891,67.44123],[23.73047,67.97463],[20.74219,69.03714],[21.18164,69.28726],[21.70898,69.27171],[22.45605,68.73638],[23.15918,68.65655],[23.90625,68.8318],[25.00488,68.59249],[25.40039,68.87936],[25.75195,68.95839],[25.97168,69.70287],[26.45508,69.96044],[27.20215,69.90012],[27.50977,70.0506],[27.86133,70.08056],[28.38867,69.82447],[29.04785,69.71811],[29.26758,69.53452],[28.87207,69.225],[29.0918,69.02141],[28.52051,68.89519],[28.78418,68.84767],[28.52051,68.56038],[28.69629,68.17156],[29.26758,68.0733],[30.05859,67.69277],[29.17969,67.0503],[29.0918,66.8956],[30.14648,65.73063],[29.66309,65.20147],[29.70703,64.79285],[30.05859,64.79285],[30.10254,64.41592],[30.4541,64.30182],[30.05859,63.74363],[31.59668,63.01511],[30.27832,61.89758],[27.81738,60.56538],[27.33398,60.19616],[24.65332,59.88894],[21.84082,59.46741],[20.43457,59.46741],[19.11621,60.19616],[19.2041,60.58697],[20.08301,60.75916],[20.69824,61.14324],[20.96191,61.73153],[19.99512,63.27318],[21.44531,63.66576],[22.93945,64.20638],[23.24707,64.51064],[23.81836,64.66152],[24.16992,65.34851]]]}},france:{type:"Feature",id:"france",properties:{},geometry:{type:"MultiPolygon",coordinates:[[[[9.9,42.64836],[9.9,42.02785],[9.63227,41.43244],[9.36968,41.35052],[9.32602,41.3036],[9.27311,41.29196],[9.07196,41.26129],[8.94186,41.27688],[8.8742,41.26232],[8.84542,41.26311],[8.78782,41.25725],[7.3114,41.4242],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24593,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.26331,50.92504],[1.76605,51.17762],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.26696,43.39308],[9.8,43.1],[9.9,42.64836]]]]}},"de-berlin-brandenburg":{type:"Feature",id:"de-berlin-brandenburg",properties:{},geometry:{type:"Polygon",coordinates:[[[11.32141,53.11711],[12.09595,53.36694],[12.88147,53.20274],[13.78235,53.50765],[14.16687,53.41608],[14.10645,53.28164],[14.29871,53.27507],[14.41956,53.32431],[14.19434,52.93871],[14.19434,52.82932],[14.57336,52.60972],[14.57336,52.36218],[14.71619,52.05249],[14.61182,51.84257],[14.76563,51.54975],[14.36462,51.519],[14.1449,51.54975],[13.99109,51.36835],[13.2605,51.39578],[13.07373,51.65211],[13.13965,51.86971],[12.67273,52.01532],[12.40356,52.03222],[12.22229,52.14697],[12.32117,52.50619],[12.16736,52.51956],[12.23877,52.87245],[11.60156,52.96849],[11.32141,53.11711]]]}},"de-ostwestfalen-lippe":{type:"Feature",id:"de-ostwestfalen-lippe",properties:{},geometry:{type:"Polygon",coordinates:[[[8.04337,52.05756],[8.42583,52.19919],[8.43846,52.35394],[8.30866,52.39929],[8.28438,52.4581],[8.67096,52.56967],[9.22028,52.49616],[9.06097,52.28328],[9.47365,51.86716],[9.46266,51.64103],[9.26285,51.46641],[9.15648,51.43569],[8.80348,51.43218],[8.54444,51.46003],[8.42239,51.55658],[8.31076,51.72252],[8.12645,51.86844],[8.04337,52.05756]]]}},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]]]}},hungary:{type:"Feature",id:"hungary",properties:{},geometry:{type:"Polygon",coordinates:[[[18.43643,45.73111],[17.67426,45.83454],[17.57675,45.92823],[17.35153,45.94303],[17.14966,46.16081],[16.52756,46.50028],[16.3147,46.86582],[16.11969,46.86582],[16.28448,46.99337],[16.48224,47.01584],[16.5152,47.1505],[16.42731,47.2177],[16.43829,47.41136],[16.66763,47.44852],[16.67587,47.60616],[16.43829,47.65614],[16.54816,47.75964],[16.71844,47.73563],[16.75003,47.68111],[17.08099,47.70791],[17.04254,47.86293],[17.09473,47.96234],[17.20734,48.02484],[17.75665,47.74486],[18.71246,47.76702],[18.85529,47.82606],[18.77838,47.87767],[18.75641,47.98808],[18.82233,48.04687],[19.50348,48.1056],[19.55566,48.25028],[19.92096,48.14227],[20.34943,48.30329],[20.54718,48.54389],[20.82184,48.58751],[21.14044,48.50751],[21.47003,48.58751],[21.70074,48.36902],[21.8367,48.34073],[22.2171,48.42282],[22.38327,48.24205],[22.50549,48.24845],[22.61948,48.1056],[22.83371,48.11843],[22.90649,47.95406],[22.59064,47.75779],[22.48077,47.81131],[22.42584,47.74486],[22.32147,47.75779],[22.02759,47.51442],[22.03033,47.38161],[21.9397,47.3658],[21.48926,46.75868],[21.52908,46.73233],[21.4151,46.61737],[21.33133,46.61549],[21.10611,46.23875],[20.79575,46.27863],[20.7106,46.15035],[20.25055,46.13227],[19.82758,46.16461],[19.54742,46.17793],[19.51447,46.1018],[18.80997,45.87567],[18.70285,45.91294],[18.43643,45.73111]]]}},iceland:{type:"Feature",id:"iceland",properties:{},geometry:{type:"Polygon",coordinates:[[[-25.21,65.81],[-23.17,66.89],[-19.51,66.29],[-19.09,67.46],[-17.98,67.34],[-17.38,66.83],[-14.01,66.72],[-12.36,64.54],[-17.21,62.92],[-23.63,63.15],[-25.21,65.81]]]}},italy:{type:"Feature",id:"italy",properties:{},geometry:{type:"Polygon",coordinates:[[[7.6,43.5],[7.49542,43.86523],[7.69043,44.0718],[7.69043,44.19796],[7.42676,44.15068],[6.9873,44.26094],[6.85547,44.55916],[7.03125,44.73113],[7.00928,44.87144],[6.72363,44.91814],[6.5918,45.12005],[7.09717,45.25942],[7.14111,45.41388],[6.96533,45.61404],[6.76758,45.79817],[7.03125,45.9053],[7.55859,45.9817],[7.77832,45.93587],[8.12988,46.13417],[8.08594,46.30141],[8.48145,46.46813],[8.61328,46.13417],[8.81104,46.10371],[9.05273,45.8288],[9.07471,46.11894],[9.27246,46.25585],[9.25049,46.43786],[9.44824,46.49839],[9.49219,46.31658],[9.68994,46.31658],[9.95361,46.36209],[10.06348,46.17983],[10.17334,46.25585],[10.0415,46.453],[10.08545,46.60417],[10.26123,46.66452],[10.45898,46.49839],[10.50293,46.61926],[10.39307,46.70974],[10.41504,46.86019],[10.61279,46.87521],[11.03027,46.76997],[11.16211,46.93526],[11.27197,46.99524],[11.53564,47.01023],[11.7334,46.99524],[12.2168,47.10004],[12.15088,46.93526],[12.43652,46.70974],[12.96387,46.61926],[13.73291,46.54375],[13.71094,46.42271],[13.40332,46.33176],[13.40332,46.22545],[13.66699,46.17983],[13.51318,46.05799],[13.64502,45.96642],[13.5791,45.85941],[13.93066,45.64477],[13.82629,45.5756],[13.6,45.6294],[12.9,45.4],[12.8,45],[18.9,40.3],[18.5,39],[15,36],[11,38],[9.6,43.2],[7.6,43.5]]]}},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]]]}},south_tyrol:{type:"Feature",id:"south_tyrol",properties:{},geometry:{type:"Polygon",coordinates:[[[10.45624,46.86582],[10.73639,46.89211],[10.82977,46.80946],[10.96161,46.81322],[11.1319,46.99149],[11.49067,47.01233],[11.68121,47.04018],[11.7691,47.01023],[12.16736,47.115],[12.28546,47.08322],[12.18384,46.98213],[12.30469,46.85831],[12.37335,46.73421],[12.49969,46.67017],[12.34039,46.61737],[12.08771,46.64944],[12.0163,46.52297],[11.8515,46.49272],[11.66336,46.48657],[11.56929,46.34077],[11.399,46.25585],[11.18958,46.21072],[11.13739,46.2867],[11.20193,46.44732],[10.91904,46.42603],[10.61966,46.43833],[10.44113,46.49036],[10.36766,46.68854],[10.45624,46.86582]]]}},trentino:{type:"Feature",id:"trentino",properties:{},geometry:{type:"Polygon",coordinates:[[[10.49332,46.35641],[10.59219,46.46624],[10.76317,46.49697],[10.84076,46.45536],[11.07971,46.54469],[11.23627,46.50123],[11.21086,46.32559],[11.1779,46.27341],[11.23352,46.2473],[11.32416,46.30235],[11.5583,46.40378],[11.62628,46.5069],[11.83502,46.54233],[11.91399,46.44306],[11.85356,46.34124],[11.99158,46.18363],[11.84464,46.08466],[11.72791,46.07704],[11.69907,45.95592],[11.51093,45.97979],[11.28845,45.8814],[11.21567,45.76273],[11.16074,45.68316],[10.90256,45.66013],[10.82016,45.71097],[10.84076,45.81827],[10.51529,45.76752],[10.41504,46.00269],[10.51941,46.2112],[10.49332,46.35641]]]}},kosovo:{type:"Feature",id:"kosovo",properties:{},geometry:{type:"Polygon",coordinates:[[[20.68323,41.85101],[20.64878,41.8621],[20.62895,41.87788],[20.59321,41.87344],[20.5834,41.88906],[20.57131,41.92032],[20.61548,41.94279],[20.61932,41.97284],[20.60727,41.98358],[20.58959,42.03994],[20.56682,42.05515],[20.55,42.08081],[20.5618,42.12415],[20.51171,42.21912],[20.4557,42.26696],[20.40232,42.28017],[20.39286,42.29328],[20.35016,42.30573],[20.34327,42.32034],[20.32919,42.32272],[20.30564,42.30975],[20.28975,42.31841],[20.25651,42.31381],[20.23897,42.32339],[20.24172,42.33451],[20.23137,42.34709],[20.24041,42.36756],[20.20299,42.40034],[20.2216,42.42031],[20.18897,42.44976],[20.18995,42.46123],[20.16241,42.50248],[20.09905,42.52756],[20.07781,42.55062],[20.05218,42.55643],[20.0611,42.56636],[20.07983,42.63561],[20.09833,42.65387],[20.02597,42.70293],[20.01357,42.73718],[20.0294,42.76543],[20.05828,42.77918],[20.17177,42.77208],[20.25749,42.77015],[20.26633,42.81006],[20.26709,42.81838],[20.40458,42.85177],[20.48421,42.87209],[20.52629,42.8857],[20.48117,42.92979],[20.48712,42.94371],[20.52036,42.97599],[20.538,42.97944],[20.54736,42.96696],[20.56759,43.00047],[20.59714,43.01791],[20.61815,43.00738],[20.63582,43.01263],[20.65529,43.03791],[20.66666,43.05941],[20.65555,43.06668],[20.65535,43.07614],[20.69024,43.09046],[20.68474,43.11734],[20.6571,43.13426],[20.60822,43.17079],[20.59313,43.19966],[20.59288,43.20807],[20.60326,43.21586],[20.61577,43.20947],[20.6759,43.21404],[20.71781,43.23861],[20.72976,43.25396],[20.78861,43.2509],[20.79902,43.26973],[20.82402,43.27416],[20.88056,43.23237],[20.89633,43.2064],[20.89185,43.19741],[20.86038,43.18418],[20.88322,43.17221],[20.968,43.12786],[20.97317,43.13725],[21.00171,43.14304],[21.02916,43.13467],[21.05505,43.11374],[21.0768,43.12108],[21.0795,43.1332],[21.09221,43.14057],[21.11813,43.11808],[21.14314,43.11815],[21.15722,43.09497],[21.14943,43.08237],[21.15915,43.04152],[21.17346,43.02927],[21.17228,43.01229],[21.18865,43.01181],[21.19528,43.02655],[21.20838,43.03051],[21.24098,43.01253],[21.25156,42.98139],[21.24127,42.95446],[21.27793,42.90132],[21.30679,42.91192],[21.33168,42.90934],[21.34717,42.90549],[21.36699,42.87815],[21.44,42.87777],[21.44185,42.85103],[21.43,42.84464],[21.42818,42.80712],[21.41748,42.77388],[21.39541,42.75691],[21.39835,42.75158],[21.45096,42.75723],[21.46671,42.74511],[21.48212,42.7524],[21.53015,42.73143],[21.56111,42.74322],[21.59623,42.731],[21.59439,42.7097],[21.67045,42.68104],[21.68037,42.6972],[21.73393,42.71782],[21.7767,42.72243],[21.77888,42.69807],[21.80449,42.65599],[21.77972,42.64209],[21.77173,42.62838],[21.77008,42.60166],[21.75125,42.58434],[21.75095,42.55505],[21.72961,42.54235],[21.70728,42.54294],[21.70222,42.53272],[21.71414,42.51308],[21.69423,42.49888],[21.67446,42.49033],[21.67458,42.48071],[21.62857,42.45056],[21.65142,42.40951],[21.62852,42.37199],[21.57112,42.35813],[21.5391,42.36425],[21.53133,42.33801],[21.56671,42.3189],[21.59596,42.27006],[21.58272,42.25167],[21.52186,42.23975],[21.50594,42.2651],[21.44573,42.27489],[21.43843,42.25552],[21.44638,42.23142],[21.43208,42.22775],[21.39412,42.24212],[21.3493,42.20076],[21.33667,42.1989],[21.33915,42.18753],[21.30895,42.13871],[21.32219,42.10706],[21.30296,42.10363],[21.29279,42.10824],[21.25722,42.08817],[21.23557,42.08617],[21.21595,42.09461],[21.20791,42.12657],[21.16719,42.1714],[21.16274,42.19266],[21.11303,42.20093],[21.05269,42.16308],[21.02143,42.14681],[20.92263,42.12229],[20.89259,42.09216],[20.83556,42.08285],[20.79199,42.07669],[20.76879,42.04106],[20.77208,41.95756],[20.77892,41.91873],[20.74544,41.8779],[20.68323,41.85101]]]}},norway:{type:"Feature",id:"norway",properties:{},geometry:{type:"Polygon",coordinates:[[[25.98816,69.6179],[25.24109,68.60752],[20.42908,68.97318],[16.9519,67.9499],[13.77686,64.59561],[14.28223,64.47279],[14.08447,63.99524],[13.02979,64.10101],[12.00806,63.2633],[12.14813,61.6586],[12.87323,61.31245],[12.67548,61.0636],[12.26074,61.00241],[12.60681,60.50593],[12.49146,60.08128],[12.17285,59.88756],[11.87622,59.84895],[11.94214,59.69547],[11.6922,59.58998],[11.84601,59.25044],[11.64276,58.89471],[11.45325,58.88194],[11.44775,59.00168],[11.34888,59.11254],[11.18134,59.08009],[11.06186,58.97054],[8,57.5],[3,57.5],[3,83],[40,83],[35,71],[29.61365,69.28629],[27.98767,69.99711],[25.98816,69.6179]]]}},poland:{type:"Feature",id:"poland",properties:{},geometry:{type:"Polygon",coordinates:[[[14.03,52.84],[14.34,53.26],[14.13,54.16],[15.95,54.52],[16.31,54.76],[17.13,54.97],[18.29,55.08],[18.9,54.98],[19.69,54.5],[21.47,54.37],[22.9,54.46],[23.39,54.3],[24.01,53.17],[24.03,52.71],[23.29,52.3],[23.74,52.09],[23.64,51.61],[24.24,50.86],[24.11,50.41],[23.78,50.34],[22.77,49.55],[22.96,48.97],[22.18,49.1],[21.6,49.38],[20.93,49.24],[20.47,49.34],[20.12,49.13],[19.76,49.14],[19.45,49.51],[18.94,49.34],[18.48,49.85],[17.83,49.92],[17.54,50.21],[17.06,50.35],[17.08,50.18],[16.65,50.05],[16.11,50.41],[16.3,50.6],[16.01,50.54],[15.34,50.73],[15.14,50.93],[14.78,50.82],[14.94,51.27],[14.5,51.81],[14.66,52.05],[14.53,52.57],[14.03,52.84]]]}},slovenia:{type:"Feature",id:"slovenia",properties:{},geometry:{type:"Polygon",coordinates:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.37688,45.56647],[13.63953,45.6426],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]]}},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]]]]}},sweden:{type:"Feature",id:"sweden",properties:{},geometry:{type:"Polygon",coordinates:[[[10.57159,58.2445],[10.63202,58.9245],[11.35712,59.12804],[11.53839,58.91174],[11.62079,58.92308],[11.75812,59.24341],[11.65649,59.61777],[11.85974,59.7121],[11.82129,59.84481],[11.95862,59.91098],[12.15363,59.91235],[12.44476,60.0895],[12.48322,60.32151],[12.56012,60.50458],[12.36511,60.71217],[12.19482,61.01572],[12.64801,61.09415],[12.82928,61.34276],[12.55463,61.55018],[12.42828,61.54495],[12.12341,61.71331],[12.28546,62.26664],[12.03278,62.60851],[12.10968,62.74718],[12.06024,62.89772],[12.18658,62.99765],[11.95587,63.28183],[12.18109,63.47873],[12.1344,63.59012],[12.659,63.9856],[12.90619,64.0722],[13.20831,64.10461],[13.9801,64.03014],[14.06525,64.46214],[13.60382,64.56968],[14.26025,65.11608],[14.31519,65.23831],[14.45251,65.31412],[14.47998,65.62656],[14.57886,65.80953],[14.49097,66.15163],[14.99634,66.17161],[15.4248,66.29337],[15.33691,66.51107],[16.04004,66.93221],[16.37512,67.06743],[16.35864,67.21467],[16.06201,67.42015],[16.1499,67.52957],[16.37512,67.55266],[16.70471,67.91688],[17.25952,68.13067],[17.88025,67.99523],[18.09448,68.19809],[18.06702,68.54432],[18.39661,68.58848],[19.00085,68.52019],[19.89075,68.39109],[20.13245,68.48798],[19.89075,68.55637],[20.28076,68.78613],[19.99512,69.06268],[20.62134,69.08033],[20.86853,69.03518],[21.24756,68.8437],[21.92322,68.60652],[22.90649,68.39514],[23.73596,67.96639],[23.5437,67.8362],[23.62061,67.47492],[23.79639,67.44544],[23.81287,67.26992],[23.63159,67.23806],[24.04358,66.82868],[23.91174,66.57448],[23.71399,66.31986],[24.22485,65.97333],[24.04358,65.64469],[21.00586,63.63894],[18.57239,61.83023],[19.18762,60.53297],[19.11346,60.18387],[19.66827,59.82687],[19.90173,58.07788],[18.78662,56.9869],[16.73218,56.05977],[15.0238,55.72711],[14.36462,55.31977],[13.1163,55.22276],[12.7002,55.30414],[12.82654,55.57834],[12.84851,55.72402],[12.79358,55.83214],[12.6123,56.0751],[12.49146,56.13331],[12.07947,56.30435],[11.35437,57.67185],[10.57159,58.2445]]]}},east_midlands_uk:{type:"Feature",id:"east_midlands_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.03031,53.53488],[0.28564,53.56315],[0.48889,53.10722],[0.27299,52.82421],[0.24507,52.7845],[0.27219,52.77279],[0.18631,52.73533],[0.14206,52.7399],[0.08901,52.72361],[0.06361,52.72737],[0.04413,52.71436],[0.04883,52.68175],[0.02104,52.66476],[-0.03129,52.66151],[-0.06373,52.67521],[-0.08777,52.66676],[-0.10221,52.67218],[-0.14108,52.65149],[-0.18003,52.66054],[-0.19288,52.65242],[-0.20605,52.66805],[-0.26064,52.65139],[-0.28925,52.67025],[-0.335,52.67485],[-0.35023,52.66159],[-0.40569,52.64802],[-0.45065,52.65411],[-0.49897,52.63931],[-0.52006,52.64143],[-0.55014,52.61223],[-0.54419,52.59287],[-0.55813,52.59447],[-0.57192,52.58579],[-0.58149,52.59587],[-0.58865,52.58679],[-0.60303,52.58857],[-0.66093,52.56893],[-0.69783,52.5457],[-0.71564,52.52237],[-0.75723,52.51093],[-0.77488,52.51826],[-0.82013,52.51552],[-0.86871,52.52699],[-0.88346,52.51395],[-0.88214,52.49315],[-0.89806,52.4869],[-0.88241,52.47127],[-0.90065,52.45994],[-0.94219,52.46777],[-0.95192,52.47741],[-1.0007,52.47092],[-1.04452,52.44573],[-1.03429,52.43627],[-1.04987,52.42225],[-1.08439,52.43628],[-1.12928,52.41609],[-1.14947,52.39701],[-1.20141,52.39648],[-1.30715,52.49423],[-1.52226,52.57033],[-1.52716,52.58272],[-1.56075,52.59612],[-1.55447,52.61472],[-1.57139,52.6353],[-1.54714,52.64218],[-1.54245,52.65362],[-1.55281,52.66845],[-1.58965,52.68724],[-1.59082,52.69801],[-1.65505,52.69878],[-1.65662,52.72173],[-1.70372,52.7298],[-1.69687,52.75272],[-1.66654,52.78471],[-1.61113,52.78139],[-1.61435,52.78826],[-1.58887,52.79985],[-1.59183,52.80947],[-1.6105,52.81639],[-1.58536,52.8317],[-1.62672,52.85441],[-1.69028,52.86445],[-1.70061,52.86057],[-1.70435,52.86666],[-1.72527,52.85964],[-1.77712,52.88377],[-1.79092,52.88023],[-1.80186,52.88613],[-1.81171,52.88058],[-1.83295,52.8869],[-1.85422,52.93063],[-1.82982,52.94565],[-1.82678,52.97707],[-1.76257,52.99965],[-1.75775,53.01698],[-1.75978,53.03869],[-1.7847,53.04991],[-1.77566,53.05933],[-1.79424,53.08837],[-1.78373,53.10281],[-1.82144,53.13579],[-1.81254,53.15432],[-1.8393,53.1769],[-1.87403,53.19536],[-1.95671,53.21373],[-1.96237,53.22622],[-1.9896,53.21572],[-1.97486,53.23106],[-2.00948,53.26065],[-2.00679,53.35457],[-2.009,53.36201],[-2.03173,53.36573],[-2.03385,53.37517],[-2.00464,53.38633],[-1.99233,53.41519],[-2.02371,53.42055],[-2.02738,53.43233],[-2.01366,53.43988],[-2.00422,53.43592],[-2.00823,53.44155],[-1.98579,53.45523],[-1.98809,53.48033],[-1.97428,53.48838],[-1.97159,53.50434],[-1.92197,53.50995],[-1.92678,53.52095],[-1.91189,53.53803],[-1.89411,53.5336],[-1.87349,53.54041],[-1.84182,53.51989],[-1.82223,53.52108],[-1.80428,53.537],[-1.77188,53.53384],[-1.74155,53.54105],[-1.72318,53.55991],[-1.66945,53.5532],[-1.65103,53.56166],[-1.61581,53.56305],[-1.59636,53.57692],[-1.59109,53.60677],[-1.55023,53.60421],[-1.53078,53.59311],[-1.51867,53.5997],[-1.49656,53.59736],[-1.49512,53.60317],[-1.48371,53.59485],[-1.44763,53.61272],[-1.40036,53.59865],[-1.3767,53.60646],[-1.35612,53.59535],[-1.35143,53.58106],[-1.30782,53.57535],[-1.25803,53.59198],[-1.24825,53.61634],[-1.21778,53.62429],[-1.21602,53.642],[-1.1886,53.63583],[-1.15503,53.64319],[-1.13504,53.63254],[-1.12095,53.64688],[-0.99046,53.6612],[-0.94448,53.65868],[-0.86533,53.63769],[-0.89792,53.58325],[-0.90111,53.5687],[-0.89099,53.56654],[-0.90126,53.54788],[-0.89233,53.53738],[-0.94654,53.52732],[-0.95001,53.51363],[-0.93209,53.51065],[-0.93557,53.5025],[-0.90047,53.47513],[-0.92046,53.46446],[-0.87373,53.46146],[-0.87192,53.46629],[-0.79748,53.45504],[-0.78436,53.46336],[-0.78439,53.47665],[-0.77157,53.47918],[-0.76811,53.4989],[-0.75211,53.50051],[-0.73959,53.51991],[-0.62449,53.51282],[-0.62975,53.45819],[-0.55179,53.4595],[-0.47175,53.47485],[-0.48663,53.48045],[-0.48838,53.50484],[-0.40507,53.51759],[-0.40814,53.53208],[-0.43066,53.54631],[-0.50123,53.53744],[-0.46702,53.54894],[-0.429,53.5745],[-0.41967,53.56375],[-0.33594,53.5586],[-0.30342,53.59077],[-0.30093,53.61636],[-0.24847,53.59364],[-0.25139,53.58463],[-0.23466,53.58623],[-0.22255,53.56799],[-0.19169,53.56844],[-0.21988,53.53258],[-0.21059,53.53168],[-0.20408,53.51174],[-0.2106,53.48626],[-0.18856,53.48451],[-0.1818,53.46862],[-0.15368,53.46565],[-0.14923,53.44667],[-0.13188,53.43591],[-0.12034,53.43357],[-0.08221,53.45112],[-0.10786,53.46987],[-0.0898,53.47765],[-0.09548,53.48596],[-0.07526,53.48931],[-0.06493,53.51878],[-0.01452,53.51538],[0.03031,53.53488]]]}},"england-west-midlands":{type:"Feature",id:"england-west-midlands",properties:{},geometry:{type:"Polygon",coordinates:[[[-3.28493,52.44175],[-3.12706,52.96995],[-1.95817,53.27605],[-1.1222,52.36367],[-1.59859,51.90733],[-2.65611,51.7761],[-3.10848,51.95414],[-3.28493,52.44175]]]}},london_uk:{type:"Feature",id:"london_uk",properties:{},geometry:{type:"Polygon",coordinates:[[[0.23926,51.43251],[0.23923,51.43329],[0.23926,51.43251],[0.23717,51.4241],[0.205,51.39919],[0.18385,51.37628],[0.16188,51.36621],[0.15614,51.3539],[0.1603,51.31026],[0.14958,51.30173],[0.14213,51.29098],[0.06692,51.27361],[-0.01594,51.26864],[-0.05766,51.2586],[-0.10949,51.25943],[-0.16628,51.26848],[-0.19872,51.25854],[-0.22666,51.2587],[-0.27352,51.28757],[-0.31813,51.30077],[-0.33644,51.31532],[-0.40313,51.30581],[-0.44436,51.31987],[-0.47985,51.3302],[-0.50762,51.37142],[-0.53414,51.39494],[-0.54109,51.42774],[-0.53264,51.43923],[-0.5152,51.46248],[-0.49617,51.48894],[-0.50203,51.53945],[-0.5278,51.55474],[-0.53166,51.5611],[-0.53569,51.57289],[-0.53596,51.5778],[-0.53455,51.58275],[-0.53376,51.58792],[-0.51516,51.6337],[-0.49776,51.65205],[-0.4901,51.66912],[-0.45924,51.67692],[-0.44684,51.69442],[-0.42579,51.71213],[-0.39306,51.715],[-0.38079,51.71654],[-0.34459,51.70948],[-0.2838,51.71515],[-0.26707,51.71395],[-0.23509,51.69056],[-0.22093,51.68445],[-0.17729,51.68441],[-0.10644,51.69165],[-0.05899,51.68257],[0.02324,51.678],[0.0691,51.68854],[0.10856,51.68336],[0.19863,51.65015],[0.25714,51.61353],[0.28187,51.57813],[0.29039,51.55903],[0.26811,51.50265],[0.26882,51.49783],[0.26782,51.49042],[0.2659,51.47443],[0.25509,51.46053],[0.23586,51.44791],[0.23926,51.43251]]]}},united_kingdom:{type:"Feature",id:"united_kingdom",properties:{name:"United Kingdom",source:"OpenStreetMap"},geometry:{type:"Polygon",coordinates:[[[-7.24863,55.06999],[-6.96705,55.19847],[-6.59182,55.36664],[-9.93166,58.01975],[0.32957,61.43878],[2.43894,51.64531],[0.72508,50.42953],[-7.66848,49.03788],[-5.93264,51.46771],[-5.4053,53.54032],[-6.07527,54.0096],[-6.28173,54.11135],[-6.309,54.10669],[-6.31788,54.09098],[-6.33629,54.09472],[-6.33993,54.11189],[-6.3662,54.11374],[-6.36237,54.0766],[-6.37492,54.06914],[-6.37907,54.06909],[-6.37911,54.06907],[-6.37918,54.06902],[-6.39105,54.05885],[-6.41198,54.06306],[-6.44345,54.05649],[-6.45607,54.07252],[-6.47779,54.07709],[-6.4713,54.0663],[-6.51051,54.05268],[-6.53187,54.05968],[-6.55772,54.04917],[-6.58643,54.05757],[-6.59499,54.04462],[-6.62381,54.03646],[-6.66426,54.06917],[-6.66202,54.09283],[-6.64506,54.096],[-6.66127,54.12266],[-6.64886,54.12138],[-6.63961,54.13187],[-6.63436,54.16317],[-6.66539,54.19316],[-6.70601,54.20005],[-6.72106,54.18197],[-6.74076,54.18192],[-6.75617,54.19926],[-6.77562,54.19895],[-6.80097,54.21317],[-6.80042,54.2211],[-6.81617,54.22302],[-6.82774,54.26149],[-6.87804,54.27924],[-6.87229,54.28794],[-6.859,54.28191],[-6.85087,54.29728],[-6.87594,54.34641],[-6.90626,54.3503],[-6.91129,54.37474],[-6.93074,54.37575],[-6.9237,54.38284],[-6.95963,54.39221],[-6.98165,54.40946],[-6.99601,54.40538],[-7.0291,54.42137],[-7.05724,54.41108],[-7.07234,54.38839],[-7.10979,54.36824],[-7.10388,54.35574],[-7.15344,54.33501],[-7.18882,54.33765],[-7.17974,54.32046],[-7.17949,54.30924],[-7.19789,54.31106],[-7.21219,54.29962],[-7.17302,54.28613],[-7.17937,54.2726],[-7.16092,54.27371],[-7.14225,54.25559],[-7.15893,54.24396],[-7.14594,54.23957],[-7.14503,54.22473],[-7.17104,54.2176],[-7.18808,54.22492],[-7.1986,54.21578],[-7.22085,54.21581],[-7.23182,54.20557],[-7.24806,54.20446],[-7.24915,54.19817],[-7.233,54.19784],[-7.25942,54.19225],[-7.25828,54.17737],[-7.24028,54.1697],[-7.25812,54.16451],[-7.26296,54.13741],[-7.29195,54.11911],[-7.30891,54.13211],[-7.28551,54.13626],[-7.30149,54.14421],[-7.28379,54.15386],[-7.27997,54.16797],[-7.2913,54.17196],[-7.33956,54.14672],[-7.30533,54.12336],[-7.31867,54.11329],[-7.32713,54.12458],[-7.34602,54.11645],[-7.3632,54.1316],[-7.39181,54.12013],[-7.37279,54.13963],[-7.42078,54.13705],[-7.40959,54.15646],[-7.44192,54.15409],[-7.46841,54.14081],[-7.47919,54.12227],[-7.5281,54.13574],[-7.54738,54.12214],[-7.56576,54.12659],[-7.57454,54.14151],[-7.61043,54.14378],[-7.62966,54.1703],[-7.66425,54.18797],[-7.67659,54.18196],[-7.68829,54.20197],[-7.68543,54.20776],[-7.7394,54.20353],[-7.74858,54.20942],[-7.80368,54.20707],[-7.81173,54.20073],[-7.86017,54.21728],[-7.86046,54.26026],[-7.87322,54.27945],[-7.86187,54.29343],[-7.88087,54.29188],[-7.9017,54.30143],[-7.91095,54.29595],[-7.9616,54.31247],[-8.00093,54.35846],[-8.03129,54.35671],[-8.05733,54.36572],[-8.08416,54.39741],[-8.16026,54.44028],[-8.14291,54.45092],[-8.17751,54.46476],[-8.11467,54.46903],[-8.11324,54.4764],[-8.09148,54.47653],[-8.09868,54.48433],[-8.08933,54.48708],[-8.04265,54.48763],[-8.04185,54.50638],[-8.00601,54.54594],[-7.9703,54.54705],[-7.94973,54.53363],[-7.85055,54.53313],[-7.82402,54.54427],[-7.83325,54.55223],[-7.79659,54.57163],[-7.79341,54.58188],[-7.76212,54.58588],[-7.75151,54.59878],[-7.69725,54.61007],[-7.70877,54.63495],[-7.74165,54.61797],[-7.75797,54.62503],[-7.77236,54.62149],[-7.81366,54.64411],[-7.82828,54.63305],[-7.85213,54.63078],[-7.85669,54.65057],[-7.89164,54.65594],[-7.9099,54.66828],[-7.91381,54.67596],[-7.89766,54.68701],[-7.92089,54.69596],[-7.91804,54.70282],[-7.8796,54.70269],[-7.83665,54.73642],[-7.81761,54.73378],[-7.8047,54.7186],[-7.78875,54.71964],[-7.75006,54.70428],[-7.73551,54.71683],[-7.7116,54.72611],[-7.69723,54.72356],[-7.63657,54.75151],[-7.60944,54.74415],[-7.59117,54.74438],[-7.57919,54.75047],[-7.57865,54.74191],[-7.5698,54.74384],[-7.54826,54.74101],[-7.53859,54.751],[-7.54804,54.75711],[-7.54795,54.78835],[-7.52847,54.80757],[-7.47096,54.8348],[-7.44188,54.87561],[-7.45258,54.89849],[-7.44727,54.93524],[-7.39202,54.94545],[-7.4072,54.95521],[-7.4027,54.96689],[-7.40705,54.98294],[-7.39135,54.99774],[-7.40558,55.00332],[-7.37023,55.03476],[-7.34516,55.05083],[-7.31828,55.04507],[-7.29947,55.0561],[-7.28944,55.04771],[-7.27251,55.06357],[-7.24863,55.06999]]]}},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]]]}},cuba:{type:"Feature",id:"cuba",properties:{},geometry:{type:"Polygon",coordinates:[[[-85.5,21.75],[-83.5,23.5],[-80,23.5],[-73.5,20.4],[-74.5,19.5],[-78,19.5],[-85.5,21.75]]]}},nicaragua:{type:"Feature",id:"nicaragua",properties:{},geometry:{type:"Polygon",coordinates:[[[-88,13],[-87.56104,13.13298],[-87.36877,12.99921],[-86.97876,13.02597],[-86.88538,13.28272],[-86.7041,13.29876],[-86.77002,13.76873],[-86.31409,13.77407],[-86.1438,14.046],[-86.01746,14.05133],[-85.75378,13.89141],[-85.16602,14.31761],[-84.96277,14.80144],[-84.4574,14.63674],[-83.39722,15.03499],[-82.5,14.9],[-82.8,12],[-83.676,10.95],[-83.66,10.8],[-83.92,10.7],[-84.688,11.076],[-84.91,10.945],[-85.615,11.215],[-85.7,11.06],[-86,11.06],[-88,13]]]}},boston_metro:{type:"Feature",id:"boston_metro",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]]]}},hrva:{type:"Feature",id:"hrva",properties:{},geometry:{type:"Polygon",coordinates:[[[-76.85486,36.53392],[-76.85486,37.35488],[-75.8194,37.35488],[-75.8194,36.53392],[-76.85486,36.53392]]]}},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]]]}},massachusetts:{type:"Feature",id:"massachusetts",properties:{},geometry:{type:"Polygon",coordinates:[[[-73.53149,42.9725],[-69.40063,42.9725],[-69.40063,40.98819],[-71.55396,41.04622],[-71.53198,41.91863],[-73.70728,41.91045],[-73.53149,42.9725]]]}},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:"Polygon",coordinates:[[[-73.14602,-49.18818],[-72.91615,-48.93261],[-72.53201,-48.80072],[-72.58755,-48.48542],[-72.22624,-48.32339],[-72.49784,-47.96155],[-72.33315,-47.44938],[-71.86801,-47.23376],[-71.94851,-46.80983],[-71.64665,-46.68783],[-71.79939,-46.19141],[-71.6147,-45.97522],[-71.79762,-45.62288],[-71.46813,-45.4921],[-71.32472,-45.306],[-71.56043,-44.97863],[-72.04094,-44.90019],[-72.07396,-44.78023],[-71.46969,-44.73753],[-71.23704,-44.79082],[-71.13226,-44.4711],[-71.36469,-44.38958],[-71.80731,-44.42036],[-71.84736,-44.11002],[-71.64902,-43.94552],[-71.75129,-43.78527],[-71.60784,-43.62836],[-71.93082,-43.45685],[-71.76157,-43.1645],[-72.14281,-42.8979],[-72.1812,-42.69735],[-72.023,-42.41766],[-72.17288,-42.14043],[-71.72931,-42.12447],[-71.91021,-41.34113],[-71.8196,-41.06038],[-71.96387,-40.71955],[-71.8414,-40.4521],[-71.65704,-40.36426],[-71.82818,-40.20778],[-71.59266,-39.90123],[-71.67811,-39.56486],[-71.39497,-39.34179],[-71.42542,-38.92164],[-70.92524,-38.76298],[-70.84044,-38.54138],[-70.97623,-38.44222],[-70.98292,-38.10477],[-71.21191,-37.68901],[-71.11983,-37.4585],[-71.21555,-37.27261],[-71.09237,-37.11444],[-71.11982,-36.69792],[-71.03513,-36.47333],[-70.71285,-36.42687],[-70.70501,-36.27229],[-70.42451,-36.15581],[-70.38755,-35.60868],[-70.43201,-35.31842],[-70.58358,-35.27831],[-70.36203,-35.13645],[-70.21683,-34.61145],[-70.01089,-34.41389],[-70.03094,-34.28805],[-69.79507,-34.24304],[-69.90417,-33.77143],[-69.7705,-33.3611],[-70.00282,-33.32294],[-70.08089,-33.02919],[-70.00121,-32.8846],[-70.17038,-32.62555],[-70.14899,-32.46585],[-70.31918,-32.27335],[-70.35277,-32.0257],[-70.2106,-31.95769],[-70.46072,-31.84116],[-70.56691,-31.60016],[-70.49734,-31.12216],[-70.40805,-31.16633],[-70.23998,-30.61575],[-70.11719,-30.43102],[-69.89853,-30.35557],[-69.87492,-29.7043],[-70.01808,-29.38321],[-69.78724,-29.13008],[-69.68114,-28.47172],[-69.45679,-28.18357],[-69.17254,-27.97088],[-68.94231,-27.52325],[-68.8412,-27.15464],[-68.29854,-27.0389],[-68.2638,-26.91623],[-68.58734,-26.49294],[-68.55754,-26.2871],[-68.38108,-26.17822],[-68.57599,-25.42894],[-68.4999,-25.16149],[-68.34279,-25.1124],[-68.56789,-24.79739],[-68.26201,-24.40457],[-67.32231,-24.0344],[-66.99052,-23.00044],[-67.18066,-22.8138],[-67.02827,-22.54089],[-66.78247,-22.43778],[-66.73899,-22.23893],[-66.28793,-22.08605],[-66.24277,-21.79408],[-66.07589,-21.83493],[-65.74764,-22.10912],[-64.99322,-22.08239],[-64.53579,-22.29137],[-64.29933,-22.86509],[-64.24332,-22.56039],[-63.93139,-22],[-62.80617,-22],[-62.7913,-22.16193],[-62.3009,-22.48659],[-62.20671,-22.70418],[-61.73612,-23.23432],[-61.08824,-23.61393],[-60.9899,-23.81808],[-60.37353,-24.024],[-60.03941,-24.01156],[-59.47554,-24.33261],[-59.35397,-24.47821],[-58.67243,-24.83192],[-58.24167,-24.92801],[-57.76089,-25.17193],[-57.555,-25.4484],[-57.74064,-25.65045],[-57.89112,-25.9662],[-58.08473,-26.11185],[-58.22103,-26.41403],[-58.18996,-26.64518],[-58.31991,-26.85821],[-58.64913,-27.12662],[-58.59905,-27.29984],[-57.87482,-27.27527],[-57.48754,-27.44418],[-56.96564,-27.50202],[-56.84926,-27.6063],[-56.60117,-27.42102],[-56.3749,-27.58903],[-56.29432,-27.42003],[-56.06276,-27.306],[-55.73692,-27.44516],[-55.6057,-27.16241],[-55.42284,-26.99528],[-54.78695,-26.63111],[-54.61874,-26.20893],[-54.67933,-25.99524],[-54.65698,-25.67619],[-54.5842,-25.58952],[-54.4812,-25.62543],[-54.108,-25.495],[-53.86217,-25.65902],[-53.83619,-25.97166],[-53.6411,-26.21559],[-53.73094,-26.5097],[-53.67249,-26.91252],[-53.84355,-27.16453],[-53.959,-27.15804],[-54.21736,-27.38603],[-54.673,-27.57],[-54.814,-27.533],[-54.936,-27.772],[-55.38728,-27.98524],[-55.76677,-28.23982],[-55.69902,-28.42637],[-55.88091,-28.4715],[-56.29651,-28.80272],[-56.42475,-29.07897],[-56.59315,-29.12516],[-56.70164,-29.35913],[-57.328,-29.972],[-57.64923,-30.20184],[-57.63687,-30.33197],[-57.85924,-30.47701],[-57.8096,-30.91332],[-58.08141,-31.45457],[-57.98082,-31.58691],[-58.20653,-31.86773],[-58.10645,-32.24002],[-58.20464,-32.46055],[-58.0841,-32.99782],[-58.36693,-33.12177],[-58.49375,-33.57857],[-58.29507,-34.17809],[-57.9345,-34.4519],[-55.9,-35.6],[-57,-39],[-61,-41],[-63.5,-55],[-66.67094,-55.11906],[-67.27285,-54.90511],[-67.95071,-54.87373],[-68.60967,-54.91369],[-68.60676,-52.65902],[-68.41869,-52.3325],[-69.19014,-52.15044],[-69.48632,-52.15165],[-69.9955,-52.00074],[-71.92259,-51.99991],[-72.29907,-51.69791],[-72.28621,-50.65987],[-72.72636,-50.61667],[-73.06995,-50.78909],[-73.32848,-50.5716],[-73.52199,-50.15397],[-73.44481,-49.79226],[-73.53933,-49.49825],[-73.47299,-49.20464],[-73.14602,-49.18818]]]}},bolivia:{type:"Feature",id:"bolivia",properties:{},geometry:{type:"Polygon",coordinates:[[[-60.17487,-16.26675],[-58.32092,-16.31948],[-58.47336,-16.74472],[-58.39371,-17.18081],[-57.79152,-17.55501],[-57.71187,-17.73103],[-57.55463,-18.22348],[-57.72079,-18.89914],[-57.70775,-19.0381],[-58.11768,-19.75313],[-57.85675,-19.96754],[-58.15338,-20.15201],[-58.17535,-19.83066],[-59.07074,-19.28846],[-59.97025,-19.29494],[-61.78848,-19.65358],[-62.57401,-21.99972],[-63.93082,-22.00736],[-64.24942,-22.60957],[-64.31808,-22.8806],[-64.56528,-22.36595],[-64.62021,-22.21856],[-64.99649,-22.08628],[-65.77446,-22.10027],[-65.92552,-21.93222],[-66.04774,-21.91884],[-66.04225,-21.86022],[-66.2273,-21.78437],[-66.3121,-22.1219],[-66.74057,-22.23635],[-66.7955,-22.44213],[-67.18002,-22.81353],[-67.56351,-22.90085],[-67.81174,-22.87934],[-68.17566,-21.3252],[-68.405,-20.9499],[-68.54095,-20.92681],[-68.55606,-20.7285],[-68.43796,-20.63857],[-68.74557,-20.46369],[-68.72772,-20.08173],[-68.56293,-20.05077],[-68.53134,-19.85779],[-68.69064,-19.74667],[-68.41873,-19.41544],[-68.9296,-18.97448],[-69.12186,-18.14128],[-69.46793,-17.50852],[-69.46793,-17.37489],[-69.63547,-17.27787],[-69.01199,-16.66053],[-69.03877,-16.58487],[-68.93509,-16.2061],[-69.16718,-16.22259],[-69.40201,-15.62634],[-69.13422,-15.23516],[-69.35806,-14.96933],[-68.97903,-14.21979],[-68.87466,-12.88745],[-68.65768,-12.49088],[-69.57264,-10.94456],[-68.74806,-11.00835],[-68.75167,-11.01762],[-68.75201,-11.03716],[-68.76592,-11.04963],[-68.70815,-11.14253],[-68.54576,-11.11036],[-68.24295,-10.95872],[-68.08502,-10.69165],[-67.86736,-10.64036],[-67.71629,-10.71459],[-67.6775,-10.60341],[-67.65947,-10.61792],[-67.58446,-10.50402],[-67.43614,-10.44966],[-67.40593,-10.38314],[-67.31461,-10.37774],[-67.32216,-10.32438],[-67.1953,-10.32277],[-67.18869,-10.33983],[-67.17093,-10.33814],[-66.57921,-9.90392],[-65.86441,-9.75981],[-65.56503,-9.82477],[-65.44968,-9.67318],[-65.29449,-9.85589],[-65.39474,-10.54722],[-65.35629,-10.78474],[-65.2684,-10.88658],[-65.29861,-11.32656],[-65.14481,-11.70939],[-64.36752,-12.4587],[-63.67538,-12.46675],[-61.64841,-13.53453],[-61.06339,-13.52919],[-60.4303,-13.88608],[-60.23804,-15.09864],[-60.57312,-15.09599],[-60.24353,-15.47221],[-60.17487,-16.26675]]]}},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]]]}},df_br:{id:"df_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-48.20114,-15.49868],[-47.42111,-15.5],[-47.38953,-15.56484],[-47.32361,-15.58865],[-47.33047,-15.63891],[-47.31125,-15.73278],[-47.36755,-15.83189],[-47.3703,-15.927],[-47.36893,-15.99698],[-47.30988,-16.04317],[-48.27805,-16.04713],[-48.24921,-15.94152],[-48.2753,-15.93096],[-48.29041,-15.83189],[-48.22998,-15.77772],[-48.21899,-15.71163],[-48.24097,-15.70898],[-48.23547,-15.66535],[-48.22449,-15.63097],[-48.20251,-15.62568],[-48.20114,-15.49868]]]}},rs_br:{id:"rs_br",type:"Feature",properties:{},geometry:{type:"Polygon",coordinates:[[[-50.56791,-28.32331],[-49.64837,-28.40599],[-49.62152,-28.67722],[-49.82288,-28.81257],[-49.86986,-29.14725],[-49.40674,-29.43409],[-50.66187,-31.5221],[-51.51429,-32.07544],[-52.0244,-32.51232],[-52.32644,-33.22264],[-53.199,-34.04411],[-53.65541,-33.63156],[-53.50103,-32.61414],[-55.57503,-31.01726],[-56.0113,-31.18392],[-56.20595,-30.78112],[-56.93084,-30.18535],[-57.2463,-30.36505],[-57.57519,-30.33029],[-57.71614,-30.18535],[-57.40068,-29.91811],[-57.23959,-29.67347],[-56.02473,-28.4178],[-55.70255,-28.08671],[-54.40043,-27.2008],[-53.38022,-26.97372],[-51.97071,-27.23661],[-51.03103,-27.74271],[-50.56791,-28.32331]]]}},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]]]]}},bogota:{type:"Feature",id:"bogota",properties:{},geometry:{type:"Polygon",coordinates:[[[-74.38,4.7],[-74.17,5],[-73.75,5],[-73.9,4.37],[-74.25,4.31],[-74.38,4.7]]]}},colombia:{type:"Feature",id:"colombia",properties:{},geometry:{type:"Polygon",coordinates:[[[-75.8,11.8],[-71.3,12.7],[-70.9,11.9],[-71.98242,11.65762],[-72.2406,11.14607],[-72.45483,11.10295],[-72.8833,10.43379],[-72.94922,9.83898],[-73.31177,9.20514],[-72.99866,9.29189],[-72.94373,9.09125],[-72.76245,9.12379],[-72.65259,8.61633],[-72.39716,8.36098],[-72.34497,8.00484],[-72.4054,8.04563],[-72.49054,7.945],[-72.4411,7.89875],[-72.45209,7.53676],[-72.43835,7.40605],[-72.18567,7.38426],[-72.14996,7.32161],[-72.18018,7.24532],[-72.03461,7.0273],[-71.12,7.02457],[-71.09528,6.98641],[-70.9964,6.98641],[-70.77942,7.09817],[-70.5542,7.07636],[-70.30701,6.93461],[-70.11475,6.98095],[-69.43016,6.10778],[-69.34914,6.13987],[-69.31,6.0873],[-69.23378,6.08047],[-69.17404,6.15011],[-69.03877,6.22384],[-68.66455,6.14055],[-67.80762,6.288],[-67.45056,6.21155],[-67.47803,6.10232],[-67.40662,6.00946],[-67.60437,5.7909],[-67.63184,5.4629],[-67.82959,5.31524],[-67.79114,4.28068],[-67.62085,3.74915],[-67.5,3.78204],[-67.29126,3.36537],[-67.86255,2.82234],[-67.58789,2.79491],[-67.1759,2.33395],[-66.85181,1.23037],[-67.08801,1.16172],[-67.16766,1.83989],[-67.34894,1.97715],[-67.36816,2.22417],[-67.44781,2.21868],[-67.56866,2.054],[-67.80487,1.98813],[-67.91199,1.81793],[-68.18939,2.01009],[-68.2663,1.85087],[-68.16193,1.73008],[-69.83459,1.71361],[-69.8291,1.08209],[-69.19739,1.06561],[-69.15344,0.62621],[-69.48303,0.73057],[-69.79065,0.58776],[-70.02686,0.57128],[-70.04059,-0.19226],[-69.60937,-0.50262],[-69.55719,-0.65367],[-69.61212,-0.7498],[-69.41986,-1.03541],[-69.40338,-1.37041],[-69.9321,-4.21974],[-69.94995,-4.23275],[-70.06531,-4.08071],[-70.1841,-3.93893],[-70.28641,-3.82246],[-70.35027,-3.80054],[-70.50613,-3.87796],[-70.71075,-3.793],[-70.04883,-2.75102],[-70.8783,-2.23241],[-71.41113,-2.37786],[-71.75171,-2.19124],[-72.36694,-2.48762],[-72.63336,-2.36688],[-72.67456,-2.4595],[-72.93274,-2.4492],[-73.1813,-2.22692],[-73.10028,-2.0842],[-73.14697,-1.79597],[-73.55347,-1.69439],[-73.47382,-1.55437],[-73.64136,-1.26607],[-73.85834,-1.22763],[-74.27582,-0.97774],[-74.42139,-0.51086],[-74.79492,-0.23621],[-75.20142,-0.06592],[-75.27832,-0.12909],[-75.80566,0.04669],[-76.09955,0.32959],[-76.32751,0.42572],[-76.40991,0.37903],[-76.41266,0.23621],[-76.96198,0.27191],[-77.11029,0.36529],[-77.53601,0.40649],[-77.48383,0.65093],[-77.69257,0.73606],[-77.66441,0.81296],[-77.7166,0.85141],[-77.74544,0.83562],[-77.77565,0.83974],[-77.80861,0.82738],[-77.8196,0.80678],[-77.96173,0.82257],[-78.19794,0.94478],[-78.19931,0.99284],[-78.28308,1.05325],[-78.2515,1.08346],[-78.31741,1.19193],[-78.43002,1.1425],[-78.55499,1.2496],[-78.61816,1.24685],[-80,2.5],[-77.7,7.7],[-77.55524,7.51498],[-77.32178,7.87971],[-77.17896,7.93956],[-77.5,8.5],[-75.8,11.8]]]}},ecuador:{type:"Feature",id:"ecuador",properties:{},geometry:{type:"Polygon",coordinates:[[[-82,-3],[-80,2.2],[-77.86079,0.80404],[-77.72072,0.85484],[-77.66287,0.81794],[-77.66424,0.80884],[-77.67385,0.80215],[-77.67729,0.79099],[-77.66184,0.78979],[-77.68587,0.77365],[-77.6972,0.74241],[-77.67523,0.73778],[-77.5573,0.65058],[-77.47353,0.6626],[-77.52159,0.44837],[-76.47583,0.20874],[-76.32202,0.4422],[-76.0199,0.30487],[-75.81665,0.09064],[-75.26733,-0.1181],[-75.31265,-0.16617],[-75.50629,-0.21698],[-75.22888,-0.56441],[-75.20279,-0.97362],[-75.28931,-0.99147],[-75.36072,-0.95027],[-75.64087,-1.62576],[-76.63376,-2.59052],[-77.84637,-3],[-78.2872,-3.42158],[-79.01917,-5.01844],[-79.24301,-4.96581],[-79.62753,-4.42656],[-79.79233,-4.48954],[-80.12535,-4.29784],[-80.36018,-4.49775],[-80.44584,-4.45086],[-80.44739,-4.37692],[-80.33409,-4.21841],[-80.45013,-4.20968],[-80.44928,-4.13024],[-80.48035,-4.09445],[-80.47297,-4.05079],[-80.44739,-3.99719],[-80.39915,-3.98281],[-80.29701,-4.01843],[-80.12878,-3.89718],[-80.16106,-3.86704],[-80.19264,-3.60256],[-80.21633,-3.582],[-80.20706,-3.54705],[-80.21745,-3.5],[-80.22878,-3.50181],[-80.2335,-3.4899],[-80.2456,-3.48759],[-80.24545,-3.48481],[-80.24416,-3.48461],[-80.24386,-3.48247],[-80.24313,-3.48142],[-80.24393,-3.47881],[-80.24079,-3.47723],[-80.2438,-3.46463],[-80.22217,-3.44047],[-80.25238,-3.41],[-82,-3]]]}},paraguay:{type:"Feature",id:"paraguay",properties:{},geometry:{type:"Polygon",coordinates:[[[-54.25873,-24.35961],[-54.58403,-25.58921],[-54.65681,-25.67588],[-54.67916,-25.99493],[-54.61857,-26.20862],[-54.78678,-26.6308],[-55.42267,-26.99497],[-55.60553,-27.1621],[-55.73675,-27.44486],[-55.78857,-27.44309],[-55.89775,-27.34371],[-55.97809,-27.35591],[-56.06259,-27.30569],[-56.29415,-27.41973],[-56.37473,-27.58873],[-56.601,-27.42072],[-56.84909,-27.606],[-56.96547,-27.50172],[-57.48737,-27.44388],[-57.87465,-27.27496],[-58.59888,-27.29953],[-58.64896,-27.12631],[-58.31974,-26.8579],[-58.18979,-26.64487],[-58.22086,-26.41372],[-58.08456,-26.11154],[-57.89095,-25.96589],[-57.74047,-25.65014],[-57.55483,-25.44809],[-57.76072,-25.17162],[-58.2415,-24.9277],[-58.67226,-24.83161],[-59.3538,-24.4779],[-59.47537,-24.3323],[-60.03924,-24.01125],[-60.37336,-24.02369],[-60.98973,-23.81777],[-61.08807,-23.61362],[-61.73595,-23.234],[-62.20654,-22.70386],[-62.30073,-22.48627],[-62.64387,-22.24906],[-62.26072,-21.05983],[-62.26622,-20.56305],[-61.92152,-20.08915],[-61.73647,-19.63289],[-59.97488,-19.29332],[-59.06988,-19.28619],[-58.20814,-19.80515],[-57.83186,-20.9842],[-57.92507,-21.63334],[-57.88113,-21.68734],[-57.90602,-21.71294],[-57.97194,-22.07832],[-56.81013,-22.27099],[-56.56363,-22.20044],[-56.49462,-22.08659],[-56.39677,-22.07641],[-56.26631,-22.24811],[-56.01774,-22.29259],[-55.8526,-22.28227],[-55.78935,-22.38413],[-55.74034,-22.38913],[-55.75132,-22.47989],[-55.7472,-22.50653],[-55.72347,-22.5514],[-55.69845,-22.56298],[-55.69365,-22.57788],[-55.62361,-22.62986],[-55.38191,-24.00601],[-54.65973,-23.82806],[-54.31366,-24.01762],[-54.25873,-24.35961]]]}},peru:{type:"Feature",id:"peru",properties:{},geometry:{type:"Polygon",coordinates:[[[-83,-3],[-80.25238,-3.41],[-80.22217,-3.44047],[-80.2438,-3.46463],[-80.24079,-3.47723],[-80.24393,-3.47881],[-80.24313,-3.48142],[-80.24386,-3.48247],[-80.24416,-3.48461],[-80.24545,-3.48481],[-80.2456,-3.48759],[-80.2335,-3.4899],[-80.22878,-3.50181],[-80.21745,-3.5001],[-80.20706,-3.54705],[-80.21633,-3.582],[-80.19264,-3.60256],[-80.16106,-3.86704],[-80.12878,-3.89718],[-80.29701,-4.01843],[-80.39915,-3.98281],[-80.44739,-3.99719],[-80.47297,-4.05079],[-80.48035,-4.09445],[-80.44928,-4.13024],[-80.45013,-4.20968],[-80.33409,-4.21841],[-80.44739,-4.37692],[-80.44584,-4.45086],[-80.36018,-4.49775],[-80.12535,-4.29784],[-79.79233,-4.48954],[-79.62753,-4.42656],[-79.24301,-4.96581],[-79.01917,-5.01844],[-78.2872,-3.42158],[-77.84637,-3],[-76.63376,-2.59052],[-75.64087,-1.62576],[-75.36072,-0.95027],[-75.56534,-0.13806],[-75.15884,-0.06665],[-74.40628,-0.55553],[-72.92862,-2.39505],[-70.9552,-2.25162],[-70.02686,-2.70987],[-70.70595,-3.78478],[-70.49789,-3.88142],[-70.32349,-3.8088],[-69.95819,-4.23211],[-69.94446,-4.29784],[-69.99802,-4.37316],[-70.10376,-4.29164],[-70.19028,-4.35946],[-71.82999,-4.5662],[-72.86133,-5.25507],[-73.94348,-7.4932],[-72.19116,-9.95803],[-70.61188,-9.57638],[-70.62149,-10.96681],[-69.57161,-10.94557],[-68.65494,-12.49629],[-69.01886,-13.62196],[-68.83896,-14.22445],[-69.38141,-14.86251],[-69.14795,-15.24444],[-69.39926,-15.6151],[-69.19189,-16.17449],[-69.10177,-16.22555],[-68.96152,-16.19456],[-68.78952,-16.34254],[-68.98865,-16.42357],[-69.04015,-16.57368],[-69.01886,-16.65198],[-69.61075,-17.26542],[-69.46896,-17.37423],[-69.46827,-17.49919],[-69.66654,-17.66071],[-69.81262,-17.67281],[-69.75,-18],[-70,-18.27],[-75,-19],[-83,-3]]]}},latam:{type:"Feature",id:"latam",properties:{},geometry:{type:"Polygon",coordinates:[[[-123,14],[-117.45574,32.58935],[-117.23326,32.52453],[-116.43813,32.58992],[-115.96571,32.62752],[-115.48953,32.66395],[-114.71211,32.7179],[-114.7455,32.65614],[-114.79837,32.6067],[-114.81091,32.49615],[-111.06611,31.33282],[-109.5397,31.33311],[-108.86816,31.33165],[-108.2131,31.33135],[-108.21447,31.78655],[-106.52962,31.78363],[-106.51966,31.77225],[-106.50867,31.76116],[-106.4867,31.74715],[-106.4716,31.75123],[-106.46851,31.75912],[-106.45409,31.76554],[-106.43898,31.75678],[-106.41426,31.75007],[-106.37959,31.7305],[-106.37409,31.71269],[-106.35075,31.69575],[-106.33289,31.65835],[-106.30543,31.6224],[-106.28002,31.56186],[-106.24741,31.54314],[-106.21101,31.47347],[-106.17805,31.45766],[-106.14956,31.43335],[-106.00502,31.38881],[-105.76607,31.16816],[-105.38292,30.84683],[-104.9121,30.63644],[-104.67293,29.91804],[-104.39415,29.56151],[-103.20921,28.98742],[-102.4182,29.81056],[-101.4514,29.77242],[-100.96779,29.34866],[-100.9005,29.31454],[-100.69725,29.14257],[-100.62309,28.91322],[-100.51598,28.749],[-100.51186,28.70474],[-100.50293,28.66227],[-100.40337,28.58271],[-100.01472,28.06956],[-99.53957,27.59837],[-99.53339,27.57859],[-99.51279,27.5655],[-99.52103,27.55607],[-99.52824,27.49731],[-99.5018,27.50066],[-99.48601,27.49426],[-99.47777,27.48299],[-99.48498,27.4635],[-99.49596,27.44857],[-99.48669,27.39067],[-99.53476,27.31321],[-99.44344,27.25951],[-99.45717,27.03222],[-99.07127,26.42692],[-98.9978,26.39248],[-98.46771,26.21028],[-98.25966,26.09194],[-98.08388,26.05061],[-97.95067,26.06172],[-97.79205,26.05185],[-97.57919,25.95002],[-97.51328,25.89073],[-97.46315,25.87899],[-97.41783,25.83821],[-97.34367,25.92594],[-97,26],[-81,24],[-73.5,20.5],[-64,20],[-29,0],[-29,-20],[-63,-51],[-62,-57],[-72,-57],[-113,-30],[-123,14]]]}}};
23656
23657   var resources = {"bw-facebook":{id:"bw-facebook",type:"facebook",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Facebook",description:"Page of OpenStreetMap in Botswana",url:"https://www.facebook.com/MappingBotswana/",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"bw-twitter":{id:"bw-twitter",type:"twitter",featureId:"botswana",countryCodes:["bw"],languageCodes:["en","tn"],name:"Mapping Botswana on Twitter",description:"Twitter of OpenStreetMap in Botswana",url:"https://twitter.com/mappingbotswana",contacts:[{name:"info@openstreetmap.org.bw",email:"info@openstreetmap.org.bw"}]},"cape-coast-youthmappers":{id:"cape-coast-youthmappers",featureId:"cape_coast_gh",type:"twitter",name:"University of Cape Coast YouthMappers",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",extendedDescription:"This is the official handle for the Youth Mappers chapter of the University of Cape Coast, Ghana. we love maps, open data and helping the vulnerable.",url:"https://twitter.com/YouthmappersUCC",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-facebook":{id:"osm-gh-facebook",featureId:"ghana",type:"facebook",name:"OpenStreetMap Ghana on Facebook",countryCodes:["gh"],languageCodes:["en"],description:"Facebook group for people interested in OpenStreetMap.",extendedDescription:"Mappers in Ghana community, promoting OpenStreetMap and Humanitarian OpenStreetMap Team (HOT) projects in Ghana. Join us.",url:"https://www.facebook.com/OSMGhana/",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"osm-gh-twitter":{id:"osm-gh-twitter",featureId:"ghana",type:"twitter",name:"OpenStreetMap Ghana on Twitter",countryCodes:["gh"],languageCodes:["en"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmghana",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"talk-gh":{id:"talk-gh",featureId:"ghana",type:"mailinglist",name:"Talk-gh Mailing List",countryCodes:["gh"],languageCodes:["en"],description:"Talk-gh is the official mailing list for Ghana OSM community.",url:"https://lists.openstreetmap.org/listinfo/talk-gh",contacts:[{name:"Enock Seth Nyamador",email:"kwadzo459@gmail.com"}]},"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"}],events:[{id:"sotmasia2018",i18n:true,name:"State of the Map Asia 2018",description:"Join the 2018 OpenStreetMap region-wide event at State of the Map Asia in India",where:"Indian Institute of Management, Bangalore, India",when:"2018-11-17",url:"http://stateofthemap.asia/"}]},"osm-india-forum":{id:"osm-india-forum",featureId:"india_full",type:"forum",countryCodes:["in"],name:"OpenStreetMap India forum",description:"OpenStreetMap India web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=65",contacts:[{name:"OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-github":{id:"osm-india-github",featureId:"india_full",type:"github",name:"OpenStreetMap India GitHub",description:"Code with us: {url}",url:"https://github.com/osm-in",contacts:[{name:"Naveen Francis",email:"naveenpf@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-telegram":{id:"osm-india-telegram",featureId:"india_full",type:"telegram",name:"OpenStreetMap India Telegram",description:"Join our family: {url}",url:"https://t.me/OSMIndia",contacts:[{name:"Naveen Francis",email:"naveenpf@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-india-website":{id:"osm-india-website",featureId:"india_full",type:"osm",name:"OpenStreetMap India",countryCodes:["in"],description:"Mappers and OpenStreetMap users in India",url:"https://openstreetmap.in/",contacts:[{name:" OpenStreetMap India",email:"openstreetmapindia@gmail.com"}]},"osm-india-wiki":{id:"osm-india-wiki",featureId:"india_full",type:"wiki",name:"OpenStreetMap Wikiproject India",description:"Everything you need to know about mapping in India: {url}",url:"https://wiki.openstreetmap.org/wiki/WikiProject_India",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"osm-india-youtube":{id:"osm-india-youtube",featureId:"india_full",type:"youtube",name:"OpenStreetMap India Youtube",description:"Subscribe to our channel: {url}",url:"https://www.youtube.com/channel/UCu5sKaPU04x0RJkgGkoFORw",contacts:[{name:"Naveen Francis",email:"naveenpf@gmail.com"}]},"OSM-India-Puducherry-Facebook":{id:"OSM-India-Puducherry-Facebook",featureId:"india_puducherry",type:"facebook",name:"Free Software Hardware Movement - Facebook",description:"FSHM Facebook page to know about community events, activities",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap. Its FB page is the best way to keep in contact with its events.",url:"https://www.facebook.com/FSHMP",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-Puducherry-Mailing-List":{id:"OSM-Puducherry-Mailing-List",featureId:"india_puducherry",type:"mailinglist",name:"Free Software Hardware Movement - Mailing List",description:"FSHM Puducherry mailing list to discuss mapping in Puducherry and other things.",extendedDescription:"FSHM organizes events relating to free software/hardware, technology, activism and OpenStreetMap.",url:"https://www.freelists.org/archive/puduvailug/",signupUrl:"https://www.freelists.org/list/puduvailug",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"OSM-India-Puducherry-Matrix":{id:"OSM-India-Puducherry-Matrix",featureId:"india_puducherry",type:"matrix",name:"Free Software Hardware Movement - Matrix",description:"FSHM Riot group to discuss, share and update mapping activities, events in and around Puducherry",extendedDescription:"FSHM community members share their OSM mapping updates / experiences through the Riot.im group, this group is also used to discuss things related to free software / hardware, technology and activism.",url:"https://riot.im/app/#/room/#fshm:matrix.org",contacts:[{name:"Kamalavelan",email:"sskamalavelan@gmail.com",osm:"demonshreder"},{name:"Prasanna",email:"prasmailme@gmail.com",osm:"Prashere"}]},"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-japan-website":{id:"OSM-japan-website",featureId:"japan",type:"group",name:"OpenStreetMap Japan",countryCodes:["jp"],languageCodes:["jp"],description:"Mappers and OpenStreetMap users in Japan",url:"https://openstreetmap.jp/",contacts:[{name:"Satoshi IIDA",email:"nyampire@gmail.com"}]},"OSM-korea-telegram":{id:"OSM-korea-telegram",featureId:"korea",type:"telegram",countryCodes:["ko"],languageCodes:["ko","en"],name:"OSM Korea Telegram Channel",description:"Unofficial Channnel for OpenStreetMap contributors, communities and users in Korea to share and discuss.",url:"https://t.me/osmKorea",contacts:[{name:"Yongmin Hong",email:"revi@pobox.com"},{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-MY-facebook":{id:"OSM-MY-facebook",featureId:"malaysia",type:"facebook",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia on Facebook",description:"For chat about anything related to OpenStreetMap!",url:"https://www.facebook.com/groups/openstreetmapMY/",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-forum":{id:"OSM-MY-forum",featureId:"malaysia",type:"forum",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Forum",description:"Official OpenStreetMap Malaysia Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=60",contacts:[{name:"Mohd Saidin",email:"projekopenstreetmap@hotmail.com"}]},"OSM-MY-matrix":{id:"OSM-MY-matrix",featureId:"malaysia",type:"matrix",countryCodes:["my"],languageCodes:["ms","en"],name:"OpenStreetMap Malaysia Riot channel",description:"All mappers are welcome! Sign up at {signupUrl}",signupUrl:"https://riot.im/app/#/register",url:"https://riot.im/app/#/room/#OpenstreetmapMalaysia:matrix.org",contacts:[{name:"Ahmad Amsyar",email:"OfficiallyAhmad@protonmail.ch"}]},"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-MMR-facebook":{id:"OSM-MMR-facebook",featureId:"MMR",type:"facebook",name:"OpenStreetMap Myanmar",description:"Improve OpenStreetMap in Myanmar",extendedDescription:"Mapping in Myanmar? Have questions, want to connect with the community here? Join us at {Url}. All are welcome!",url:"https://www.facebook.com/groups/osmmm/",contacts:[{name:"Yan Naung Oak",email:"yan@phandeeyar.org"},{name:"Patrick Oswald",email:"patrickoswald.omm@gmail.com"},{name:"Set Khaing Oo",email:"setkhaing@phandeeyar.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"],languageCodes:["tl","en"],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:"Erwin Olario",email:"govvin@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"}]},"OSM-TH-CNX-meetup":{id:"OSM-TH-CNX-meetup",featureId:"thailand_cnx",type:"meetup",countryCodes:["th"],languageCodes:["en"],name:"OSM Meetup Chiang Mai",description:"Irregular meeting of the OpenStreetMap community in Chiang Mai",extendedDescription:"Members of the OpenStreetMap community meet every few months in Chiang Mai. Get in contact and check out {url} to see when the next meetup is scheduled",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Team Chiang Mai",email:"meetup-cnx@openstreetmap.in.th"}]},"OSM-TH-facebook":{id:"OSM-TH-facebook",featureId:"thailand_full",type:"facebook",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH Facebook group",description:"Facebook group for OpenStreetMappers in Thailand",url:"https://www.facebook.com/groups/thaiosm/",contacts:[{name:"Theppitak Karoonboonyanan",email:"theppitak@gmail.com"}]},"OSM-TH-forum":{id:"OSM-TH-forum",featureId:"thailand_full",type:"forum",countryCodes:["th"],languageCodes:["en","th"],name:"OpenStreetMap TH forum",description:"OpenStreetMap Thailand web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=46",contacts:[{name:"Stephan Knauss",email:"osm@stephans-server.de"}]},"al-forum":{id:"al-forum",featureId:"albania",type:"forum",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Forum",description:"OpenStreetMap Albania Forum",url:"https://forum.openstreetmap.org/viewforum.php?id=91",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-maptime-tirana":{id:"al-maptime-tirana",featureId:"al-tirana",type:"group",countryCodes:["al"],languageCodes:["sq","en"],name:"Maptime Tirana",description:"Social events organized around mapping - beginners most welcome!",extendedDescription:"Maptime is an open learning environment for all levels and degrees of knowledge, offering intentional educational support for the beginner. Maptime is simultaneously flexible and structured, creating space for mapping tutorials, workshops, ongoing projects with a shared goal, and independent/collaborative work time.",url:"http://maptime.io/tirana/",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"al-telegram":{id:"al-telegram",featureId:"albania",type:"telegram",countryCodes:["al"],languageCodes:["sq","en"],name:"OSM Albania Telegram channel",description:"OpenStreetMap Albania Telegram channel",url:"https://telegram.me/OpenStreetMapAL",contacts:[{name:"Jonathan Beliën",email:"dev@jbelien.be"},{name:"Amanti Lulo",email:"amanti.lulo@gmail.com"}]},"at-forum":{id:"at-forum",featureId:"austria",type:"forum",name:"OpenStreetMap Austria Forum",countryCodes:["at"],languageCodes:["en","de"],description:"The official forum for OpenStreetMap questions in and around Austria",url:"https://forum.openstreetmap.org/viewforum.php?id=89",contacts:[{name:"emga",email:"emgaosm@gmail.com"}]},"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"}]},"osmgraz-meetup":{id:"osmgraz-meetup",featureId:"graz",type:"meetup",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community meetup Graz",description:"Monthly meetup of the OpenStreetMap community in Graz",url:"https://wiki.openstreetmap.org/wiki/Graz/Stammtisch",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"osmgraz-twitter":{id:"osmgraz-twitter",featureId:"graz",type:"twitter",countryCodes:["at"],languageCodes:["de","en"],name:"OSM community Graz on twitter",description:"OpenStreetMap community in Graz on twitter",url:"https://twitter.com/osmgraz",contacts:[{name:"Michael Maier",email:"michael.maier@secure.mailbox.org"}]},"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"}]},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"}]},"be-facebook":{id:"be-facebook",featureId:"belgium",type:"facebook",name:"OpenStreetMap BE Community",countryCodes:["be"],languageCodes:["en","nl","fr","de"],description:"Mappers and OpenStreetMap on 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:"https://webchat.oftc.net/?channels=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 the 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:"belgium",type:"matrix",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap BE Matrix channel",description:"All mappers are welcome!",extendedDescription:"Most talk is happening at the \"OpenStreetMap Belgium\" channel. You can ask anything there! The other rooms are for specific subjects.",url:"https://riot.im/app/#/group/+osmbe:matrix.org",contacts:[{name:"BE community",email:"community@osm.be"}]},"be-meetup":{id:"be-meetup",featureId:"belgium",type:"meetup",countryCodes:["be"],languageCodes:["en","nl","fr","de"],name:"OpenStreetMap Belgium Meetup",description:"Real life meetups of everyone who is interested in OpenStreetMap",extendedDescription:"Physical meetups are great to meet other mappers, ask them questions and to learn a lot. Especially new contributors are very welcome!",url:"https://meetup.com/OpenStreetMap-Belgium/",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: @osm_be",url:"https://twitter.com/osm_be",contacts:[{name:"BE community",email:"community@osm.be"}]},"hr-facebook":{id:"hr-facebook",featureId:"croatia",type:"facebook",name:"OpenStreetMap Croatia Facebook group",countryCodes:["hr"],languageCodes:["hr"],description:"OpenStreetMap Croatia Facebook group",url:"https://www.facebook.com/groups/541098862671461",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-irc":{id:"hr-irc",featureId:"croatia",type:"irc",name:"OpenStreetMap Croatia on IRC",countryCodes:["hr"],languageCodes:["hr"],description:"Join #osm-hr on irc.freenode.org (port 6667)",url:"https://webchat.freenode.net/?url=irc://irc.freenode.net/osm-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"hr-mailinglist":{id:"hr-mailinglist",featureId:"croatia",type:"mailinglist",name:"Talk-hr Mailing List",countryCodes:["hr"],languageCodes:["hr"],description:"Talk-hr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-hr",contacts:[{name:"OpenStreetMap Croatia",email:"info@osm-hr.org"}]},"czech-community":{id:"czech-community",featureId:"czechia",type:"group",name:"Czech OSM community",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Map portal, website and contacts on OSM members in Czechia",url:"https://openstreetmap.cz/komunita",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-facebook":{id:"osmcz-facebook",featureId:"czechia",type:"facebook",name:"OpenStreetMap CZ on Facebook",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Facebook - including translated WeeklyOSM!",url:"https://www.facebook.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"osmcz-twitter":{id:"osmcz-twitter",featureId:"czechia",type:"twitter",name:"Czech twitter @osmcz",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Follow czech community on Twitter - including translated WeeklyOSM!",url:"https://twitter.com/osmcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"talk-cz-mailinglist":{id:"talk-cz-mailinglist",featureId:"czechia",type:"mailinglist",name:"Czech mailing list (talk-cz)",countryCodes:["cz"],languageCodes:["cs","sk","en"],description:"Talk-cz is the official mailing list for Czech community",url:"https://openstreetmap.cz/talkcz",contacts:[{name:"osmcz",email:"dev@openstreetmap.cz"}]},"dk-forum":{id:"dk-forum",type:"forum",featureId:"denmark",countryCodes:["dk"],languageCodes:["da"],name:"OpenStreetMap Denmark Web Forum",description:"OpenStreetMap Denmark web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=48",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-irc":{id:"dk-irc",featureId:"denmark",type:"irc",name:"OpenStreetMap Denmark IRC",countryCodes:["dk"],languageCodes:["da"],description:"Join #osm-dk on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"dk-mailinglist":{id:"dk-mailinglist",featureId:"denmark",type:"mailinglist",name:"Talk-dk Mailing List",countryCodes:["dk"],languageCodes:["da"],description:"A mailing list to discuss OpenStreetMap in Denmark",url:"https://lists.openstreetmap.org/listinfo/talk-dk",contacts:[{name:"Talk-dk-owner",email:"talk-dk-owner@openstreetmap.org"}]},"fi-forum":{id:"fi-forum",featureId:"finland",type:"forum",countryCodes:["fi"],languageCodes:["fi"],name:"OpenStreetMap FI forum",description:"OpenStreetMap Finland web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=15",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-irc":{id:"fi-irc",featureId:"finland",type:"irc",name:"OpenStreetMap Finland IRC",countryCodes:["fi"],languageCodes:["fi"],description:"Join #osm-fi on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fi-mailinglist":{id:"fi-mailinglist",featureId:"finland",type:"mailinglist",name:"Talk-fi Mailing List",countryCodes:["fi"],languageCodes:["fi"],description:"Talk-fi is the official mailing list for the Finnish OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-fi",contacts:[{name:"Talk-fi administrator",email:"talk-fi-owner@openstreetmap.org"}]},"fr-facebook":{id:"fr-facebook",featureId:"france",type:"facebook",name:"OpenStreetMap France Facebook page",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France Facebook page",url:"https://www.facebook.com/osmfr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-forum":{id:"fr-forum",type:"forum",featureId:"france",countryCodes:["fr"],languageCodes:["fr"],name:"OpenStreetMap France web forum",description:"OpenStreetMap France web forum",url:"https://forum.openstreetmap.fr/",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-irc":{id:"fr-irc",featureId:"france",type:"irc",name:"OpenStreetMap France on IRC",countryCodes:["fr"],languageCodes:["fr"],description:"Join #osm-fr on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-mailinglist":{id:"fr-mailinglist",featureId:"france",type:"mailinglist",name:"Talk-fr Mailing List",countryCodes:["fr"],languageCodes:["fr"],description:"Talk-fr mailing list",url:"https://lists.openstreetmap.org/listinfo/talk-fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"fr-twitter":{id:"fr-twitter",featureId:"france",type:"twitter",name:"OpenStreetMap France on Twitter",countryCodes:["fr"],languageCodes:["fr"],description:"OpenStreetMap France on Twitter: {url}",url:"https://twitter.com/osm_fr",contacts:[{name:"OpenStreetMap France",email:"contact@openstreetmap.fr"}]},"de-berlin-mailinglist":{id:"de-berlin-mailinglist",featureId:"de-berlin-brandenburg",type:"mailinglist",name:"Berlin Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Berlin OSM community",url:"https://lists.openstreetmap.de/listinfo/berlin",contacts:[{name:"FOSSGIS e.V.",email:"info@fossgis.de"}]},"de-berlin-meetup":{id:"de-berlin-meetup",featureId:"de-berlin-brandenburg",type:"meetup",name:"OpenStreetMap Berlin-Brandenburg Meetup",countryCodes:["de"],languageCodes:["de"],description:"Mappers and OpenStreetMap users in the Berlin area",url:"https://www.meetup.com/OSM-Berlin-Brandenburg/",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-telegram":{id:"de-berlin-telegram",featureId:"de-berlin-brandenburg",type:"telegram",name:"@osmberlin on Telegram",countryCodes:["de"],languageCodes:["de"],description:"OpenStreetMap Berlin Telegram chat",url:"https://t.me/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"de-berlin-twitter":{id:"de-berlin-twitter",featureId:"de-berlin-brandenburg",type:"twitter",name:"OpenStreetMap Berlin Twitter",countryCodes:["de"],languageCodes:["de"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/osmberlin",contacts:[{name:"Christopher Lorenz",email:"osm@lorenz.lu"}]},"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:"https://webchat.oftc.net/?channels=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"}]},"de-ostwestfalen-lippe-mailinglist":{id:"de-ostwestfalen-lippe-mailinglist",featureId:"de-ostwestfalen-lippe",type:"mailinglist",name:"OWL Mailing List",countryCodes:["de"],languageCodes:["de"],description:"This is the mailing list for the Ostwestfalen-Lippe OSM community",url:"https://gt.owl.de/mailman/listinfo/osm",contacts:[{name:"Florian Lohoff",email:"osm-owner@gt.owl.de"}]},"de-telegram":{id:"de-telegram",featureId:"germany",type:"telegram",name:"OpenStreetMap Germany Telegram",countryCodes:["de"],languageCodes:["de"],description:"Join the OpenStreetMap Germany Telegram supergroup at {url}",url:"https://t.me/OSM_de",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"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"}]},"hu-facebook":{id:"hu-facebook",featureId:"hungary",type:"facebook",name:"OpenStreetMap HU on Facebook",countryCodes:["hu"],languageCodes:["hu"],description:"Mappers and OpenStreetMap Facebook in Hungary",url:"https://www.facebook.com/groups/osm.hu/",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-forum":{id:"hu-forum",featureId:"hungary",type:"forum",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap HU forum",description:"OpenStreetMap Hungary web forum",url:"https://groups.google.com/forum/#!forum/openstreetmap-hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"hu-meetup":{id:"hu-meetup",featureId:"hungary",type:"meetup",countryCodes:["hu"],languageCodes:["hu"],name:"OpenStreetMap Hungary Meetup",description:"The platform for organizing meetups in Hungary",url:"https://www.meetup.com/OpenStreetMap-Hungary",contacts:[{name:"Ferenc Veres",email:"info@openstreetmap.hu"}]},"is-facebook":{id:"is-facebook",type:"facebook",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Facebook",description:"Page of OpenStreetMap in Iceland",url:"https://www.facebook.com/osmiceland/",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-mailinglist":{id:"is-mailinglist",type:"mailinglist",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"Talk-is Mailing List",description:"Talk-is is the official mailing list for the Icelandic OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-is",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"is-twitter":{id:"is-twitter",type:"twitter",featureId:"iceland",countryCodes:["is"],languageCodes:["is","en"],name:"OSM Iceland on Twittter",description:"Twitter of OpenStreetMap in Iceland",url:"https://twitter.com/openstreetmapis",contacts:[{name:"Talk-is-owner",email:"talk-is-owner@openstreetmap.org"}]},"it-facebook":{id:"it-facebook",featureId:"italy",type:"facebook",name:"OpenStreetMap Italy Facebook",countryCodes:["it"],languageCodes:["it"],description:"Join the OpenStreetMap Italy community on Facebook",url:"https://www.facebook.com/OpenStreetMap.Italia/",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-irc":{id:"it-irc",featureId:"italy",type:"irc",name:"OpenStreetMap Italy IRC",countryCodes:["it"],languageCodes:["it"],description:"Join #osm-it on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-mailinglist":{id:"it-mailinglist",featureId:"italy",type:"mailinglist",name:"Talk-it Mailing List",countryCodes:["it"],languageCodes:["it"],description:"Talk-it is the official mailing list for the Italian OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-it",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-telegram":{id:"it-telegram",type:"telegram",featureId:"italy",countryCodes:["it"],languageCodes:["it"],name:"@OpenStreetMapItalia on Telegram",description:"OpenStreetMap Italy Telegram chat",url:"https://t.me/OpenStreetMapItalia",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"it-twitter":{id:"it-twitter",featureId:"italy",type:"twitter",name:"OpenStreetMap Italy Twitter",countryCodes:["it"],languageCodes:["it"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapIt",contacts:[{name:"Simone Cortesi",email:"simone@cortesi.com"},{name:"Stefano",email:"sabas88@gmail.com"},{name:"Alessandro Palmas",email:"alessandro.palmas@wikimedia.it"}]},"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"}]},"South-Tyrol-Mailing-List":{id:"South-Tyrol-Mailing-List",featureId:"south_tyrol",type:"mailinglist",countryCodes:["it"],languageCodes:["de","it","lld","en"],name:"OpenStreetMap mailing list for South Tyrol",description:"OpenStreetMap Italy regional talk list for South Tyrol",url:"https://lists.openstreetmap.org/listinfo/talk-it-southtyrol",contacts:[{name:"Martin Raifer",email:"tyr.asd@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"}]},"Trentino-Mailing-List":{id:"Trentino-Mailing-List",featureId:"trentino",type:"mailinglist",countryCodes:["it"],languageCodes:["it"],name:"OpenStreetMap mailing list for Trentino",description:"OpenStreetMap Italy regional talk list for Trentino",url:"https://lists.openstreetmap.org/listinfo/talk-it-trentino",contacts:[{name:"Luca Delucchi",email:"lucadeluge@gmail.com"}]},"kosovo-telegram":{id:"kosovo-telegram",type:"telegram",featureId:"kosovo",countryCodes:["xk"],languageCodes:["sq","sr","en"],name:"OpenStreetMap Kosovo on Telegram",description:"Semi-official all-Kosovo Telegram public group. We welcome all mappers from anywhere in any language.",url:"https://t.me/osmkosovo",contacts:[{name:"Guillaume Rischard",email:"guillaumenospam@openstreetmapnospam.lu"}]},"no-forum":{id:"no-forum",type:"forum",featureId:"norway",countryCodes:["no"],languageCodes:["no"],name:"OpenStreetMap Norway Web Forum",description:"OpenStreetMap Norway web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=68",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}]},"no-irc":{id:"no-irc",featureId:"norway",type:"irc",name:"OpenStreetMap Norway on IRC",countryCodes:["no"],languageCodes:["no"],description:"Chat room for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://webchat.oftc.net/?channels=osm-no"},"no-mailinglist":{id:"no-mailinglist",featureId:"norway",type:"mailinglist",name:"OpenStreetMap Norway mailing list",countryCodes:["no"],languageCodes:["no"],description:"Mailing list for mappers and OpenStreetMap users, developers and enthusiasts in Norway",contacts:[{name:"OpenStreetMap Norway",email:"kart@nuug.no"}],url:"https://lists.nuug.no/mailman/listinfo/kart"},"OSM-PL-facebook-group":{id:"OSM-PL-facebook-group",type:"facebook",featureId:"poland",countryCodes:["pl"],languageCodes:["pl"],name:"OpenStreetMap Poland Facebook group",description:"Group for mappers and users of OpenStreetMap in Poland",url:"https://www.facebook.com/groups/500589303317858/",contacts:[{name:"Michał Brzozowski",email:"www.haxor@gmail.com"}]},"OSM-PL-forum":{id:"OSM-PL-forum",type:"forum",featureId:"poland",countryCodes:["pl"],languageCodes:["pl","en"],name:"OpenStreetMap Poland Forum",description:"Forum of Polish OpenStreetMap community",url:"https://forum.openstreetmap.org/viewforum.php?id=23",contacts:[{name:"Daniel Koć",email:"daniel@xn--ko-wla.pl"},{name:"Ryszard Mikke",email:"ryszard.mikke@gmail.com"}]},"si-forum":{id:"si-forum",type:"forum",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia Forum",description:"Forum of OpenStreetMap community in Slovenia",url:"https://forum.openstreetmap.org/viewforum.php?id=58",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"si-mailinglist":{id:"si-mailinglist",type:"mailinglist",featureId:"slovenia",countryCodes:["si"],languageCodes:["sl","en"],name:"OpenStreetMap Slovenia mailing list",description:"Mailing list of OpenStreetMap community in Slovenia",url:"https://lists.openstreetmap.org/listinfo/talk-si",contacts:[{name:"OpenStreetMap Slovenia",email:"talk-si@openstreetmap.org"}]},"OSM-ES-mailinglist":{id:"OSM-ES-mailinglist",type:"mailinglist",featureId:"spain",languageCodes:["es"],name:"Talk-es mailing list",description:"A mailing list to discuss OpenStreetMap in Spain",url:"https://lists.openstreetmap.org/listinfo/talk-es",contacts:[{name:"Iván Sánchez",email:"ivansanchez@escomposlinux.org"}]},"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-se":{id:"osm-se",featureId:"sweden",type:"group",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap.se",description:"Provide OSM services and information for the local community in Sweden",url:"http://openstreetmap.se/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-facebook":{id:"se-facebook",featureId:"sweden",type:"facebook",name:"OpenStreetMap Sweden Facebook",countryCodes:["se"],languageCodes:["sv"],description:"OpenStreetMap Sweden on Facebook",url:"https://www.facebook.com/groups/osmsweden/",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-forum":{id:"se-forum",type:"forum",featureId:"sweden",countryCodes:["se"],languageCodes:["sv"],name:"OpenStreetMap Sweden Web Forum",description:"OpenStreetMap Sweden web forum",url:"https://forum.openstreetmap.org/viewforum.php?id=4",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-irc":{id:"se-irc",featureId:"sweden",type:"irc",name:"OpenStreetMap Sweden IRC",countryCodes:["se"],languageCodes:["sv"],description:"Join #osm.se on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm.se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-mailinglist":{id:"se-mailinglist",featureId:"sweden",type:"mailinglist",name:"Talk-se Mailing List",countryCodes:["se"],languageCodes:["sv"],description:"A mailing list to discuss OpenStreetMap in Sweden",url:"https://lists.openstreetmap.org/listinfo/talk-se",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"se-twitter":{id:"se-twitter",featureId:"sweden",type:"twitter",name:"OpenStreetMap Sweden on Twitter",countryCodes:["se"],languageCodes:["sv"],description:"Follow us on Twitter: {url}",url:"https://twitter.com/openstreetmapse",contacts:[{name:"Talk-se-owner",email:"talk-se-owner@openstreetmap.org"}]},"Nottingham-OSM-pub-meetup":{id:"Nottingham-OSM-pub-meetup",featureId:"east_midlands_uk",type:"group",name:"East Midlands (Nottingham) Monthly pub meet-up",countryCodes:["gb"],languageCodes:["en"],description:"Social gathering for East Midlands mappers and users",extendedDescription:"A group have been meeting since March 2011, initially in Nottingham, and, more recently in Derby, and from time to time elsewhere in the East Midlands. These are social gatherings, but are an excellent place to come and ask specific questions about OSM either in the area or in general. In the summer months we usually do some light mapping for an hour in the vicinity of our meeting place. The group as a whole has a special interest in mapping public rights of way and from time to time has mapping meetings for this purpose.",url:"https://wiki.openstreetmap.org/wiki/Nottingham/Pub-meetup",contacts:[{name:"Jerry Clough",email:"SK53.osm@gmail.com"}]},"gb-mailinglist":{id:"gb-mailinglist",featureId:"united_kingdom",type:"mailinglist",name:"Talk-gb Mailing List",countryCodes:["gb"],languageCodes:["en","cy"],description:"Talk-gb is the main communication forum list for the British (including Northern Ireland) OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"mappa-mercia-group":{id:"mappa-mercia-group",featureId:"england-west-midlands",type:"group",countryCodes:["gb"],languageCodes:["en"],name:"Mappa Mercia local group",description:"A home for OpenStreetMap enthusiasts in the Midlands",extendedDescription:"Mappa Mercia is a project to grow OpenStreetMap in the West Midlands, UK. We run community events, provide training and support local organisations wishing to open up their data.",url:"http://www.mappa-mercia.org/",contacts:[{name:"Brian Prangle",email:"community@mappa-mercia.org"}]},"gb-irc":{id:"gb-irc",featureId:"united_kingdom",type:"irc",name:"OpenStreetMap United Kingdom IRC",countryCodes:["gb"],languageCodes:["en","cy"],description:"Join #osm-gb on irc.oftc.net (port 6667)",extendedDescription:"Join #osm-gb on irc.oftc.net (port 6667), please be patient and wait for a few minutes if you ask a question",url:"https://webchat.oftc.net/?channels=osm-gb",contacts:[{name:"UK mailing list",email:"talk-gb-owner@lists.openstreetmap.org"}]},"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/"}]},"OSM-CU-telegram":{id:"OSM-CU-telegram",type:"telegram",featureId:"cuba",countryCodes:["cu"],languageCodes:["es"],name:"OSM Cuba on Telegram",description:"OpenStreetMap Cuba Telegram chat",url:"https://telegram.me/OSM_Cuba",contacts:[{name:"Talk-cu Owner",email:"talk-cu-owner@openstreetmap.org"}]},"OSM-NI-telegram":{id:"OSM-NI-telegram",type:"telegram",featureId:"nicaragua",countryCodes:["ni"],languageCodes:["es"],name:"OSM Nicaragua on Telegram",description:"OpenStreetMap Nicaragua Telegram chat",url:"https://telegram.me/MapaNica",contacts:[{name:"Talk-ni Owner",email:"talk-ni-owner@openstreetmap.org"}]},"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"}]},"MaptimeHRVA-twitter":{id:"MaptimeHRVA-twitter",featureId:"hrva",type:"twitter",name:"MaptimeHRVA Twitter",countryCodes:["us"],languageCodes:["en"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/maptimehrva",contacts:[{name:"Jonah Adkins",email:"jonahadkins@gmail.com"}]},"us-ma-mailinglist":{id:"us-ma-mailinglist",featureId:"massachusetts",type:"mailinglist",name:"Talk-us-massachusetts Mailing List",countryCodes:["us"],languageCodes:["en"],description:"Email mailing list for the Massachusetts OSM community",url:"https://lists.openstreetmap.org/listinfo/talk-us-massachusetts",contacts:[{name:"Alan Bragg",email:"alan.ruth.bragg@gmail.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-forum":{id:"OSM-Portland-forum",featureId:"portland_or",type:"forum",name:"OpenStreetMap PDX Google Group",countryCodes:["us"],languageCodes:["en"],description:"Forum and mailing list for OpenStreetMap users in the Portland area",extendedDescription:"This group is to facilitate improvements to OpenStreetMap in the Portland, Oregon area to support applications such as the Open Trip Planner.",url:"https://groups.google.com/group/osm-pdx",contacts:[{name:"Madeline Steele",email:"madeline.steele@gmail.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://slack.openstreetmap.us/",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"}],events:[{id:"sotmus2018",i18n:true,name:"State of the Map US 2018",description:"Join the OpenStreetMap community at State of the Map US in Detroit, Michigan. Connect with other mappers, businesses, government agencies, and non profits, all collaborating around the free and editable map of the world.",where:"Detroit, Michigan",when:"2018-oct-05",url:"https://2018.stateofthemap.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:"News from the local community",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:"Ideal for long or important discussions. Slow response time.",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)",extendedDescription:"You may find the most geeky user in the community.",url:"https://webchat.oftc.net/?channels=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:"Historic mailing list. Almost unused today.",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:"The most active channel in the community, ideal for chatting and getting answers to your questions instantly. 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}",extendedDescription:"News from the local community and OpenStreetMap in general.",url:"https://twitter.com/OpenStreetMapAr",contacts:[{name:"OpenStreetMap Argentina",email:"openstreetmap.org.ar@gmail.com"}]},"OSM-BO-mailinglist":{id:"OSM-BO-mailinglist",featureId:"bolivia",type:"mailinglist",name:"Talk-bo Mailing List",countryCodes:["bo"],languageCodes:["es"],description:"Talk-bo is the official mailing list for the Bolivian OpenStreetMap community",extendedDescription:"Mapping in Bolivia? Have questions, want to connect with the community here? Join us at {url}. All are welcome!",url:"https://lists.openstreetmap.org/pipermail/talk-bo/",contacts:[{name:"Marco Antonio",email:"marcoantoniofrias@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"}]},"DF-telegram":{id:"DF-telegram",featureId:"df_br",type:"telegram",name:"OpenStreetMap Brasília Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Brasília 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/osmbsb",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"}],events:[{id:"webinar_mundogeo",name:"Webinar: OpenStreetMap em Prefeituras e Empresas",description:"Participe do webinar sobre como utilizar o OpenStreeMap em prefeituras e empresas.",where:"Online",when:"2018-05-02 14:30",url:"http://mundogeo.com/webinar/webinar.html"},{id:"mundogeo",name:"Painel OpenStreetMap no MundoGeo #connect",description:"Participe do painel sobre o OpenStreetMap no MundoGeo #connect.",where:"São Paulo, SP, Brasil",when:"2018-05-16 11:00",url:"http://mundogeoconnect.com/2018/atividades-especiais/"}]},"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"}]},"RS-telegram":{id:"RS-telegram",featureId:"rs_br",type:"telegram",name:"OpenStreetMap Rio Grande do Sul Telegram Group",countryCodes:["br"],languageCodes:["pt"],description:"Join the OpenStreetMap Rio Grande do Sul 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/osmrs",contacts:[{name:"No one",email:"nobody@nowhere.org"}]},"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"}]},"Maptime-Bogota":{id:"Maptime-Bogota",featureId:"bogota",type:"meetup",name:"Maptime Bogotá",countryCodes:["co"],languageCodes:["es"],description:"We're a group of mappers interested in mapping in OpenStreetMap around Bogotá.",extendedDescription:"Learn to collect data in the field and digitize onto OpenStreetMap.  It is not necessary to have previous knowledge! You just need the desire to participate, learn, and have fun.",url:"https://www.meetup.com/Maptime-Colombia-OSM/",contacts:[{name:"Andrés Gómez Casanova",email:"angoca@gmail.com"}]},"OSM-CO-facebook":{id:"OSM-CO-facebook",featureId:"colombia",type:"facebook",name:"OpenStreetMap Colombia Facebook",countryCodes:["co"],languageCodes:["es"],description:"Join the OpenStreetMap Colombia community on Facebook",extendedDescription:"Join the community to learn more about OpenStreetMap. Everyone is welcome!",url:"https://www.facebook.com/groups/OsmCol/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-mailinglist":{id:"OSM-CO-mailinglist",featureId:"colombia",type:"mailinglist",name:"Talk-co Mailing List",countryCodes:["co"],languageCodes:["es"],description:"A mailing list to discuss OpenStreetMap in Colombia",url:"https://lists.openstreetmap.org/pipermail/talk-co/",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-telegram":{id:"OSM-CO-telegram",type:"telegram",featureId:"colombia",countryCodes:["co"],languageCodes:["es"],name:"OSM Colombia on Telegram",description:"OpenStreetMap Colombia Telegram chat",url:"https://telegram.me/osmco",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO-twitter":{id:"OSM-CO-twitter",featureId:"colombia",type:"twitter",name:"OpenStreetMap Colombia Twitter",countryCodes:["co"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/OpenStreetMapCo",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-CO":{id:"OSM-CO",featureId:"colombia",type:"group",countryCodes:["co"],languageCodes:["es"],name:"OpenStreetMap Colombia",description:"News of the OpenStreetMap Colombia community and the OSMCo Foundation",url:"https://blog.openstreetmap.co/s657",contacts:[{name:"Fredy Rivera",email:"fredyrivera@gmail.com"}]},"OSM-EC-telegram":{id:"OSM-EC-telegram",type:"telegram",featureId:"ecuador",languageCodes:["es"],countryCodes:["ec"],name:"OSM Ecuador on Telegram",description:"OpenStreetMap Ecuador Telegram chat",url:"https://telegram.me/MappingEcuador",contacts:[{name:"Talk-ec Owner",email:"talk-ec-owner@openstreetmap.org"}]},"OSM-PY-telegram":{id:"OSM-PY-telegram",type:"telegram",featureId:"paraguay",languageCodes:["es"],countryCodes:["py"],name:"OSM Paraguay on Telegram",description:"OpenStreetMap Paraguay Telegram chat",url:"https://telegram.me/osm_py",contacts:[{name:"Talk-py Owner",email:"talk-py-owner@openstreetmap.org"}]},"OSM-PE-facebook":{id:"OSM-PE-facebook",featureId:"peru",type:"facebook",name:"OpenStreetMap Peru Facebook",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Facebook",url:"https://www.facebook.com/Osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-mailinglist":{id:"OSM-PE-mailinglist",featureId:"peru",type:"mailinglist",name:"Talk-pe Mailing List",countryCodes:["pe"],languageCodes:["es"],description:"The official mailing list for the OpenStreetMap Peru community",url:"https://lists.openstreetmap.org/pipermail/talk-pe/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-matrix":{id:"OSM-PE-matrix",featureId:"peru",type:"matrix",name:"OpenStreetMap Peru Matrix Chat",countryCodes:["pe"],languageCodes:["es"],description:"Chat with other members of the OpenStreetMap Peru community in Matrix.",url:"https://matrix.to/#/#osmpe:matrix.org",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-telegram":{id:"OSM-PE-telegram",featureId:"peru",type:"telegram",name:"OpenStreetMap Peru Telegram",countryCodes:["pe"],languageCodes:["es"],description:"Join the OpenStreetMap Peru community on Telegram",url:"https://telegram.me/osmPe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE-twitter":{id:"OSM-PE-twitter",featureId:"peru",type:"twitter",name:"OpenStreetMap Peru Twitter",countryCodes:["pe"],languageCodes:["es"],description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmpe",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"OSM-PE":{id:"OSM-PE",featureId:"peru",type:"group",name:"OpenStreetMap Peru",countryCodes:["ar"],languageCodes:["es"],description:"News and resources for the OpenStreetMap Peru community",url:"http://osmpe.ourproject.org/",contacts:[{name:"Diego Sangunietti",email:"diego.sanguinetti@hotmail.com"},{name:"Ruben Lopez M.",email:"rub2106@gmail.com"}]},"LATAM-Facebook":{id:"LATAM-Facebook",featureId:"latam",type:"facebook",languageCodes:["es","pt"],name:"OpenStreetMap Latam Facebook",description:"OpenStreetMap Latam on Facebook",url:"https://www.facebook.com/osmlatam/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Telegram":{id:"LATAM-Telegram",featureId:"latam",type:"telegram",languageCodes:["es","pt"],name:"OpenStreetMap Latam Telegram",description:"OpenStreetMap Telegram for Latin America",url:"https://t.me/OSMLatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"LATAM-Twitter":{id:"LATAM-Twitter",featureId:"latam",type:"twitter",languageCodes:["es","pt"],name:"OpenStreetMap Latam Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/osmlatam",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}]},"osm-latam":{id:"osm-latam",featureId:"latam",type:"group",languageCodes:["es","pt"],name:"OpenStreetMap Latam",description:"Supporting OpenStreetMap in Latin America",url:"https://osmlatam.org/",contacts:[{name:"OSM LATAM",email:"info@osmlatam.org"}],events:[{id:"sotm-latam-2018",i18n:true,name:"State of the Map Latam 2018",description:"State of the Map Latam is the annual conference for all mappers and users of OpenStreetMap in Latin America. The program includes talks, panels, workshops, and mapathons related to OpenStreetMap.",where:"Buenos Aires, Argentina",when:"2018-sep-24",url:"https://state.osmlatam.org/"}]},"OSM-Discord":{id:"OSM-Discord",type:"discord",languageCodes:["en"],name:"OpenStreetMap Discord",description:"Get in touch with other mappers via Discord",url:"https://discord.gg/SRZUYUz",contacts:[{name:"Austin Harrison",email:"jaustinharrison@gmail.com"}]},"OSM-Facebook":{id:"OSM-Facebook",type:"facebook",languageCodes:["en"],name:"OpenStreetMap on Facebook",description:"Like us on Facebook for news and updates about OpenStreetMap.",url:"https://www.facebook.com/OpenStreetMap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"OSM-help":{id:"OSM-help",type:"forum",languageCodes:["en"],name:"OpenStreetMap Help",description:"Ask a question and get answers on OSM's community-driven question and answer site.",extendedDescription:"{url} is for everyone who needs help with OpenStreetMap.  Whether you are a beginner mapper or have a technical question, we're here to help!",url:"https://help.openstreetmap.org/",contacts:[{name:"OSMF Operations",email:"operations@osmfoundation.org"}]},"OSM-IRC":{id:"OSM-IRC",type:"irc",languageCodes:["en"],name:"OpenStreetMap IRC",description:"Join #osm on irc.oftc.net (port 6667)",url:"https://webchat.oftc.net/?channels=osm",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},"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"}]},"OSM-Telegram":{id:"OSM-Telegram",type:"telegram",languageCodes:["en"],name:"OpenStreetMap Telegram",description:"Join the OpenStreetMap Telegram global supergroup at {url}",url:"https://t.me/OpenStreetMapOrg",contacts:[{name:"Max N",email:"abonnements@revolwear.com"}]},"OSM-Twitter":{id:"OSM-Twitter",type:"twitter",languageCodes:["en"],name:"OpenStreetMap Twitter",description:"Follow us on Twitter at {url}",url:"https://twitter.com/openstreetmap",contacts:[{name:"Harry Wood",email:"mail@harrywood.co.uk"}]},OSMF:{id:"OSMF",type:"group",languageCodes:["en","nl","fr","it","jp","ru"],name:"OpenStreetMap Foundation",description:"OSMF is a UK-based not-for-profit that supports the OpenStreetMap Project",extendedDescription:"OSMF supports the OpenStreetMap by fundraising, maintaining the servers which power OSM, organizing the annual State of the Map conference, and coordinating the volunteers who keep OSM running. You can show your support and have a voice in the direction of OpenStreetMap by joining as an OSMF member here: {signupUrl}",url:"https://wiki.osmfoundation.org/wiki/Main_Page",signupUrl:"https://join.osmfoundation.org/",contacts:[{name:"OSMF Board",email:"board@osmfoundation.org"}],events:[{id:"sotm2018",i18n:true,name:"State of the Map 2018",description:"Join us for 3 days in Milan, Italy for the annual worldwide OpenStreetMap conference, bringing together everyone in the community to socialize, share, and learn.",where:"Milan, Italy",when:"2018-jul-28",url:"https://2018.stateofthemap.org/"}]}};
23658
23659   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",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],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",zoomExtent:[0,19],polygon:[[[-123.02167,48.44667],[-122.94666,48.44781],[-122.90151,48.41307],[-122.80263,48.40771],[-122.79199,48.4428],[-122.80881,48.47866],[-122.73912,48.49572],[-122.78547,48.62161],[-122.73088,48.63613],[-122.7556,48.71208],[-122.95747,48.71593],[-122.97086,48.69577],[-122.9997,48.6978],[-123.00348,48.73427],[-123.0433,48.7431],[-123.07626,48.70528],[-123.08485,48.66335],[-123.12845,48.6638],[-123.22698,48.70302],[-123.24655,48.68353],[-123.17445,48.64702],[-123.21514,48.60107],[-123.21393,48.57336],[-123.1808,48.56575],[-123.16621,48.52006],[-123.10235,48.47684],[-123.02167,48.44667]],[[-122.98339,48.78214],[-122.93498,48.76653],[-122.91181,48.73858],[-122.80229,48.73982],[-122.81946,48.75499],[-122.9343,48.79572],[-122.98374,48.79436],[-122.98339,48.78214]]],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",zoomExtent:[6,14],polygon:[[[-3.04697,54.83947],[-3.05864,55.24157],[-4.04466,55.23296],[-4.07076,55.63654],[-4.61904,55.6253],[-4.64926,56.02834],[-4.48961,56.03217],[-4.52394,56.4367],[-3.86751,56.44581],[-3.84176,56.04944],[-3.44591,56.04982],[-3.43492,55.64429],[-2.79497,55.65049],[-2.80802,56.05749],[-3.20661,56.05327],[-3.21417,56.45682],[-3.73808,56.45075],[-3.74185,56.86175],[-5.07669,56.83171],[-5.03652,56.42949],[-5.16012,56.42493],[-5.12991,56.01798],[-5.92607,55.99456],[-5.85518,55.23335],[-5.2281,55.25136],[-5.21024,55.02765],[-4.65956,55.04181],[-4.64548,54.81633],[-3.04697,54.83947]],[[-1.74835,57.76428],[-1.74065,57.36],[-2.58022,57.35537],[-2.57437,57.04526],[-2.08408,57.04799],[-2.07651,56.64276],[-2.7345,56.63906],[-2.73781,56.81718],[-3.23885,56.81437],[-3.24896,57.35168],[-3.75629,57.34889],[-3.76219,57.65868],[-4.76587,57.64473],[-4.81008,58.26984],[-5.2511,58.26547],[-5.27376,58.66767],[-3.55818,58.69887],[-3.56607,58.9316],[-3.37656,58.93444],[-3.38584,59.20171],[-3.18713,59.20215],[-3.18747,59.24176],[-3.06757,59.24203],[-3.07855,59.42135],[-2.37131,59.42763],[-2.36856,59.0222],[-2.67893,59.02078],[-2.67343,58.83935],[-2.86569,58.83651],[-2.8602,58.53531],[-3.03461,58.53316],[-3.0195,58.13159],[-3.6156,58.11982],[-3.61276,57.97754],[-3.71092,57.97562],[-3.69932,57.75364],[-1.74835,57.76428]],[[-7.07492,56.76319],[-7.73471,56.73566],[-7.7911,57.13994],[-7.70662,57.14343],[-7.76299,57.54311],[-7.60218,57.54968],[-7.62134,57.68452],[-7.72499,57.6803],[-7.73017,57.71673],[-7.60264,57.72191],[-7.59964,57.70083],[-7.48634,57.70544],[-7.49528,57.76813],[-7.37493,57.77301],[-7.39337,57.90201],[-7.23591,57.90838],[-7.24323,57.95948],[-7.13916,57.96369],[-7.14508,58.00495],[-7.23742,58.00122],[-7.23297,57.97018],[-7.31133,57.96702],[-7.31538,57.99525],[-7.24904,57.99792],[-7.28082,58.21856],[-7.07355,58.22687],[-7.0827,58.29018],[-6.80743,58.30119],[-6.82768,58.44074],[-6.50305,58.45366],[-6.51532,58.53792],[-6.16474,58.55184],[-6.10631,58.14894],[-6.33469,58.13976],[-6.27759,57.74145],[-6.96138,57.71366],[-6.93332,57.51615],[-7.10017,57.50933],[-7.05218,57.169],[-7.13111,57.16575],[-7.07492,56.76319]],[[0.41076,50.82087],[0.98102,50.80612],[0.99437,51.01173],[1.45062,50.99998],[1.47712,51.40552],[0.89619,51.42035],[0.88243,51.21039],[0.505,51.22007],[0.52273,51.49042],[-0.63397,51.51063],[-0.63671,51.44563],[-1.09951,51.45248],[-1.11485,51.04814],[-0.52987,51.0394],[-0.52751,51.10203],[0.42806,51.08778],[0.41076,50.82087]],[[-5.39457,51.9619],[-4.79581,51.98051],[-4.78873,51.89403],[-4.20265,51.91228],[-4.22941,52.23828],[-3.6552,52.25602],[-3.62228,51.85483],[-4.21342,51.8364],[-4.18551,51.49342],[-4.77661,51.47485],[-4.78476,51.57525],[-5.08799,51.56574],[-5.09422,51.64242],[-5.3678,51.63385],[-5.39457,51.9619]],[[-1.2389,54.03537],[-0.62779,54.02811],[-0.62004,54.25257],[-0.57268,54.25201],[-0.55865,54.65542],[-1.17998,54.66269],[-1.18782,54.43788],[-1.23221,54.4384],[-1.2389,54.03537]],[[-2.67227,50.97677],[-2.09961,50.98023],[-2.10572,51.37949],[-1.58877,51.38259],[-1.59499,51.78589],[-2.17563,51.78891],[-2.17154,51.38392],[-2.67846,51.38088],[-2.67227,50.97677]],[[-2.60155,53.27155],[-3.22973,53.2685],[-3.23522,53.67231],[-2.60704,53.67533],[-2.60155,53.27155]],[[-0.03942,51.7728],[-0.61563,51.77577],[-0.60465,52.58414],[-0.02843,52.58122],[-0.03942,51.7728]],[[-2.91529,54.03523],[-3.53229,54.02866],[-3.54484,54.43397],[-2.92785,54.44047],[-2.91529,54.03523]],[[-6.30583,57.19689],[-6.3539,57.60015],[-5.69111,57.62295],[-5.64305,57.21995],[-6.30583,57.19689]],[[1.17115,52.57236],[1.19865,52.97594],[1.79788,52.96106],[1.77037,52.55734],[1.17115,52.57236]],[[-2.40225,55.56317],[-2.40088,55.9657],[-1.76084,55.96501],[-1.76222,55.56248],[-2.40225,55.56317]],[[-6.32574,56.38537],[-7.0196,56.35747],[-7.07316,56.76384],[-6.3793,56.79145],[-6.32574,56.38537]],[[-2.42258,54.4431],[-2.42574,54.84188],[-1.79931,54.84354],[-1.79614,54.44477],[-2.42258,54.4431]],[[-3.02701,51.37935],[-3.60589,51.37017],[-3.62237,51.77304],[-3.04349,51.78215],[-3.02701,51.37935]],[[-3.05379,52.18979],[-3.06615,52.59374],[-2.48364,52.60034],[-2.47128,52.19646],[-3.05379,52.18979]],[[-5.67673,51.70425],[-5.67886,51.73101],[-5.4636,51.7376],[-5.46146,51.71084],[-5.67673,51.70425]],[[-5.84427,59.10882],[-5.8469,59.13578],[-5.79558,59.1371],[-5.79294,59.11014],[-5.84427,59.10882]],[[-8.64844,57.77861],[-8.66597,57.87717],[-8.46649,57.88721],[-8.44897,57.78867],[-8.64844,57.77861]],[[-4.52711,59.01532],[-4.52859,59.03319],[-4.47623,59.03434],[-4.47475,59.01646],[-4.52711,59.01532]],[[-7.68062,58.25838],[-7.68655,58.2938],[-7.53445,58.30084],[-7.52852,58.26542],[-7.68062,58.25838]],[[-6.19102,59.08009],[-6.19546,59.11586],[-6.12542,59.11815],[-6.12099,59.08238],[-6.19102,59.08009]],[[-4.42669,59.07112],[-4.42805,59.0887],[-4.37621,59.08976],[-4.37485,59.07218],[-4.42669,59.07112]]]},{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",zoomExtent:[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"},{id:"ACT2018",name:"ACTmapi Imagery 2018",type:"wms",template:"https://data.actmapi.act.gov.au/arcgis/services/actmapi/imagery2018mga/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:"2018-03-19T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",zoomExtent:[0,21],polygon:[[[149.2695,-35.4381],[149.2669,-35.348],[149.3329,-35.3468],[149.3334,-35.3648],[149.3774,-35.364],[149.3769,-35.3459],[149.3989,-35.3455],[149.3984,-35.3275],[149.4094,-35.3273],[149.4088,-35.3092],[149.3978,-35.3095],[149.3973,-35.2914],[149.3533,-35.2923],[149.3528,-35.2743],[149.3089,-35.2751],[149.3084,-35.2571],[149.2644,-35.2579],[149.2634,-35.2219],[149.2415,-35.2223],[149.241,-35.2043],[149.219,-35.2047],[149.218,-35.1687],[149.1961,-35.1691],[149.1956,-35.151],[149.1737,-35.1514],[149.1732,-35.1334],[149.1512,-35.1338],[149.1508,-35.1158],[149.085,-35.1169],[149.0854,-35.135],[149.0635,-35.1353],[149.0639,-35.1534],[149.0201,-35.1541],[149.0205,-35.1721],[148.9985,-35.1725],[148.999,-35.1905],[148.9331,-35.1916],[148.934,-35.2276],[148.912,-35.228],[148.9124,-35.246],[148.8685,-35.2467],[148.8689,-35.2647],[148.8469,-35.265],[148.8473,-35.2831],[148.8034,-35.2837],[148.8038,-35.3018],[148.7818,-35.3021],[148.7838,-35.3922],[148.8058,-35.3919],[148.8086,-35.5181],[148.7976,-35.5182],[148.7994,-35.5993],[148.8766,-35.5982],[148.8747,-35.517],[148.8527,-35.5174],[148.8508,-35.4363],[148.8398,-35.4364],[148.8388,-35.3914],[149.0039,-35.3888],[149.0048,-35.4248],[149.0268,-35.4244],[149.0277,-35.4605],[149.0497,-35.4601],[149.0511,-35.5142],[149.1613,-35.5122],[149.1594,-35.4402],[149.2695,-35.4381]]],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.98494,50.70723],[5.98494,50.7672],[5.91079,50.82275],[5.75561,50.83533],[5.75423,50.86264],[5.8332,50.93323],[5.85517,51.02661],[5.90941,51.07754],[5.91216,51.18225],[5.87851,51.20807],[5.77414,51.23689],[5.68419,51.24075],[5.62308,51.26998],[5.62308,51.29789],[5.54,51.34724],[5.4473,51.34853],[5.39855,51.32107],[5.31203,51.32322],[5.26671,51.36182],[5.19942,51.37254],[5.18294,51.39611],[5.15891,51.4924],[5.08338,51.53086],[5.03257,51.53983],[4.95566,51.50522],[4.90142,51.50565],[4.83825,51.54367],[4.77096,51.55862],[4.7119,51.54709],[4.64049,51.49667],[4.6144,51.4971],[4.56565,51.53171],[4.48256,51.53043],[4.42626,51.52189],[4.3006,51.46974],[4.29511,51.42566],[4.18113,51.42437],[4.13718,51.39525],[4.13856,51.35067],[4.05204,51.30047],[3.93325,51.27298],[3.86527,51.27084],[3.86321,51.29016],[3.76296,51.32407],[3.59336,51.35925],[3.47732,51.33137],[3.42582,51.39739],[3.23562,51.35153],[3.226,51.36568],[3.17794,51.36182],[3.16009,51.33223],[3.06258,51.30219],[2.75084,51.1702],[2.47001,51.07452],[2.49267,50.99378],[2.53112,50.95573],[2.50915,50.91159],[2.53043,50.82145],[2.5991,50.76416],[2.66501,50.76459],[2.77007,50.66677],[2.8971,50.65894],[2.99186,50.72549],[3.11339,50.72636],[3.23699,50.70592],[3.36265,50.6585],[3.47114,50.70201],[3.63936,50.66721],[3.69842,50.68156],[3.72794,50.71245],[3.81858,50.68418],[3.87488,50.64152],[4.09255,50.64283],[4.15023,50.66329],[4.20653,50.64413],[4.31365,50.64283],[4.45235,50.68766],[4.53475,50.67808],[4.61303,50.69549],[4.67689,50.69592],[4.72701,50.73201],[4.78057,50.73201],[4.79979,50.71288],[4.86228,50.71288],[4.88563,50.69549],[4.96116,50.69549],[5.03119,50.65763],[5.10741,50.65023],[5.2008,50.64892],[5.23581,50.66546],[5.32508,50.6659],[5.36696,50.682],[5.42121,50.66416],[5.52215,50.6746],[5.6224,50.72418],[5.67527,50.69853],[5.73981,50.69723],[5.77277,50.67199],[5.8126,50.66024],[5.90804,50.65981],[5.98494,50.70723]]],terms_text:"Orthophoto Flanders © AGIV",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIVFlandersGRB",name:"AGIV Flanders GRB",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}",zoomExtent:[0,21],polygon:[[[4.40434,50.78177],[4.45538,50.79328],[4.40268,50.8961],[4.331,50.90094],[4.27142,50.82002],[4.30648,50.81244],[4.36348,50.77251],[4.40434,50.78177],[4.43104,50.73831],[4.31859,50.72022],[4.29031,50.69402],[4.14853,50.72834],[3.95877,50.68947],[3.9097,50.69245],[3.89113,50.74333],[3.77568,50.74789],[3.75857,50.78045],[3.67752,50.77062],[3.64047,50.72242],[3.54139,50.73377],[3.54062,50.76307],[3.46005,50.76556],[3.3522,50.70614],[3.30562,50.75466],[3.17839,50.75609],[3.15329,50.78564],[3.02008,50.77312],[2.99943,50.81035],[2.91648,50.75356],[2.85476,50.75745],[2.86521,50.70565],[2.78473,50.7369],[2.713,50.81534],[2.63518,50.8129],[2.59909,50.85306],[2.59031,50.91893],[2.63262,50.94575],[2.57372,51.00842],[2.54165,51.09345],[3.15582,51.32714],[3.18307,51.37128],[3.23443,51.34669],[3.36356,51.37228],[3.38101,51.27446],[3.44201,51.24313],[3.52759,51.24604],[3.51511,51.28753],[3.58984,51.30577],[3.7783,51.26235],[3.79088,51.21429],[3.92412,51.21938],[4.16613,51.2929],[4.26163,51.37647],[4.42065,51.36473],[4.39108,51.45149],[4.54747,51.48571],[4.53541,51.42303],[4.64953,51.42758],[4.76359,51.5088],[4.84188,51.48074],[4.8383,51.42174],[4.89366,51.41698],[4.92785,51.39544],[5.02894,51.48789],[5.08018,51.46948],[5.10202,51.42892],[5.07117,51.3935],[5.13109,51.35137],[5.13448,51.31547],[5.20031,51.32172],[5.24189,51.30534],[5.23036,51.26436],[5.34828,51.27492],[5.41741,51.26229],[5.4863,51.30197],[5.5556,51.26986],[5.56045,51.22233],[5.76027,51.18505],[5.85578,51.14463],[5.75909,51.03588],[5.72665,50.91307],[5.64522,50.8372],[5.68732,50.804],[5.47863,50.72352],[5.41196,50.72368],[5.38908,50.74775],[5.30912,50.71802],[5.16984,50.72257],[5.16508,50.6957],[5.05642,50.71567],[5.00339,50.76594],[4.92545,50.74275],[4.90869,50.76968],[4.83106,50.77028],[4.76014,50.80544],[4.64309,50.79755],[4.65486,50.7552],[4.62021,50.74348],[4.59727,50.76359],[4.52399,50.72724],[4.49455,50.75679],[4.43104,50.73831],[4.40434,50.78177]],[[5.67393,50.75373],[5.88438,50.70114],[5.94172,50.76524],[5.76662,50.78761],[5.67393,50.75373]],[[4.91171,51.43492],[4.93711,51.42614],[4.95891,51.45471],[4.92801,51.46049],[4.91171,51.43492]]],terms_text:"GRB Flanders © AGIV",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{id:"AGIV",name:"AGIV Flanders most recent aerial imagery",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}",zoomExtent:[0,21],polygon:[[[4.7737,50.79368],[4.8379,50.75916],[4.92511,50.73483],[4.98862,50.76264],[5.036,50.73527],[5.0645,50.69875],[5.1644,50.69005],[5.19393,50.71179],[5.3086,50.71245],[5.36422,50.74396],[5.43391,50.70766],[5.54378,50.74396],[5.61141,50.73527],[5.71166,50.73505],[5.77105,50.74092],[5.81946,50.70484],[5.89568,50.70614],[5.9204,50.72831],[5.91971,50.74504],[5.89843,50.77675],[5.81569,50.76351],[5.77517,50.79216],[5.69552,50.79737],[5.69072,50.82319],[5.66325,50.82904],[5.65467,50.86481],[5.72368,50.9012],[5.77174,50.95443],[5.75114,50.97368],[5.78273,51.00048],[5.78032,51.0523],[5.80848,51.05338],[5.80951,51.07668],[5.84315,51.09372],[5.84418,51.1101],[5.82599,51.11851],[5.86959,51.14953],[5.8277,51.17365],[5.792,51.16891],[5.7738,51.19344],[5.666,51.1928],[5.64059,51.21065],[5.5709,51.22829],[5.56231,51.27535],[5.49811,51.30605],[5.47099,51.30219],[5.45794,51.2893],[5.43048,51.28823],[5.41434,51.27363],[5.36593,51.282],[5.33641,51.28265],[5.32577,51.26718],[5.24337,51.27406],[5.24989,51.31335],[5.20972,51.32794],[5.14174,51.31914],[5.14209,51.35367],[5.08647,51.39482],[5.11565,51.43615],[5.08853,51.47508],[5.05214,51.47636],[5.04561,51.4939],[5.02364,51.4939],[5.01609,51.48663],[4.82966,51.48663],[4.83001,51.50009],[4.76855,51.51099],[4.74727,51.50394],[4.658,51.4492],[4.65663,51.43144],[4.53956,51.43379],[4.55466,51.48171],[4.5296,51.48748],[4.46368,51.48235],[4.37167,51.45562],[4.37751,51.40553],[4.4139,51.37511],[4.39776,51.36118],[4.34798,51.36675],[4.34627,51.38497],[4.20344,51.38111],[4.2213,51.3511],[4.15641,51.29832],[4.05101,51.25193],[4.00638,51.25279],[3.95144,51.22205],[3.88484,51.22936],[3.81926,51.21797],[3.80038,51.22872],[3.80107,51.26074],[3.74442,51.28007],[3.63593,51.29746],[3.58615,51.31378],[3.5065,51.28308],[3.51371,51.25021],[3.43921,51.25064],[3.39766,51.27513],[3.37329,51.31678],[3.39114,51.34274],[3.3623,51.37961],[3.24283,51.35474],[3.20266,51.37039],[3.15631,51.35196],[3.14223,51.33051],[2.53318,51.09092],[2.56476,50.9968],[2.61832,50.9527],[2.57781,50.91852],[2.5936,50.88431],[2.58948,50.85051],[2.6245,50.80757],[2.71033,50.8054],[2.78449,50.71853],[2.87375,50.69983],[2.86483,50.74765],[2.92525,50.75156],[2.97263,50.77024],[2.97332,50.79889],[3.00078,50.79759],[3.01383,50.76676],[3.09863,50.76611],[3.13537,50.78196],[3.16832,50.75004],[3.30428,50.74613],[3.31561,50.71484],[3.3678,50.70179],[3.44848,50.75091],[3.53293,50.75156],[3.53328,50.72549],[3.63902,50.7131],[3.69086,50.7672],[3.75163,50.76177],[3.7712,50.73874],[3.87729,50.73983],[3.87969,50.70418],[3.9202,50.68352],[3.99951,50.682],[4.06749,50.68961],[4.16018,50.72049],[4.17632,50.70331],[4.24739,50.68222],[4.31708,50.69418],[4.31846,50.70962],[4.38403,50.71027],[4.38437,50.72353],[4.47226,50.74743],[4.52617,50.71853],[4.55226,50.73766],[4.64908,50.73722],[4.6532,50.78717],[4.72426,50.78218],[4.73731,50.79585],[4.7737,50.79368]]],terms_text:"Orthophoto Flanders most recent © AGIV",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/BE_GRB_Flanders_TMS.png"},{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",endDate:"2011-01-01T00:00:00.000Z",startDate:"2006-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[112.28778,-28.78459],[112.71488,-31.13894],[114.11263,-34.17829],[113.60788,-37.39012],[117.17992,-37.45179],[119.31538,-37.42096],[121.72262,-36.70839],[123.81925,-35.76893],[125.9547,-34.3066],[127.97368,-33.7274],[130.07031,-33.24166],[130.10913,-33.8887],[131.00214,-34.04971],[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.36829],[142.3783,-40.64702],[142.49478,-42.07487],[144.009,-44.06013],[147.23161,-44.03222],[149.05645,-42.53431],[149.52237,-40.99959],[149.9494,-40.85292],[150.8036,-38.09627],[151.81313,-38.12682],[156.20052,-22.66771],[156.20052,-20.10109],[156.62761,-17.41763],[155.26869,-17.19521],[154.14272,-19.51662],[153.5215,-18.34139],[153.05558,-16.5636],[152.78379,-15.25677],[152.27905,-13.4135],[151.3472,-12.39177],[149.48354,-12.05024],[146.9598,-9.99241],[135.9719,-9.99241],[130.3032,-10.33636],[128.09016,-12.16414],[125.91588,-12.31591],[124.3239,-11.86033],[122.03323,-11.97429],[118.26706,-16.9353],[115.93747,-19.11357],[114.0738,-21.11863],[113.49141,-22.59603],[112.28778,-28.78459]]],terms_url:"https://data.gov.au/dataset/agri-the-australian-geographic-reference-image",terms_text:"AGRI, Geoscience Australia"},{id:"alagoas_litoral",name:"Alagoas Litoral 2006",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.52384,-9.48089],[-35.5236,-9.44515],[-35.51572,-9.44518],[-35.51584,-9.44229],[-35.50542,-9.44238],[-35.50518,-9.43064],[-35.49334,-9.43073],[-35.49304,-9.3982],[-35.4893,-9.39817],[-35.48921,-9.38628],[-35.4854,-9.38634],[-35.48525,-9.37809],[-35.48127,-9.37812],[-35.48114,-9.36987],[-35.47698,-9.36996],[-35.47686,-9.36385],[-35.47459,-9.36388],[-35.47447,-9.36153],[-35.47212,-9.36141],[-35.47206,-9.35917],[-35.46976,-9.3592],[-35.46967,-9.35682],[-35.46653,-9.35676],[-35.46641,-9.35289],[-35.46387,-9.35277],[-35.46387,-9.35119],[-35.44135,-9.35131],[-35.44125,-9.34541],[-35.43177,-9.34538],[-35.43171,-9.33602],[-35.39463,-9.33632],[-35.39442,-9.30125],[-35.38165,-9.30143],[-35.38147,-9.28638],[-35.37799,-9.28626],[-35.37796,-9.2811],[-35.36942,-9.28122],[-35.36921,-9.27261],[-35.35966,-9.27276],[-35.35969,-9.26465],[-35.35051,-9.26474],[-35.35036,-9.25562],[-35.34115,-9.25565],[-35.34118,-9.24501],[-35.31775,-9.24519],[-35.3176,-9.22567],[-35.30292,-9.22579],[-35.30283,-9.2113],[-35.30794,-9.21136],[-35.30785,-9.19979],[-35.29103,-9.19988],[-35.29091,-9.1966],[-35.29018,-9.19669],[-35.28997,-9.16516],[-35.27759,-9.16522],[-35.2775,-9.16417],[-35.27541,-9.1642],[-35.27535,-9.16152],[-35.27375,-9.16149],[-35.27366,-9.15839],[-35.27182,-9.15842],[-35.27185,-9.15729],[-35.27149,-9.15729],[-35.27143,-9.15469],[-35.26965,-9.15463],[-35.26959,-9.15362],[-35.26919,-9.15362],[-35.26907,-9.13159],[-35.26403,-9.13165],[-35.264,-9.12318],[-35.26056,-9.12321],[-35.26053,-9.11781],[-35.256,-9.11784],[-35.25573,-9.08946],[-35.25114,-9.08955],[-35.25108,-9.08651],[-35.25026,-9.08648],[-35.25029,-9.08475],[-35.24449,-9.08478],[-35.24449,-9.07989],[-35.24093,-9.07997],[-35.24081,-9.07312],[-35.23734,-9.07312],[-35.23719,-9.06322],[-35.23655,-9.06322],[-35.23652,-9.04655],[-35.23323,-9.04652],[-35.23332,-9.04345],[-35.2306,-9.04348],[-35.2306,-9.04014],[-35.22897,-9.04008],[-35.229,-9.03835],[-35.22505,-9.03826],[-35.22502,-9.03167],[-35.2223,-9.03161],[-35.22233,-9.02012],[-35.21834,-9.02009],[-35.21831,-9.01341],[-35.21671,-9.01341],[-35.21668,-9.00998],[-35.21176,-9.00998],[-35.21173,-9.00647],[-35.20971,-9.00653],[-35.20974,-9.00438],[-35.20765,-9.00432],[-35.20768,-9.00226],[-35.20566,-9.00226],[-35.20563,-8.99987],[-35.20391,-8.99987],[-35.20394,-8.99785],[-35.20213,-8.99791],[-35.20213,-8.99579],[-35.19844,-8.99582],[-35.19844,-8.99361],[-35.19434,-8.99361],[-35.19428,-8.99122],[-35.19065,-8.99131],[-35.19062,-8.98833],[-35.18766,-8.98842],[-35.18763,-8.98544],[-35.18473,-8.98541],[-35.18467,-8.98255],[-35.18238,-8.98252],[-35.18235,-8.98052],[-35.17951,-8.98061],[-35.17948,-8.97742],[-35.17809,-8.97745],[-35.17803,-8.97306],[-35.17558,-8.97303],[-35.17549,-8.96912],[-35.17293,-8.96909],[-35.17284,-8.96292],[-35.17063,-8.96289],[-35.17048,-8.95579],[-35.16852,-8.95564],[-35.16852,-8.94806],[-35.16794,-8.948],[-35.16791,-8.93995],[-35.16245,-8.93995],[-35.16242,-8.92978],[-35.1587,-8.92981],[-35.15873,-8.92662],[-35.15547,-8.92668],[-35.1555,-8.92378],[-35.15348,-8.92381],[-35.15339,-8.92065],[-35.15131,-8.92062],[-35.15122,-8.91194],[-35.15263,-8.91194],[-35.15263,-8.90821],[-35.15439,-8.90824],[-35.1543,-8.90215],[-35.15593,-8.90212],[-35.15593,-8.90051],[-35.15768,-8.90048],[-35.15774,-8.89905],[-35.15958,-8.89908],[-35.15955,-8.89747],[-35.16139,-8.8975],[-35.16133,-8.89625],[-35.16363,-8.89625],[-35.1636,-8.89526],[-35.16553,-8.89526],[-35.1655,-8.89315],[-35.16794,-8.89315],[-35.16791,-8.89147],[-35.17024,-8.89153],[-35.17027,-8.8904],[-35.17302,-8.89043],[-35.17302,-8.88876],[-35.17791,-8.88876],[-35.17794,-8.88795],[-35.17894,-8.88792],[-35.17894,-8.88891],[-35.17966,-8.88894],[-35.17978,-8.88858],[-35.18099,-8.88861],[-35.18099,-8.88816],[-35.18519,-8.88816],[-35.18519,-8.88897],[-35.18591,-8.889],[-35.18591,-8.88971],[-35.18932,-8.88971],[-35.18947,-8.8893],[-35.19014,-8.88927],[-35.19017,-8.88831],[-35.19071,-8.88831],[-35.19077,-8.88789],[-35.19153,-8.88792],[-35.19156,-8.88619],[-35.19754,-8.88607],[-35.19757,-8.8873],[-35.19968,-8.8873],[-35.19974,-8.88777],[-35.2008,-8.88777],[-35.2008,-8.88822],[-35.2033,-8.88822],[-35.20337,-8.8887],[-35.20563,-8.88861],[-35.20557,-8.88983],[-35.20741,-8.8898],[-35.20744,-8.89022],[-35.21125,-8.89025],[-35.21128,-8.88769],[-35.21245,-8.88777],[-35.21248,-8.88861],[-35.21623,-8.88858],[-35.21623,-8.88748],[-35.21871,-8.88745],[-35.21871,-8.88897],[-35.22136,-8.88897],[-35.22263,-8.88792],[-35.22402,-8.88748],[-35.22453,-8.88763],[-35.22644,-8.88718],[-35.22707,-8.88598],[-35.23311,-8.88446],[-35.23933,-8.88339],[-35.24129,-8.88416],[-35.25011,-8.88515],[-35.25624,-8.88506],[-35.26168,-8.88294],[-35.26161,-8.88094],[-35.26406,-8.88109],[-35.26877,-8.8793],[-35.27421,-8.87748],[-35.2781,-8.87518],[-35.28499,-8.87507],[-35.28502,-8.87581],[-35.2881,-8.87578],[-35.29405,-8.87545],[-35.30782,-8.87208],[-35.31757,-8.86961],[-35.32784,-8.86716],[-35.33206,-8.86614],[-35.34103,-8.86376],[-35.3471,-8.86244],[-35.3522,-8.86113],[-35.35257,-8.86391],[-35.34903,-8.86611],[-35.34496,-8.87205],[-35.34327,-8.87489],[-35.34318,-8.87569],[-35.34381,-8.87668],[-35.34481,-8.8768],[-35.34888,-8.87721],[-35.35042,-8.87781],[-35.35254,-8.87891],[-35.35399,-8.88011],[-35.35577,-8.88252],[-35.35755,-8.88396],[-35.36036,-8.88512],[-35.36114,-8.88509],[-35.3612,-8.88587],[-35.36175,-8.8859],[-35.36178,-8.88777],[-35.36253,-8.88783],[-35.36247,-8.891],[-35.36311,-8.89112],[-35.36311,-8.89482],[-35.3644,-8.89488],[-35.36507,-8.8967],[-35.36637,-8.90022],[-35.36754,-8.90427],[-35.36794,-8.90782],[-35.36863,-8.90917],[-35.37207,-8.91155],[-35.3741,-8.91349],[-35.37277,-8.916],[-35.37262,-8.91817],[-35.37084,-8.92229],[-35.37062,-8.92486],[-35.37235,-8.93038],[-35.37153,-8.93193],[-35.37153,-8.93363],[-35.37171,-8.93387],[-35.37171,-8.94362],[-35.36818,-8.94377],[-35.36815,-8.94505],[-35.36927,-8.94511],[-35.36921,-8.94863],[-35.37078,-8.94872],[-35.37081,-8.95182],[-35.37219,-8.95176],[-35.37222,-8.95528],[-35.37319,-8.95531],[-35.37313,-8.95737],[-35.3744,-8.95737],[-35.37446,-8.96012],[-35.37567,-8.96018],[-35.3757,-8.96205],[-35.37688,-8.96208],[-35.37694,-8.96444],[-35.37781,-8.96444],[-35.37775,-8.96617],[-35.38074,-8.96617],[-35.38074,-8.96331],[-35.38288,-8.96328],[-35.38291,-8.95982],[-35.38542,-8.95985],[-35.38542,-8.95722],[-35.38723,-8.95722],[-35.3872,-8.95406],[-35.38947,-8.95409],[-35.38947,-8.95084],[-35.39158,-8.95087],[-35.39158,-8.94792],[-35.39587,-8.94792],[-35.39581,-8.94651],[-35.3972,-8.94654],[-35.39711,-8.94472],[-35.39838,-8.94469],[-35.39838,-8.93915],[-35.40107,-8.93915],[-35.40106,-8.93895],[-35.40167,-8.93894],[-35.40173,-8.93688],[-35.40236,-8.93688],[-35.40236,-8.93628],[-35.40324,-8.9364],[-35.4033,-8.93583],[-35.40426,-8.9358],[-35.4042,-8.93363],[-35.40574,-8.9336],[-35.40577,-8.93124],[-35.4081,-8.93133],[-35.40804,-8.92927],[-35.40937,-8.9293],[-35.40928,-8.92739],[-35.41085,-8.92742],[-35.41085,-8.92542],[-35.41239,-8.92545],[-35.41236,-8.9239],[-35.41335,-8.92387],[-35.41329,-8.92193],[-35.41523,-8.92196],[-35.41523,-8.91999],[-35.41655,-8.92002],[-35.41655,-8.91755],[-35.4196,-8.91755],[-35.41966,-8.91964],[-35.42184,-8.91964],[-35.42187,-8.92265],[-35.42389,-8.92268],[-35.42392,-8.92513],[-35.42537,-8.92513],[-35.42537,-8.92766],[-35.42724,-8.92766],[-35.42727,-8.92987],[-35.42815,-8.92984],[-35.42818,-8.9316],[-35.42987,-8.93154],[-35.4299,-8.93407],[-35.43141,-8.93407],[-35.43141,-8.9356],[-35.43226,-8.93557],[-35.43229,-8.93586],[-35.4334,-8.93583],[-35.4334,-8.94001],[-35.43434,-8.94004],[-35.43434,-8.94097],[-35.43531,-8.94097],[-35.43534,-8.94261],[-35.43567,-8.94264],[-35.4357,-8.94329],[-35.43627,-8.94332],[-35.43624,-8.94422],[-35.4373,-8.94422],[-35.43727,-8.9452],[-35.43823,-8.9452],[-35.43827,-8.94684],[-35.43902,-8.94687],[-35.43902,-8.94798],[-35.44026,-8.94798],[-35.44032,-8.94953],[-35.44159,-8.94956],[-35.44165,-8.95152],[-35.44273,-8.95152],[-35.44273,-8.95334],[-35.44436,-8.95334],[-35.44436,-8.95498],[-35.44569,-8.95501],[-35.44563,-8.95674],[-35.4472,-8.9568],[-35.44717,-8.95865],[-35.44895,-8.95871],[-35.44892,-8.96],[-35.45101,-8.95994],[-35.45098,-8.96101],[-35.45469,-8.96095],[-35.45466,-8.96235],[-35.46049,-8.96235],[-35.46055,-8.96557],[-35.46653,-8.96548],[-35.46659,-8.96885],[-35.46771,-8.96883],[-35.46774,-8.97053],[-35.4739,-8.97053],[-35.47399,-8.9753],[-35.47791,-8.97521],[-35.47797,-8.97816],[-35.4841,-8.97813],[-35.48416,-8.98201],[-35.49084,-8.98195],[-35.49084,-8.98562],[-35.49721,-8.98562],[-35.49721,-8.99069],[-35.50225,-8.99057],[-35.50234,-8.99567],[-35.50648,-8.99567],[-35.50651,-8.99856],[-35.51204,-8.9985],[-35.51207,-9.00163],[-35.51663,-9.00166],[-35.51666,-9.00617],[-35.52119,-9.00614],[-35.52122,-9.00739],[-35.53127,-9.00733],[-35.53127,-9.01064],[-35.54818,-9.01049],[-35.54818,-9.01359],[-35.56968,-9.01344],[-35.56974,-9.01738],[-35.58575,-9.01732],[-35.58578,-9.01995],[-35.60957,-9.01983],[-35.60954,-9.02302],[-35.62911,-9.02287],[-35.62905,-9.02508],[-35.65221,-9.0249],[-35.65224,-9.02758],[-35.67552,-9.0274],[-35.67555,-9.03056],[-35.68295,-9.03056],[-35.68298,-9.03435],[-35.69128,-9.03432],[-35.69128,-9.03766],[-35.6995,-9.0376],[-35.6995,-9.04034],[-35.70668,-9.04031],[-35.70671,-9.04518],[-35.71115,-9.04518],[-35.71133,-9.06691],[-35.70871,-9.06691],[-35.70877,-9.07869],[-35.70656,-9.07872],[-35.70656,-9.08653],[-35.7043,-9.08653],[-35.70433,-9.09104],[-35.69992,-9.09107],[-35.69989,-9.0956],[-35.69536,-9.09557],[-35.69542,-9.10001],[-35.69092,-9.10013],[-35.69101,-9.10207],[-35.63367,-9.10246],[-35.6337,-9.10541],[-35.62585,-9.10553],[-35.62591,-9.10964],[-35.62231,-9.10964],[-35.62234,-9.11203],[-35.6199,-9.112],[-35.6199,-9.11501],[-35.61473,-9.11507],[-35.61473,-9.11707],[-35.61177,-9.11701],[-35.61181,-9.1182],[-35.6096,-9.11826],[-35.60963,-9.12571],[-35.59976,-9.12583],[-35.59979,-9.12923],[-35.59634,-9.12926],[-35.5964,-9.13502],[-35.59197,-9.13507],[-35.59209,-9.149],[-35.59018,-9.14897],[-35.59015,-9.15108],[-35.6016,-9.15105],[-35.60154,-9.14912],[-35.60552,-9.14912],[-35.60549,-9.14557],[-35.61184,-9.14554],[-35.61184,-9.14235],[-35.6176,-9.14238],[-35.61757,-9.13853],[-35.624,-9.13853],[-35.62397,-9.13466],[-35.63177,-9.13466],[-35.63164,-9.13063],[-35.63922,-9.1306],[-35.63919,-9.12878],[-35.66386,-9.12869],[-35.6638,-9.1261],[-35.71278,-9.12577],[-35.71275,-9.12407],[-35.72426,-9.12401],[-35.71964,-9.15323],[-35.72112,-9.1532],[-35.72124,-9.17258],[-35.72066,-9.17255],[-35.72082,-9.18558],[-35.71212,-9.18566],[-35.7133,-9.34416],[-35.69041,-9.34433],[-35.69065,-9.37189],[-35.68899,-9.37189],[-35.68902,-9.37598],[-35.68757,-9.37598],[-35.68766,-9.38232],[-35.68497,-9.38235],[-35.68503,-9.39093],[-35.68168,-9.39099],[-35.68177,-9.39936],[-35.67715,-9.39933],[-35.67724,-9.4089],[-35.67292,-9.40893],[-35.67301,-9.41754],[-35.66972,-9.4176],[-35.66978,-9.42498],[-35.66722,-9.42498],[-35.66728,-9.4327],[-35.66075,-9.43288],[-35.66075,-9.43705],[-35.6513,-9.43708],[-35.65142,-9.44211],[-35.64514,-9.44217],[-35.64523,-9.44652],[-35.63645,-9.44661],[-35.63645,-9.44992],[-35.62711,-9.45],[-35.62727,-9.46505],[-35.62086,-9.46511],[-35.62092,-9.4722],[-35.60939,-9.47222],[-35.60939,-9.47529],[-35.59674,-9.47535],[-35.59674,-9.47351],[-35.57844,-9.47371],[-35.57847,-9.47595],[-35.57267,-9.47604],[-35.5727,-9.48042],[-35.56823,-9.48048],[-35.56826,-9.48881],[-35.54169,-9.48893],[-35.54163,-9.48071],[-35.52384,-9.48089]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"arapiraca_al",name:"Arapiraca AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.60875,-9.83072],[-36.60784,-9.74047],[-36.61718,-9.74051],[-36.61631,-9.65075],[-36.70737,-9.64977],[-36.70832,-9.74043],[-36.69898,-9.74047],[-36.69997,-9.82968],[-36.60875,-9.83072]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[0,21],polygon:[[[2.94012,44.63388],[2.99719,44.63393],[2.99717,44.64734],[3.01597,44.64735],[3.01593,44.67412],[3.03495,44.67413],[3.0349,44.70152],[3.05363,44.70154],[3.05357,44.7419],[3.07233,44.74191],[3.07222,44.80917],[3.09216,44.80919],[3.09214,44.82213],[3.13014,44.82216],[3.13005,44.87707],[3.14856,44.87709],[3.14858,44.8637],[3.16823,44.86371],[3.16825,44.85003],[3.2064,44.85006],[3.20638,44.86284],[3.24395,44.86287],[3.24393,44.87679],[3.26315,44.87681],[3.26308,44.91752],[3.32004,44.91757],[3.32002,44.93033],[3.33908,44.93035],[3.33906,44.9442],[3.377,44.94423],[3.37702,44.93029],[3.39603,44.9303],[3.39612,44.87627],[3.41483,44.87629],[3.41489,44.83553],[3.43334,44.83554],[3.43338,44.80828],[3.45255,44.80829],[3.45258,44.79463],[3.50893,44.79468],[3.5089,44.80815],[3.60426,44.80823],[3.60422,44.83482],[3.62361,44.83484],[3.62357,44.86166],[3.64248,44.86167],[3.64255,44.8211],[3.66101,44.82112],[3.66103,44.80777],[3.6993,44.8078],[3.69928,44.82099],[3.73611,44.82102],[3.73618,44.77971],[3.77511,44.77974],[3.77515,44.75223],[3.81184,44.75226],[3.81186,44.7392],[3.83118,44.73922],[3.83121,44.72468],[3.88782,44.72472],[3.8878,44.73818],[3.92563,44.73821],[3.9256,44.75167],[3.94541,44.75168],[3.94537,44.77847],[3.96437,44.77848],[3.96435,44.79193],[4.00332,44.79196],[4.0033,44.80526],[4.02169,44.80527],[4.02167,44.81857],[4.05965,44.8186],[4.05961,44.84492],[4.07981,44.84494],[4.07979,44.85735],[4.17388,44.85743],[4.17386,44.87055],[4.19326,44.87056],[4.19323,44.88427],[4.21404,44.88429],[4.214,44.91002],[4.23241,44.91004],[4.23237,44.93731],[4.27155,44.93734],[4.27153,44.9503],[4.32887,44.95034],[4.32878,45.00367],[4.34893,45.00368],[4.3489,45.01707],[4.40608,45.01711],[4.40599,45.071],[4.38847,45.07099],[4.38845,45.0846],[4.40794,45.08461],[4.40792,45.09663],[4.48436,45.09669],[4.48429,45.13705],[4.46636,45.13703],[4.46634,45.1502],[4.48645,45.15022],[4.4864,45.17724],[4.50655,45.17726],[4.50644,45.24501],[4.48813,45.24499],[4.48811,45.25921],[4.46986,45.25919],[4.46984,45.27298],[4.45088,45.27297],[4.45086,45.28642],[4.39368,45.28637],[4.39363,45.31352],[4.37509,45.3135],[4.37507,45.32741],[4.39507,45.32742],[4.39503,45.35458],[4.37679,45.35457],[4.37676,45.36855],[4.35766,45.36853],[4.35763,45.38234],[4.28146,45.38227],[4.28143,45.39688],[4.24446,45.39685],[4.24443,45.41079],[4.14812,45.41071],[4.14814,45.39807],[4.12919,45.39805],[4.12921,45.38409],[4.09021,45.38406],[4.09024,45.37121],[4.01355,45.37115],[4.01353,45.3861],[3.91709,45.38602],[3.91707,45.39974],[3.93757,45.39975],[3.93755,45.41311],[3.97528,45.41315],[3.97526,45.42621],[3.99537,45.42622],[3.9957,45.52096],[3.97778,45.52094],[3.97769,45.57439],[3.95818,45.57437],[3.95815,45.58837],[3.9396,45.58835],[3.93958,45.60262],[3.92023,45.60261],[3.9202,45.61646],[3.88189,45.61643],[3.88185,45.64328],[3.84413,45.64325],[3.84411,45.65709],[3.82617,45.65707],[3.82612,45.68389],[3.80722,45.68387],[3.80713,45.73758],[3.78821,45.73756],[3.78819,45.7518],[3.76885,45.75178],[3.7688,45.77897],[3.75072,45.77895],[3.75058,45.86066],[3.76967,45.86067],[3.76958,45.91433],[3.75166,45.91432],[3.75164,45.92809],[3.7329,45.92807],[3.73285,45.95472],[3.81018,45.95478],[3.81016,45.96823],[3.8496,45.96826],[3.84951,46.02162],[3.83188,46.0216],[3.83179,46.07591],[3.8505,46.07592],[3.85046,46.10295],[3.83247,46.10294],[3.83234,46.18456],[3.81422,46.18455],[3.81415,46.22442],[3.83369,46.22444],[3.83366,46.2381],[3.85289,46.23812],[3.85287,46.25147],[3.89314,46.25151],[3.89312,46.26447],[3.91306,46.26448],[3.91303,46.27793],[3.95189,46.27796],[3.95187,46.29082],[3.97152,46.29084],[3.9715,46.30369],[4.0105,46.30373],[4.01048,46.31776],[4.02983,46.31778],[4.02978,46.34428],[4.0116,46.34427],[4.01146,46.42534],[4.03153,46.42536],[4.03146,46.4658],[4.01324,46.46578],[4.01322,46.47938],[3.99437,46.47936],[3.99435,46.49361],[3.9746,46.4936],[3.97457,46.50753],[3.87754,46.50745],[3.8775,46.53478],[3.85836,46.53476],[3.85833,46.54832],[3.81869,46.54828],[3.81871,46.53553],[3.79924,46.53552],[3.79922,46.54907],[3.76104,46.54904],[3.76092,46.61681],[3.74233,46.61679],[3.74228,46.64396],[3.72286,46.64395],[3.72281,46.67104],[3.70387,46.67102],[3.70385,46.68467],[3.68411,46.68466],[3.68406,46.712],[3.66484,46.71198],[3.66479,46.73904],[3.64576,46.73902],[3.64572,46.76634],[3.62575,46.76632],[3.62573,46.77971],[3.56723,46.77966],[3.56725,46.76631],[3.54715,46.76629],[3.54719,46.73928],[3.52716,46.73927],[3.52723,46.6989],[3.48774,46.69887],[3.48776,46.68594],[3.46796,46.68593],[3.46794,46.69941],[3.46792,46.71279],[3.44865,46.71278],[3.44863,46.72679],[3.35043,46.72671],[3.35048,46.6999],[3.33039,46.69988],[3.33034,46.7272],[3.23272,46.72712],[3.23274,46.71351],[3.2129,46.7135],[3.21293,46.70013],[3.17354,46.7001],[3.1735,46.72751],[3.15412,46.72749],[3.1541,46.74073],[3.11478,46.7407],[3.11475,46.75428],[3.07534,46.75424],[3.0753,46.78135],[3.05597,46.78134],[3.05592,46.80831],[2.99704,46.80826],[2.99702,46.82196],[2.93794,46.82191],[2.93797,46.80826],[2.89866,46.80823],[2.89869,46.79424],[2.87899,46.79422],[2.87901,46.78104],[2.85942,46.78103],[2.85944,46.76771],[2.84004,46.76769],[2.84007,46.75447],[2.7414,46.75439],[2.74138,46.76682],[2.70234,46.76679],[2.70236,46.75389],[2.68266,46.75387],[2.68268,46.74048],[2.66349,46.74046],[2.66351,46.7259],[2.64342,46.72588],[2.64344,46.71309],[2.62414,46.71308],[2.62417,46.69981],[2.60397,46.69979],[2.60399,46.68584],[2.56512,46.68581],[2.56515,46.67261],[2.54593,46.6726],[2.546,46.63215],[2.56592,46.63217],[2.56595,46.61811],[2.54564,46.61809],[2.54569,46.59072],[2.56642,46.59074],[2.56644,46.57754],[2.5855,46.57756],[2.58552,46.56472],[2.56613,46.5647],[2.56616,46.55062],[2.46828,46.55055],[2.4683,46.53582],[2.33212,46.53571],[2.33217,46.50886],[2.31265,46.50884],[2.31267,46.49534],[2.29288,46.49533],[2.2929,46.48182],[2.27487,46.4818],[2.27492,46.45442],[2.25539,46.4544],[2.25553,46.37349],[2.27595,46.37351],[2.27604,46.32087],[2.31456,46.32091],[2.31458,46.30704],[2.35371,46.30707],[2.35373,46.29297],[2.39384,46.293],[2.39389,46.26729],[2.45157,46.26733],[2.4516,46.25349],[2.47094,46.25351],[2.47098,46.22656],[2.49151,46.22657],[2.49155,46.19933],[2.51088,46.19934],[2.51093,46.17278],[2.53117,46.1728],[2.53138,46.05135],[2.55163,46.05137],[2.55166,46.03777],[2.57056,46.03778],[2.57068,45.96994],[2.55144,45.96993],[2.55146,45.95662],[2.53226,45.9566],[2.53228,45.94301],[2.51307,45.94299],[2.51313,45.90203],[2.47494,45.902],[2.47496,45.88882],[2.43619,45.88879],[2.43622,45.87533],[2.41721,45.87531],[2.41725,45.84794],[2.37847,45.84791],[2.3785,45.83397],[2.35952,45.83396],[2.35956,45.80708],[2.37873,45.8071],[2.37875,45.79358],[2.3987,45.79359],[2.39872,45.78035],[2.41825,45.78036],[2.41832,45.74],[2.45722,45.74003],[2.45724,45.7267],[2.47589,45.72671],[2.47591,45.71324],[2.49533,45.71325],[2.49542,45.65913],[2.45769,45.6591],[2.45776,45.61834],[2.43912,45.61833],[2.43919,45.57766],[2.4585,45.57768],[2.45855,45.55053],[2.47809,45.55055],[2.47811,45.53725],[2.49755,45.53726],[2.49759,45.51068],[2.47855,45.51066],[2.47864,45.45613],[2.45978,45.45612],[2.45987,45.40176],[2.42249,45.40173],[2.42247,45.41528],[2.40232,45.41527],[2.40229,45.42882],[2.3256,45.42876],[2.32567,45.38796],[2.34562,45.38798],[2.34566,45.36111],[2.32626,45.36109],[2.32628,45.34721],[2.30738,45.3472],[2.3074,45.3336],[2.28811,45.33358],[2.28813,45.32082],[2.26963,45.3208],[2.26966,45.30621],[2.25066,45.3062],[2.25068,45.29251],[2.23169,45.2925],[2.23171,45.27924],[2.213,45.27922],[2.21305,45.25204],[2.19374,45.25202],[2.19376,45.23811],[2.17561,45.2381],[2.17574,45.15768],[2.15735,45.15767],[2.15744,45.10295],[2.12024,45.10292],[2.12026,45.08955],[2.10067,45.08953],[2.10069,45.07544],[2.08246,45.07543],[2.08255,45.0216],[2.10255,45.02161],[2.1026,44.99445],[2.04574,44.99441],[2.04585,44.92753],[2.06578,44.92755],[2.06589,44.85969],[2.0857,44.8597],[2.08572,44.84581],[2.10556,44.84583],[2.1056,44.81933],[2.12474,44.81934],[2.12477,44.80551],[2.14351,44.80553],[2.14355,44.7786],[2.12561,44.77858],[2.1257,44.72427],[2.10665,44.72426],[2.10671,44.68423],[2.12634,44.68424],[2.12636,44.67074],[2.14598,44.67075],[2.14607,44.61644],[2.18396,44.61648],[2.18398,44.60378],[2.24042,44.60383],[2.24037,44.63095],[2.25948,44.63097],[2.25946,44.64493],[2.31668,44.64498],[2.3167,44.63088],[2.33615,44.6309],[2.33617,44.61758],[2.37242,44.61761],[2.3724,44.63158],[2.41105,44.63161],[2.41107,44.61907],[2.44922,44.61911],[2.4492,44.63232],[2.50486,44.63237],[2.50481,44.65976],[2.52461,44.65977],[2.52457,44.68717],[2.54225,44.68719],[2.54223,44.70122],[2.58071,44.70125],[2.5806,44.76834],[2.61769,44.76837],[2.61762,44.80884],[2.63676,44.80885],[2.63669,44.84929],[2.67331,44.84933],[2.67329,44.86252],[2.69338,44.86253],[2.69333,44.88943],[2.73052,44.88946],[2.73048,44.91645],[2.74992,44.91646],[2.75005,44.83647],[2.80733,44.83652],[2.80731,44.8491],[2.82638,44.84912],[2.8264,44.83628],[2.8457,44.8363],[2.84577,44.79571],[2.86422,44.79573],[2.86426,44.76865],[2.88399,44.76866],[2.88403,44.74197],[2.90203,44.74198],[2.90214,44.67432],[2.92198,44.67434],[2.92202,44.6473],[2.9401,44.64731],[2.94012,44.63388]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/8cabc987-829c-4c9f-943b-6a0e255cd73",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",zoomExtent:[0,21],polygon:[[[2.49389,46.66829],[2.71362,46.84141],[3.64746,46.80758],[4.04846,46.48327],[4.03747,46.24825],[4.46044,46.25965],[4.4934,46.14559],[4.38354,46.09229],[4.45495,45.69084],[4.76257,45.57176],[4.81201,45.34443],[4.22424,44.84419],[3.86169,44.696],[3.37829,44.80523],[3.33435,44.89091],[3.18054,44.82471],[3.03222,44.60612],[2.92785,44.60221],[2.71911,44.85198],[2.51037,44.60221],[2.12585,44.58265],[2.005,44.97257],[2.30712,45.46784],[2.43347,45.44087],[2.41149,45.72919],[2.34558,45.82402],[2.54882,45.97979],[2.46093,46.22166],[2.21374,46.33935],[2.27828,46.53903],[2.54882,46.56642],[2.49389,46.66829]]],terms_url:"http://ids.craig.fr/geocat/srv/fre/catalog.search?node=srv#/metadata/e37c057b-5884-429b-8bec-5db0baef0ee",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",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,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",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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",zoomExtent:[0,19],polygon:[[[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]]],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-overlay",name:"basemap.at Beschriftungen (annotations)",type:"tms",template:"https://maps{switch:1,2,3,4}.wien.gv.at/basemap/bmapoverlay/normal/google3857/{zoom}/{y}/{x}.png",zoomExtent:[0,19],polygon:[[[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]]],terms_url:"https://basemap.at/",terms_text:"basemap.at",description:"Annotation overlay provided by basemap.at.",icon:"https://www.basemap.at/images/logo_basemap.jpg",overlay:true},{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",zoomExtent:[0,19],polygon:[[[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]]],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-80cm",name:"Bavaria (80 cm)",type:"wms",template:"https://geoservices.bayern.de/wms/v1/ogc_dop80_oa.cgi?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=by_dop80c&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.bayern.de/",terms_text:"Bayerische Vermessungsverwaltung",best:true},{id:"bavaria-DOP80",name:"Bavaria DOP 80cm",type:"tms",template:"https://mapproxy.osm.ch/tiles/BAYERNDOP80/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[7,18],polygon:[[[10.12359,50.56846],[10.14286,50.55078],[10.20281,50.55742],[10.25205,50.51796],[10.32698,50.49345],[10.41048,50.41848],[10.60317,50.33109],[10.62244,50.2271],[10.72521,50.21066],[10.72949,50.24765],[10.85153,50.24354],[10.71879,50.32015],[10.71236,50.36524],[10.85581,50.39664],[10.93717,50.39664],[10.99069,50.36661],[11.12772,50.36661],[11.1791,50.31332],[11.16197,50.29417],[11.24119,50.2928],[11.24975,50.37344],[11.24119,50.47982],[11.35895,50.5234],[11.43816,50.50979],[11.44244,50.48936],[11.42532,50.4771],[11.42532,50.44166],[11.48955,50.42257],[11.49169,50.39801],[11.51952,50.39801],[11.52594,50.37617],[11.59874,50.40347],[11.63727,50.38845],[11.79357,50.4212],[11.83639,50.39255],[11.92203,50.42802],[11.98626,50.38709],[11.98412,50.35705],[12.04835,50.33109],[12.09331,50.32972],[12.1297,50.29828],[12.14041,50.27228],[12.10615,50.25586],[12.11258,50.23532],[12.14897,50.23669],[12.19822,50.20107],[12.22391,50.16406],[12.20464,50.14348],[12.20678,50.10779],[12.24318,50.09955],[12.27743,50.07208],[12.49367,49.98543],[12.49796,49.94136],[12.55576,49.92206],[12.54934,49.86827],[12.48083,49.78817],[12.41018,49.75775],[12.46156,49.70655],[12.5472,49.68023],[12.58788,49.55261],[12.65425,49.53455],[12.66281,49.43302],[12.75274,49.41073],[12.7977,49.34661],[12.90475,49.35638],[12.99681,49.33685],[13.05462,49.27543],[13.13169,49.21952],[13.19164,49.14395],[13.2366,49.12153],[13.29655,49.12293],[13.37148,49.08088],[13.4143,49.02897],[13.4143,48.97981],[13.57916,48.96997],[13.63483,48.94326],[13.67765,48.88698],[13.73759,48.89261],[13.7847,48.83346],[13.84036,48.77423],[13.81681,48.70646],[13.84464,48.70081],[13.8425,48.60038],[13.76543,48.5423],[13.75258,48.50401],[13.67122,48.50543],[13.64339,48.54371],[13.45712,48.5508],[13.45712,48.41598],[13.40574,48.36053],[13.2837,48.27511],[13.09315,48.26941],[12.95827,48.19097],[12.87691,48.18526],[12.772,48.09382],[12.86407,48.01368],[12.89832,47.95492],[12.94543,47.95636],[12.99681,47.88461],[13.01394,47.83434],[12.93472,47.7322],[13.0589,47.72499],[13.11885,47.63851],[13.06532,47.56922],[13.05676,47.47379],[13.00323,47.45208],[12.76772,47.55044],[12.76986,47.63274],[12.73989,47.67312],[12.6671,47.67024],[12.57503,47.6212],[12.48083,47.61975],[12.41446,47.67024],[12.24318,47.67745],[12.2132,47.69186],[12.19179,47.68177],[12.2132,47.66591],[12.21106,47.60388],[12.17467,47.59521],[12.13827,47.60388],[11.89205,47.60388],[11.85137,47.57933],[11.63942,47.58222],[11.59445,47.54899],[11.59017,47.51285],[11.51738,47.49839],[11.4403,47.50417],[11.39534,47.47524],[11.42746,47.44484],[11.3461,47.44339],[11.27973,47.39559],[11.21336,47.38834],[11.24761,47.43181],[11.10203,47.39269],[10.965,47.38979],[10.97785,47.43615],[10.9179,47.47524],[10.8708,47.47524],[10.85581,47.49405],[10.90077,47.5143],[10.87294,47.53598],[10.81085,47.51285],[10.64385,47.54899],[10.59461,47.55477],[10.57962,47.52876],[10.46187,47.54032],[10.46615,47.48392],[10.48756,47.47813],[10.48756,47.41298],[10.45973,47.40283],[10.45973,47.37529],[10.41048,47.37384],[10.40834,47.34339],[10.32056,47.28678],[10.28202,47.27806],[10.28416,47.26208],[10.14714,47.26208],[10.1921,47.30275],[10.19424,47.37384],[10.16641,47.37384],[10.16641,47.34629],[10.10004,47.34339],[10.0615,47.36369],[10.06792,47.41877],[10.09361,47.42601],[10.09576,47.44194],[9.978,47.48537],[9.95659,47.52731],[9.8945,47.52876],[9.85596,47.50851],[9.81743,47.54465],[9.82171,47.57644],[9.77461,47.58222],[9.73821,47.52586],[9.67398,47.53454],[9.58406,47.56488],[9.63972,47.60532],[9.7168,47.60388],[9.85596,47.676],[9.978,47.65582],[10.02938,47.68177],[10.10004,47.66735],[10.13215,47.676],[10.14286,47.70195],[10.0615,47.7725],[10.11288,47.8099],[10.08291,47.85302],[10.1086,47.90902],[10.07649,47.96496],[10.13001,48.02084],[10.13429,48.10669],[10.10004,48.12813],[10.05508,48.26228],[9.96944,48.36765],[10.03153,48.42593],[10.02938,48.46144],[10.12359,48.47705],[10.15356,48.4515],[10.23492,48.51252],[10.31628,48.51678],[10.29915,48.61878],[10.24563,48.6683],[10.27346,48.70646],[10.3698,48.68385],[10.43189,48.69939],[10.45116,48.72765],[10.40192,48.746],[10.44046,48.84896],[10.43403,48.95873],[10.33769,49.02055],[10.24991,49.03599],[10.24991,49.07387],[10.20066,49.10331],[10.25205,49.13274],[10.12359,49.19714],[10.11931,49.26285],[10.15142,49.28939],[10.10432,49.34522],[10.14072,49.39401],[10.1086,49.44555],[10.11074,49.50537],[10.0722,49.53316],[10.01654,49.47616],[9.92662,49.47894],[9.92448,49.55678],[9.89878,49.58177],[9.85596,49.53872],[9.80672,49.55678],[9.86667,49.60675],[9.85382,49.6442],[9.81743,49.66083],[9.83455,49.68993],[9.79602,49.72039],[9.75748,49.70793],[9.74035,49.68577],[9.70609,49.71624],[9.67826,49.71624],[9.68254,49.68854],[9.62045,49.69131],[9.64615,49.78955],[9.55836,49.77434],[9.57121,49.73561],[9.50698,49.75222],[9.49199,49.77987],[9.46844,49.76051],[9.42562,49.77849],[9.40421,49.76466],[9.33356,49.7702],[9.32928,49.73423],[9.4085,49.72593],[9.42776,49.69824],[9.41492,49.6442],[9.38066,49.63865],[9.35925,49.64974],[9.33998,49.63727],[9.31215,49.64836],[9.27789,49.62617],[9.28432,49.60814],[9.2415,49.57483],[9.09805,49.57205],[9.06594,49.60814],[9.10019,49.65113],[9.09163,49.6927],[9.13017,49.71208],[9.13873,49.74253],[9.10876,49.75637],[9.13659,49.79093],[9.10019,49.78955],[9.07236,49.82824],[9.03596,49.83514],[9.01669,50.02671],[8.96317,50.03084],[8.95674,50.05971],[9.00171,50.0707],[9.02097,50.11054],[9.1216,50.12289],[9.15586,50.11328],[9.19654,50.11878],[9.18583,50.13525],[9.23507,50.1476],[9.37638,50.12701],[9.4085,50.0817],[9.52197,50.09543],[9.50484,50.14211],[9.53267,50.16406],[9.48985,50.16954],[9.49413,50.24354],[9.61403,50.22163],[9.66541,50.23532],[9.63544,50.24901],[9.66756,50.27228],[9.74249,50.30922],[9.72964,50.35841],[9.77032,50.42939],[9.86881,50.40074],[9.91805,50.40893],[10.03581,50.47982],[10.03795,50.51115],[10.12359,50.56846]]],terms_url:"https://www.ldbv.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",zoomExtent:[6,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,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",zoomExtent:[2,21],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,43.39686],[-2.7,43.9]],[[-61.27501,14.90218],[-60.72368,14.90101],[-60.72489,14.36686],[-61.27622,14.36803],[-61.27501,14.90218]],[[-61.92802,16.58618],[-61.92686,15.7394],[-60.88128,15.74072],[-60.88243,16.5875],[-61.92802,16.58618]],[[-53.89344,6.004],[-52.46522,5.4465],[-51.52039,4.51072],[-51.53687,4.11633],[-52.2345,3.10213],[-52.641,2.25162],[-52.92664,2.07597],[-53.72864,2.21869],[-54.20106,2.03205],[-54.8053,2.27358],[-54.31092,2.80589],[-54.31641,3.20085],[-54.12415,3.46408],[-54.12964,3.59567],[-54.42078,4.00127],[-54.58008,4.95962],[-53.89344,6.004]],[[55.08816,-20.77935],[55.95959,-20.77281],[55.96576,-21.49],[55.09434,-21.49651],[55.08816,-20.77935]],[[44.92054,-12.57363],[45.34826,-12.57029],[45.35274,-13.1163],[44.92502,-13.11963],[44.92054,-12.57363]],[[-178.57728,-14.70582],[-178.42568,-14.00334],[-176.34156,-12.83858],[-175.71534,-12.9189],[-175.91858,-13.58726],[-177.84638,-14.64983],[-178.57728,-14.70582]]],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:"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",zoomExtent:[0,21],polygon:[[[2.31954,6.55745],[2.33645,6.56024],[2.36377,6.56211],[2.36738,6.56068],[2.37777,6.5494],[2.37779,6.53485],[2.36994,6.49332],[2.37038,6.45527],[2.36958,6.45269],[2.36188,6.44177],[2.35392,6.40545],[2.36749,6.4015],[2.39526,6.40072],[2.40128,6.40374],[2.40588,6.40341],[2.42046,6.39383],[2.42485,6.39794],[2.42949,6.39887],[2.43625,6.39628],[2.43958,6.40042],[2.44439,6.40189],[2.45376,6.39899],[2.47145,6.39632],[2.48162,6.39106],[2.49453,6.3874],[2.50893,6.38888],[2.50719,6.39229],[2.5012,6.39162],[2.4963,6.39521],[2.4951,6.40123],[2.49543,6.40401],[2.4983,6.41022],[2.50191,6.41282],[2.51087,6.41321],[2.52219,6.40849],[2.53352,6.40517],[2.5381,6.40961],[2.54111,6.4109],[2.54651,6.41099],[2.54654,6.40651],[2.57639,6.40724],[2.57642,6.41177],[2.58576,6.41196],[2.58868,6.41095],[2.60877,6.39414],[2.6257,6.39488],[2.64555,6.39729],[2.65039,6.39339],[2.65367,6.36823],[2.64312,6.36659],[2.61251,6.36289],[2.56868,6.3607],[2.54683,6.36055],[2.54687,6.35546],[2.50207,6.35461],[2.47064,6.35596],[2.46777,6.35203],[2.46423,6.3502],[2.45254,6.35006],[2.45113,6.34813],[2.44737,6.34629],[2.43757,6.34654],[2.43298,6.33841],[2.43016,6.33707],[2.42245,6.33707],[2.39236,6.34115],[2.39315,6.34115],[2.36528,6.34445],[2.35386,6.3453],[2.34377,6.34458],[2.34094,6.34534],[2.31086,6.36567],[2.28435,6.37465],[2.28147,6.37762],[2.27599,6.39517],[2.27612,6.3982],[2.31529,6.49261],[2.3158,6.55307],[2.31954,6.55745]],[[1.69563,6.25076],[1.7001,6.24712],[1.70418,6.24697],[1.75875,6.25836],[1.77079,6.25995],[1.81712,6.27161],[1.84457,6.27657],[1.85768,6.27945],[1.88843,6.28326],[1.90482,6.28595],[1.90618,6.29435],[1.90083,6.29721],[1.89881,6.29954],[1.89404,6.30085],[1.89048,6.2997],[1.88748,6.29636],[1.88344,6.29622],[1.8697,6.29227],[1.8564,6.29198],[1.85207,6.28675],[1.84991,6.28906],[1.84691,6.29203],[1.84353,6.29333],[1.84041,6.29315],[1.83627,6.29129],[1.8341,6.28733],[1.83417,6.2852],[1.8323,6.28456],[1.82786,6.28644],[1.82182,6.29084],[1.81563,6.28998],[1.81211,6.29143],[1.80758,6.29571],[1.80472,6.29693],[1.80074,6.2971],[1.79776,6.29612],[1.79625,6.29492],[1.7949,6.28965],[1.79641,6.28608],[1.80098,6.28338],[1.79567,6.28013],[1.79156,6.28174],[1.78499,6.28122],[1.78092,6.27753],[1.77588,6.2755],[1.76745,6.27696],[1.75653,6.27496],[1.74833,6.27239],[1.74762,6.27726],[1.74572,6.27938],[1.73948,6.27985],[1.7368,6.27761],[1.73572,6.27892],[1.72902,6.27911],[1.72435,6.27422],[1.72449,6.26786],[1.72556,6.26683],[1.69934,6.26159],[1.69573,6.25726],[1.69563,6.25076]]],best:true},{id:"Berlin-2011",name:"Berlin aerial photography 2011",type:"wms",template:"https://fbinter.stadt-berlin.de/fb/wms/senstadt/k_luftbild2011_20?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:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",polygon:[[[13.48699,52.68076],[13.52584,52.65196],[13.5299,52.64437],[13.54209,52.60921],[13.58109,52.58134],[13.59674,52.55936],[13.63477,52.55121],[13.66547,52.52854],[13.67199,52.50379],[13.65806,52.50372],[13.65796,52.49324],[13.7547,52.4565],[13.76644,52.43884],[13.76627,52.42973],[13.74494,52.39909],[13.65235,52.33133],[13.6417,52.33103],[13.62609,52.35491],[13.59432,52.37455],[13.53198,52.38376],[13.51948,52.39236],[13.48536,52.39227],[13.43552,52.38016],[13.42885,52.37401],[13.38689,52.37388],[13.38642,52.38667],[13.36857,52.38728],[13.37045,52.39349],[13.33968,52.40887],[13.31243,52.39775],[13.30557,52.40452],[13.23622,52.40342],[13.18886,52.40417],[13.17719,52.39067],[13.14859,52.38971],[13.14868,52.38421],[13.11889,52.38385],[13.11935,52.40025],[13.10487,52.40723],[13.07371,52.40668],[13.07367,52.41403],[13.10516,52.47897],[13.11685,52.47881],[13.112,52.55915],[13.11865,52.59156],[13.15251,52.60489],[13.16282,52.60462],[13.21264,52.6321],[13.22139,52.63215],[13.27292,52.66444],[13.31376,52.66442],[13.32714,52.64692],[13.36783,52.6468],[13.39158,52.65382],[13.42728,52.6549],[13.47594,52.68122],[13.48699,52.68076]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2011"},{id:"Berlin-2014",name:"Berlin aerial photography 2014",type:"tms",template:"https://tiles.codefor.de/berlin-2014/{zoom}/{x}/{y}.png",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[13.19746,52.64206],[13.25639,52.64285],[13.2558,52.66101],[13.31391,52.66185],[13.31476,52.64353],[13.37431,52.64462],[13.37386,52.66269],[13.4026,52.663],[13.40332,52.64501],[13.4334,52.64555],[13.43227,52.68001],[13.49082,52.68111],[13.49147,52.66428],[13.52092,52.66457],[13.5216,52.6465],[13.55096,52.6469],[13.55147,52.62938],[13.52219,52.62898],[13.52335,52.59248],[13.58263,52.59329],[13.58307,52.57535],[13.61246,52.57582],[13.61324,52.55784],[13.64268,52.55813],[13.64296,52.5401],[13.67253,52.54048],[13.67375,52.50475],[13.64413,52.5045],[13.64476,52.48608],[13.7037,52.48683],[13.70415,52.46901],[13.73362,52.4692],[13.73399,52.45121],[13.76358,52.45156],[13.76447,52.40209],[13.73546,52.39753],[13.73611,52.37963],[13.70678,52.37935],[13.70731,52.36136],[13.67785,52.36104],[13.67898,52.33017],[13.62102,52.32946],[13.61999,52.36033],[13.59046,52.36007],[13.5901,52.37806],[13.53116,52.37735],[13.53064,52.39525],[13.47168,52.39459],[13.47149,52.4125],[13.44101,52.41219],[13.44257,52.37604],[13.35487,52.37498],[13.35427,52.39306],[13.23667,52.39114],[13.23609,52.40922],[13.17635,52.40836],[13.17752,52.39029],[13.14791,52.38987],[13.14876,52.37459],[13.11971,52.37422],[13.11941,52.38955],[13.08981,52.38899],[13.08938,52.40707],[13.0618,52.40662],[13.06075,52.42408],[13.08842,52.42449],[13.086,52.47853],[13.11546,52.47896],[13.11462,52.49695],[13.1441,52.49729],[13.14332,52.5157],[13.1137,52.51528],[13.11077,52.6047],[13.19862,52.6062],[13.19746,52.64206]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2014"},{id:"Berlin-2015",name:"Berlin aerial photography 2015",type:"tms",template:"https://tiles.codefor.de/berlin-2015/{zoom}/{x}/{y}.png",endDate:"2015-08-03T00:00:00.000Z",startDate:"2015-08-02T00:00:00.000Z",polygon:[[[13.11068,52.59538],[13.13975,52.60527],[13.18355,52.61488],[13.21262,52.63315],[13.24167,52.64282],[13.256,52.65201],[13.27004,52.67021],[13.31368,52.67072],[13.32914,52.66204],[13.32948,52.6529],[13.43284,52.65414],[13.44733,52.6816],[13.50561,52.68244],[13.50654,52.65531],[13.53605,52.65572],[13.5376,52.61991],[13.52229,52.61977],[13.52304,52.60165],[13.59776,52.58469],[13.59865,52.55769],[13.62817,52.55805],[13.64303,52.5492],[13.65813,52.54042],[13.67312,52.53144],[13.67356,52.51358],[13.65913,52.51344],[13.65998,52.48643],[13.68931,52.48687],[13.73386,52.46933],[13.73405,52.46034],[13.76362,52.46068],[13.76431,52.42464],[13.74941,52.42474],[13.75045,52.39778],[13.73585,52.39762],[13.70661,52.37944],[13.707,52.3614],[13.67782,52.36125],[13.66405,52.33395],[13.62073,52.33337],[13.62031,52.36042],[13.58986,52.3781],[13.53149,52.37748],[13.53133,52.38641],[13.44223,52.38484],[13.42813,52.3667],[13.38464,52.3662],[13.35432,52.39301],[13.29537,52.39209],[13.29531,52.40103],[13.19171,52.39957],[13.19222,52.39056],[13.14774,52.38996],[13.14839,52.38095],[13.11964,52.38041],[13.0744,52.40683],[13.07392,52.42426],[13.10275,52.43374],[13.10123,52.47874],[13.11558,52.47897],[13.11068,52.59538]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2015"},{id:"Berlin-2016",name:"Berlin aerial photography 2016",type:"tms",template:"https://tiles.codefor.de/berlin-2016/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2016"},{id:"Berlin-2016-infrared",name:"Berlin aerial photography 2016 (infrared)",type:"tms",template:"https://tiles.codefor.de/berlin-2016i/{zoom}/{x}/{y}.png",endDate:"2016-04-03T00:00:00.000Z",startDate:"2016-04-02T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale Color-Infrarot-Orthophotos 2016"},{id:"Berlin-2017",name:"Berlin aerial photography 2017",type:"tms",template:"https://tiles.codefor.de/berlin-2017/{zoom}/{x}/{y}.png",endDate:"2017-03-28T00:00:00.000Z",startDate:"2017-03-27T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2017"},{id:"Berlin-2018",name:"Berlin aerial photography 2018",type:"tms",template:"https://tiles.codefor.de/berlin-2018/{zoom}/{x}/{y}.png",endDate:"2018-04-07T00:00:00.000Z",startDate:"2018-03-19T00:00:00.000Z",polygon:[[[13.29535,52.392],[13.29502,52.40083],[13.19206,52.39937],[13.19241,52.39035],[13.14839,52.3897],[13.14877,52.38046],[13.11926,52.38001],[13.11888,52.38921],[13.08906,52.40693],[13.07431,52.4067],[13.07356,52.42447],[13.10259,52.43394],[13.10073,52.47912],[13.11534,52.47934],[13.11055,52.59579],[13.13972,52.60527],[13.18403,52.60593],[13.21212,52.63346],[13.27041,52.65222],[13.26973,52.67025],[13.31405,52.67086],[13.32953,52.65323],[13.43315,52.65458],[13.43254,52.67251],[13.44682,52.68189],[13.50593,52.68261],[13.50681,52.65545],[13.53643,52.6558],[13.53757,52.61964],[13.52288,52.61946],[13.52345,52.6017],[13.53842,52.59279],[13.56782,52.59313],[13.59798,52.58464],[13.5988,52.55755],[13.62826,52.55788],[13.65822,52.53124],[13.67314,52.53139],[13.67365,52.51359],[13.65912,52.51344],[13.65989,52.48661],[13.68929,52.48692],[13.7188,52.47807],[13.73406,52.4604],[13.7636,52.46069],[13.76454,52.42482],[13.75027,52.42468],[13.75097,52.39814],[13.70722,52.37923],[13.70772,52.36111],[13.67826,52.36081],[13.67876,52.34302],[13.66428,52.34287],[13.66454,52.33367],[13.62038,52.33319],[13.61959,52.36012],[13.58956,52.37786],[13.5313,52.37719],[13.53103,52.38581],[13.44254,52.38473],[13.42861,52.36674],[13.38418,52.36617],[13.35417,52.39279],[13.29535,52.392]]],terms_text:"Geoportal Berlin/Digitale farbige Orthophotos 2018",best:true},{id:"Bing",name:"Bing aerial imagery",type:"bing",template:"https://www.bing.com/maps",zoomExtent:[0,22],"default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/Bing.png"},{id:"Bologna-Orthophoto-2017",name:"Bologna ortofoto 2017",type:"tms",template:"https://sitmappe.comune.bologna.it/tms/tileserver/Ortofoto2017/{zoom}/{x}/{y}.png",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,19],polygon:[[[11.22962,44.53077],[11.23184,44.52461],[11.24123,44.52167],[11.23251,44.50893],[11.23572,44.50323],[11.25009,44.50116],[11.24765,44.49644],[11.25708,44.49765],[11.25653,44.49294],[11.29461,44.48981],[11.29676,44.4857],[11.28807,44.47586],[11.29226,44.4609],[11.28447,44.45459],[11.28228,44.42572],[11.29347,44.4276],[11.29254,44.43377],[11.31339,44.42103],[11.32504,44.42274],[11.33695,44.42772],[11.33765,44.43167],[11.3315,44.43273],[11.33453,44.43867],[11.34466,44.43594],[11.34498,44.44093],[11.36235,44.45099],[11.37312,44.44935],[11.37498,44.45897],[11.39499,44.46368],[11.4011,44.46122],[11.39464,44.46803],[11.41577,44.48376],[11.42559,44.4845],[11.42717,44.48921],[11.41727,44.4906],[11.43363,44.51312],[11.42692,44.51532],[11.43034,44.5196],[11.42466,44.51959],[11.41987,44.52934],[11.4143,44.52564],[11.40739,44.52851],[11.41487,44.53999],[11.38871,44.54145],[11.39082,44.54553],[11.36474,44.55253],[11.36414,44.55609],[11.3573,44.5519],[11.34375,44.55333],[11.33589,44.54299],[11.33145,44.54734],[11.31349,44.54722],[11.30929,44.5295],[11.29104,44.53581],[11.28179,44.54851],[11.26911,44.53248],[11.25118,44.55578],[11.24499,44.55569],[11.22962,44.53077]]],terms_url:"http://dati.comune.bologna.it/node/3449",terms_text:"© Comune di Bologna cc-by 4.0 ODbL compliant",best:true},{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",zoomExtent:[14,20],polygon:[[[6.66713,46.83358],[6.66313,46.83833],[6.67213,46.84191],[6.6749,46.84226],[6.67843,46.83807],[6.66713,46.83358]]],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",zoomExtent:[0,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],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",zoomExtent:[14,20],polygon:[[[-0.59923,45.04193],[-0.54231,45.02757],[-0.50979,45.00601],[-0.47727,45.00206],[-0.47066,44.97367],[-0.45542,44.95102],[-0.46456,44.91792],[-0.4732,44.91936],[-0.48794,44.90928],[-0.4981,44.89057],[-0.48946,44.87797],[-0.4666,44.87076],[-0.47625,44.84735],[-0.49505,44.83978],[-0.49099,44.83186],[-0.46965,44.82537],[-0.49709,44.80446],[-0.52453,44.80013],[-0.5103,44.76767],[-0.53469,44.76515],[-0.56213,44.75107],[-0.5601,44.74169],[-0.5728,44.74133],[-0.59465,44.7601],[-0.63429,44.73989],[-0.65004,44.77705],[-0.67901,44.77489],[-0.68816,44.77922],[-0.71509,44.76839],[-0.75168,44.7471],[-0.76336,44.75577],[-0.73846,44.77561],[-0.74202,44.78571],[-0.72779,44.81239],[-0.73999,44.82861],[-0.76438,44.82933],[-0.803,44.82176],[-0.8401,44.82753],[-0.83908,44.84014],[-0.87567,44.85023],[-0.88532,44.85852],[-0.88685,44.88769],[-0.86601,44.88697],[-0.84569,44.89669],[-0.83349,44.92764],[-0.81825,44.92764],[-0.80198,44.92224],[-0.79843,44.9485],[-0.78725,44.94814],[-0.75574,44.97007],[-0.72169,44.95785],[-0.69578,44.93087],[-0.68866,44.93447],[-0.67139,44.93267],[-0.66935,44.94095],[-0.62514,44.95066],[-0.63226,44.95893],[-0.63124,44.9672],[-0.60024,44.96756],[-0.55146,44.97834],[-0.54079,44.97726],[-0.55451,44.99739],[-0.59364,45.01751],[-0.60787,45.03403],[-0.59923,45.04193]]],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.96968,-9.2928],[-35.97063,-9.20261],[-35.97727,-9.20264],[-35.98365,-9.2027],[-35.98765,-9.20266],[-35.99159,-9.20274],[-36.00498,-9.20284],[-36.01473,-9.20293],[-36.01651,-9.20296],[-36.01871,-9.20293],[-36.02487,-9.20286],[-36.02892,-9.20297],[-36.03308,-9.20289],[-36.03769,-9.20294],[-36.04581,-9.203],[-36.05161,-9.20305],[-36.05457,-9.20301],[-36.06022,-9.20304],[-36.06191,-9.20304],[-36.0618,-9.21319],[-36.06167,-9.21806],[-36.06156,-9.21915],[-36.06163,-9.22156],[-36.06144,-9.22277],[-36.06139,-9.22716],[-36.06134,-9.23227],[-36.0614,-9.23391],[-36.06145,-9.23494],[-36.06131,-9.23646],[-36.06133,-9.23773],[-36.06142,-9.23905],[-36.06145,-9.24133],[-36.06136,-9.2423],[-36.06141,-9.24358],[-36.06139,-9.2453],[-36.06126,-9.24726],[-36.06123,-9.24949],[-36.06127,-9.25107],[-36.06121,-9.25517],[-36.06119,-9.25795],[-36.06107,-9.25945],[-36.06109,-9.26183],[-36.06106,-9.26493],[-36.06086,-9.27146],[-36.06083,-9.2751],[-36.06074,-9.28274],[-36.0608,-9.29234],[-36.06074,-9.29363],[-36.05477,-9.29357],[-36.04621,-9.29349],[-36.03941,-9.29348],[-36.03501,-9.29339],[-36.02979,-9.29341],[-36.02167,-9.29332],[-36.01278,-9.29328],[-36.00468,-9.29321],[-35.99678,-9.29314],[-35.98969,-9.29312],[-35.98483,-9.29305],[-35.98305,-9.29289],[-35.98173,-9.29294],[-35.97884,-9.29282],[-35.96968,-9.2928]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[9,20],polygon:[[[-123.3176,49.32726],[-123.44053,49.32682],[-123.44072,49.33844],[-123.43984,49.34304],[-123.44013,49.34354],[-123.44011,49.34399],[-123.44063,49.34445],[-123.44047,49.34558],[-123.43978,49.34606],[-123.43897,49.34613],[-123.43729,49.35672],[-123.43748,49.37108],[-123.43353,49.37094],[-123.43304,49.37373],[-123.43327,49.37512],[-123.43228,49.3761],[-123.43175,49.37917],[-123.43143,49.37959],[-123.43078,49.38239],[-123.43134,49.38274],[-123.43121,49.38385],[-123.43004,49.38459],[-123.41899,49.38471],[-123.41922,49.41352],[-123.39725,49.41357],[-123.39728,49.42435],[-123.40069,49.42433],[-123.40077,49.57035],[-123.40008,49.57035],[-123.40108,49.59338],[-123.37604,49.59328],[-123.37698,49.67561],[-123.35073,49.67564],[-123.3508,49.70868],[-123.33289,49.70872],[-123.33279,49.72563],[-123.30071,49.72556],[-123.30092,49.73754],[-123.2886,49.73764],[-123.28878,49.82492],[-123.2998,49.82492],[-123.30117,49.84978],[-123.32182,49.85067],[-123.32733,49.85777],[-123.32767,49.97589],[-123.30083,49.97522],[-123.30072,50.0997],[-123.25017,50.10074],[-123.25091,50.27549],[-123.02243,50.27556],[-123.02249,50.32549],[-123.00093,50.32547],[-123.00078,50.34239],[-122.9775,50.34234],[-122.97748,50.35043],[-122.95081,50.3505],[-122.95079,50.3712],[-122.93252,50.37115],[-122.9321,50.39979],[-122.88742,50.39997],[-122.88734,50.42561],[-122.66202,50.4257],[-122.66231,50.39945],[-122.59903,50.39924],[-122.59883,50.37552],[-122.57248,50.37537],[-122.57356,50.24939],[-122.59904,50.24946],[-122.59915,50.22657],[-122.6185,50.22664],[-122.61857,50.22441],[-122.64906,50.22451],[-122.64922,50.19935],[-122.73086,50.19938],[-122.73116,50.12443],[-122.74904,50.12451],[-122.74905,50.0903],[-122.76878,50.09034],[-122.76898,49.94945],[-122.99905,49.94947],[-122.99912,49.87546],[-122.97759,49.87546],[-122.97781,49.69951],[-122.99924,49.69948],[-122.99925,49.65165],[-123.02215,49.65165],[-123.02212,49.59951],[-123.04919,49.59946],[-123.04919,49.59405],[-123.06646,49.59404],[-123.06636,49.54519],[-123.06999,49.54512],[-123.0699,49.54132],[-123.07068,49.53928],[-123.07089,49.53799],[-123.07115,49.53688],[-123.07111,49.53581],[-123.07138,49.53282],[-123.07165,49.53211],[-123.07171,49.53139],[-123.07203,49.53042],[-123.07396,49.53035],[-123.0748,49.5295],[-123.07482,49.52881],[-123.07434,49.52806],[-123.07353,49.52746],[-123.07337,49.52704],[-123.07329,49.52559],[-123.07371,49.52496],[-123.07362,49.52449],[-123.09926,49.52449],[-123.09916,49.47545],[-123.07105,49.47553],[-123.07109,49.4663],[-123.07392,49.46631],[-123.07422,49.4505],[-123.07463,49.45009],[-123.07465,49.44933],[-123.0746,49.44902],[-123.07446,49.44869],[-123.07433,49.44799],[-123.07424,49.44777],[-123.07431,49.44475],[-123.07471,49.44476],[-123.07464,49.43773],[-122.99965,49.43774],[-122.99965,49.43692],[-122.86062,49.44153],[-122.81026,49.4424],[-122.8099,49.37667],[-122.40361,49.37666],[-122.40363,49.37719],[-122.26474,49.3773],[-122.26354,49.23601],[-122.21557,49.23614],[-122.0581,49.23588],[-121.95383,49.29665],[-121.94009,49.30454],[-121.92358,49.31423],[-121.89909,49.32254],[-121.88834,49.32598],[-121.8553,49.33636],[-121.8327,49.34415],[-121.76713,49.36544],[-121.67367,49.36546],[-121.64042,49.37438],[-121.5962,49.38605],[-121.58612,49.38792],[-121.52137,49.39946],[-121.51174,49.40384],[-121.46793,49.4229],[-121.44168,49.43456],[-121.42243,49.43458],[-121.34629,49.39323],[-121.34801,49.34124],[-121.5135,49.32058],[-121.60317,49.27717],[-121.65841,49.18561],[-121.67995,49.16541],[-121.78158,49.07026],[-121.80762,49.06225],[-121.9394,49.06362],[-121.97255,49.04242],[-121.99214,49.03329],[-122.00353,49.02734],[-122.01786,49.02411],[-122.11086,48.99928],[-122.14931,48.99953],[-122.14927,48.99915],[-122.19914,48.9996],[-122.19918,48.9992],[-122.23436,48.99948],[-122.23436,49.00017],[-122.39947,49.00124],[-122.45213,49.00163],[-122.45213,49.00088],[-122.45841,49.00093],[-122.45848,48.99931],[-122.49925,48.9995],[-122.49925,48.99929],[-122.54926,48.99951],[-122.54926,48.99932],[-122.65808,48.99942],[-122.65811,48.9954],[-122.70676,48.99553],[-122.75198,48.99564],[-122.79221,48.99572],[-122.79219,48.99943],[-123.03504,48.99957],[-123.03504,49.0001],[-123.03971,49.00005],[-123.03974,49.00018],[-123.04855,49.00013],[-123.04853,49.00047],[-123.05571,49.00045],[-123.05563,49.00023],[-123.06414,49.00013],[-123.06416,48.99994],[-123.0749,48.99969],[-123.07507,49.00062],[-123.08996,49.00037],[-123.10923,48.99994],[-123.12712,49.0003],[-123.136,48.99987],[-123.13627,49.00058],[-123.15385,48.99981],[-123.15405,49.00068],[-123.171,49.00013],[-123.20009,48.99968],[-123.20034,49.04978],[-123.21088,49.04972],[-123.21122,49.05199],[-123.20705,49.05209],[-123.20789,49.06079],[-123.21917,49.0601],[-123.21896,49.06127],[-123.22518,49.06127],[-123.22539,49.06224],[-123.22971,49.06203],[-123.22981,49.06859],[-123.23319,49.06873],[-123.2335,49.07059],[-123.24931,49.07025],[-123.24973,49.08026],[-123.27514,49.0804],[-123.27514,49.08709],[-123.29948,49.0873],[-123.29944,49.08025],[-123.32545,49.08039],[-123.32544,49.11547],[-123.2751,49.15033],[-123.27518,49.18733],[-123.27881,49.18711],[-123.27889,49.19107],[-123.30048,49.19107],[-123.30042,49.26229],[-123.31262,49.26224],[-123.3126,49.27149],[-123.31543,49.27147],[-123.31566,49.28189],[-123.31747,49.28188],[-123.3175,49.29185],[-123.31904,49.29185],[-123.31907,49.2986],[-123.32023,49.29857],[-123.32028,49.30197],[-123.32227,49.30196],[-123.32239,49.31183],[-123.3254,49.31181],[-123.32539,49.32017],[-123.31927,49.3202],[-123.31922,49.32467],[-123.31794,49.32466],[-123.31799,49.32541],[-123.3176,49.32726]]],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.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],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.04767,47.48789],[19.05157,47.4899],[19.06434,47.4792],[19.0665,47.47632],[19.06766,47.47343],[19.06837,47.47077],[19.06846,47.46876],[19.06722,47.46501],[19.05683,47.45259],[19.0549,47.44906],[19.05176,47.43499],[19.04863,47.429],[19.04384,47.42968],[19.04023,47.42932],[19.03509,47.43818],[19.03221,47.43779],[19.0252,47.442],[19.0207,47.44576],[19.01915,47.44658],[19.01545,47.44759],[19.01347,47.44361],[19.01266,47.44271],[19.01178,47.44247],[19.0119,47.44188],[19.0098,47.43944],[19.0057,47.43111],[19.00046,47.43097],[18.99534,47.42821],[18.97545,47.42818],[18.97343,47.42904],[18.97361,47.42998],[18.97548,47.43067],[18.97719,47.43402],[18.97823,47.43817],[18.97733,47.44657],[18.97004,47.44988],[18.96861,47.45142],[18.97568,47.45506],[18.97586,47.45556],[18.97625,47.45584],[18.97658,47.45594],[18.97763,47.45597],[18.98017,47.45605],[18.98162,47.46067],[18.97793,47.46857],[18.96867,47.47643],[18.97745,47.48194],[18.98035,47.48169],[18.98565,47.4782],[18.98907,47.47838],[18.99117,47.47898],[18.99177,47.48102],[18.99288,47.48182],[18.99836,47.48238],[18.99902,47.483],[19.004,47.48189],[19.00416,47.48399],[19.01027,47.48535],[19.01237,47.48404],[19.0138,47.48351],[19.01674,47.48465],[19.0163,47.48539],[19.01689,47.48595],[19.01808,47.48605],[19.02108,47.48492],[19.02124,47.48612],[19.02301,47.48741],[19.02637,47.48885],[19.02995,47.48904],[19.03135,47.48855],[19.03189,47.48759],[19.03286,47.48712],[19.03364,47.48702],[19.03514,47.48725],[19.03585,47.48729],[19.03616,47.48751],[19.03665,47.48767],[19.03748,47.48774],[19.03847,47.48737],[19.03918,47.48679],[19.04105,47.48649],[19.04181,47.48737],[19.04387,47.4881],[19.04542,47.48817],[19.04695,47.4881],[19.04767,47.48789]]],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",zoomExtent:[12,22],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,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 : 2018",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",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.10753,-9.43884],[-36.10752,-9.43421],[-36.10767,-9.42959],[-36.10779,-9.42361],[-36.10769,-9.41927],[-36.10781,-9.41391],[-36.10803,-9.41094],[-36.1081,-9.40965],[-36.10811,-9.40747],[-36.10816,-9.40693],[-36.10819,-9.40418],[-36.10811,-9.40176],[-36.10817,-9.40002],[-36.10827,-9.39952],[-36.10827,-9.39646],[-36.10833,-9.39475],[-36.10832,-9.39273],[-36.10836,-9.3904],[-36.10841,-9.38447],[-36.10847,-9.38165],[-36.10846,-9.37767],[-36.10835,-9.37573],[-36.10845,-9.37432],[-36.10849,-9.37234],[-36.10845,-9.3697],[-36.10867,-9.36278],[-36.10863,-9.36102],[-36.10873,-9.35928],[-36.10874,-9.35736],[-36.10855,-9.35479],[-36.1087,-9.3523],[-36.10871,-9.34996],[-36.10873,-9.34893],[-36.11269,-9.34908],[-36.11726,-9.34912],[-36.12138,-9.34905],[-36.12806,-9.3491],[-36.13217,-9.34906],[-36.13694,-9.34915],[-36.14025,-9.34914],[-36.14134,-9.34932],[-36.14458,-9.34916],[-36.14684,-9.34914],[-36.14842,-9.34905],[-36.15276,-9.34907],[-36.154,-9.34922],[-36.15627,-9.34923],[-36.16026,-9.34921],[-36.16086,-9.34929],[-36.166,-9.34933],[-36.16938,-9.34942],[-36.17176,-9.34936],[-36.17628,-9.34945],[-36.18028,-9.34937],[-36.18227,-9.34946],[-36.18826,-9.34938],[-36.19039,-9.34945],[-36.19354,-9.34946],[-36.19552,-9.34941],[-36.19918,-9.34951],[-36.19926,-9.35146],[-36.19913,-9.35234],[-36.19912,-9.35353],[-36.19919,-9.35646],[-36.19922,-9.35771],[-36.1993,-9.35832],[-36.19933,-9.36112],[-36.19922,-9.36177],[-36.19918,-9.36258],[-36.19931,-9.364],[-36.19926,-9.36499],[-36.19922,-9.36563],[-36.19928,-9.3666],[-36.19917,-9.36796],[-36.19917,-9.36868],[-36.19922,-9.36911],[-36.19912,-9.37017],[-36.19887,-9.37149],[-36.19886,-9.37264],[-36.19902,-9.37322],[-36.19915,-9.37504],[-36.19911,-9.37688],[-36.19896,-9.37747],[-36.19899,-9.37915],[-36.19917,-9.38053],[-36.19919,-9.38124],[-36.19926,-9.38175],[-36.19928,-9.38302],[-36.19913,-9.38374],[-36.19908,-9.38592],[-36.19879,-9.38787],[-36.19881,-9.38935],[-36.19902,-9.39092],[-36.19904,-9.392],[-36.19899,-9.39348],[-36.1988,-9.39451],[-36.19867,-9.39705],[-36.19845,-9.39949],[-36.19864,-9.40313],[-36.19866,-9.40476],[-36.19865,-9.40836],[-36.19875,-9.40902],[-36.19857,-9.41058],[-36.19859,-9.41273],[-36.19874,-9.41446],[-36.19868,-9.41711],[-36.1986,-9.41902],[-36.19846,-9.41965],[-36.1985,-9.42235],[-36.19871,-9.42429],[-36.19858,-9.42697],[-36.1984,-9.42895],[-36.19857,-9.43412],[-36.19871,-9.4347],[-36.19865,-9.43595],[-36.19857,-9.43626],[-36.19859,-9.43667],[-36.19876,-9.43749],[-36.19889,-9.43905],[-36.19882,-9.43995],[-36.1785,-9.43977],[-36.17718,-9.43968],[-36.17265,-9.43967],[-36.17099,-9.43971],[-36.16396,-9.43963],[-36.15386,-9.4395],[-36.13983,-9.4393],[-36.12875,-9.43913],[-36.11497,-9.43892],[-36.10753,-9.43884]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"osm-cambodia_laos_thailand_vietnam-bilingual",name:"Cambodia, Laos, Thailand, Vietnam, Malaysia, Myanmar bilingual",type:"tms",template:"https://{switch:a,b,c,d}.tile.osm-tools.org/osm/{zoom}/{x}/{y}.png",zoomExtent:[0,20],polygon:[[[92.10238,20.81356],[93.56905,24.09755],[94.1733,23.92695],[95.19503,26.70727],[96.75509,27.52867],[97.58456,28.5806],[98.73812,27.51405],[98.74362,25.87992],[97.67794,24.75774],[97.96359,24.04238],[98.82052,24.16272],[99.52364,22.95934],[100.36959,21.50514],[101.79232,22.48305],[105.36288,23.33311],[106.81857,22.84801],[108.19735,21.36197],[107.43895,18.85398],[117.14537,7.46562],[119.6173,5.28754],[118.12315,4.05023],[117.25523,4.36249],[115.86546,4.34606],[115.50841,3.02498],[114.5526,1.5101],[113.54186,1.25748],[112.96507,1.5705],[112.24547,1.5101],[111.67418,1.01583],[110.4547,0.90049],[109.49889,1.9219],[103.22569,1.12568],[100.46263,3.23889],[97.6721,8.05888],[93.89281,15.93987],[92.10238,20.81356]]],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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.30643,-9.82332],[-36.30603,-9.78597],[-36.30602,-9.78263],[-36.30609,-9.78168],[-36.30604,-9.78081],[-36.3059,-9.77531],[-36.30586,-9.76496],[-36.30545,-9.73336],[-36.39634,-9.73248],[-36.39627,-9.73744],[-36.39636,-9.74336],[-36.39644,-9.75535],[-36.3966,-9.75856],[-36.39665,-9.75979],[-36.39655,-9.76244],[-36.39661,-9.76489],[-36.39658,-9.76648],[-36.39661,-9.76684],[-36.39659,-9.7696],[-36.3967,-9.77896],[-36.39675,-9.78464],[-36.39684,-9.79067],[-36.39693,-9.79681],[-36.39703,-9.80298],[-36.39719,-9.82033],[-36.39722,-9.82234],[-36.39392,-9.82233],[-36.35375,-9.82279],[-36.34822,-9.82286],[-36.31697,-9.82317],[-36.31191,-9.82324],[-36.30879,-9.82327],[-36.30643,-9.82332]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[0,21],polygon:[[[-72.26734,18.63561],[-72.2636,18.6373],[-72.26116,18.64141],[-72.25983,18.64588],[-72.25811,18.64742],[-72.24502,18.64795],[-72.23433,18.64807],[-72.22734,18.6482],[-72.21953,18.65438],[-72.2161,18.65446],[-72.21584,18.66222],[-72.21725,18.66739],[-72.21889,18.67019],[-72.22309,18.66958],[-72.22343,18.67312],[-72.22502,18.6732],[-72.22545,18.67609],[-72.23288,18.67597],[-72.23339,18.67877],[-72.23674,18.67857],[-72.23854,18.67975],[-72.24,18.68129],[-72.24463,18.68207],[-72.24682,18.6817],[-72.24605,18.67698],[-72.25094,18.67698],[-72.25511,18.67902],[-72.25961,18.67898],[-72.26081,18.67743],[-72.27038,18.67711],[-72.27901,18.67682],[-72.28373,18.67893],[-72.28613,18.68154],[-72.29665,18.68178],[-72.30184,18.68568],[-72.3012,18.68824],[-72.30802,18.69324],[-72.30948,18.69308],[-72.31699,18.69682],[-72.32806,18.70528],[-72.3384,18.69902],[-72.34012,18.69666],[-72.33961,18.69426],[-72.33377,18.68357],[-72.33135,18.68192],[-72.32551,18.68093],[-72.32027,18.67741],[-72.31626,18.67477],[-72.31167,18.672],[-72.308,18.66995],[-72.30534,18.66926],[-72.30068,18.66499],[-72.29796,18.66479],[-72.29609,18.66129],[-72.29315,18.65999],[-72.29519,18.65497],[-72.28414,18.64962],[-72.27804,18.64523],[-72.27487,18.64212],[-72.27352,18.64057],[-72.2706,18.63901],[-72.26734,18.63561]]],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.18221,46.22618],[6.18348,46.22772],[6.18929,46.23329],[6.19196,46.23858],[6.19253,46.24239],[6.19061,46.24397],[6.19046,46.24654],[6.19256,46.25045],[6.19186,46.25262],[6.19325,46.256],[6.19287,46.25776],[6.19543,46.26181],[6.1979,46.26454],[6.20045,46.26569],[6.20917,46.26634],[6.21716,46.27388],[6.22046,46.27895],[6.2275,46.28649],[6.23433,46.28955],[6.23643,46.2932],[6.24074,46.29774],[6.23958,46.30396],[6.2413,46.30529],[6.2432,46.30453],[6.24513,46.30492],[6.24627,46.30372],[6.24983,46.3027],[6.25032,46.3014],[6.24938,46.30018],[6.25146,46.29647],[6.25063,46.29451],[6.25223,46.29382],[6.25429,46.2907],[6.25231,46.28735],[6.25032,46.2868],[6.24974,46.28574],[6.24636,46.28433],[6.24323,46.28428],[6.23985,46.28098],[6.23934,46.27627],[6.24372,46.27356],[6.25113,46.26258],[6.26244,46.2553],[6.26301,46.25457],[6.262,46.25215],[6.26736,46.24887],[6.27732,46.25211],[6.27725,46.25298],[6.2832,46.25503],[6.28231,46.25568],[6.28278,46.25677],[6.28868,46.26046],[6.29154,46.2644],[6.29457,46.26556],[6.29729,46.26489],[6.29783,46.2631],[6.29541,46.25827],[6.29663,46.2566],[6.3024,46.2558],[6.30678,46.25753],[6.311,46.25666],[6.30768,46.25184],[6.31046,46.25057],[6.31011,46.24749],[6.31156,46.24386],[6.29606,46.22501],[6.29012,46.22241],[6.27773,46.21493],[6.26707,46.21276],[6.25668,46.20926],[6.25089,46.20574],[6.25076,46.20456],[6.2495,46.20404],[6.24643,46.20454],[6.24251,46.20364],[6.23594,46.20541],[6.23347,46.20509],[6.22889,46.20172],[6.22323,46.20005],[6.22355,46.19881],[6.22257,46.19791],[6.21935,46.19765],[6.21688,46.19448],[6.21259,46.19189],[6.20727,46.19137],[6.20588,46.18908],[6.2034,46.18806],[6.20282,46.18642],[6.20035,46.18504],[6.19905,46.18296],[6.19615,46.18288],[6.1885,46.17967],[6.18751,46.17539],[6.18982,46.16584],[6.1748,46.15694],[6.1688,46.15624],[6.15829,46.15195],[6.15434,46.15141],[6.14952,46.14933],[6.14805,46.14748],[6.14832,46.14619],[6.14561,46.14417],[6.14244,46.14493],[6.13768,46.14217],[6.13692,46.14071],[6.13074,46.13946],[6.12598,46.13966],[6.12014,46.14181],[6.1077,46.14203],[6.10537,46.14313],[6.09746,46.14325],[6.09151,46.15095],[6.07476,46.14795],[6.07188,46.14908],[6.05295,46.15046],[6.04973,46.1468],[6.04862,46.14153],[6.04571,46.13916],[6.04287,46.14006],[6.04013,46.13894],[6.03783,46.13716],[6.03647,46.13381],[6.03531,46.13344],[6.03,46.13816],[6.02079,46.14024],[6.01693,46.14191],[6.01282,46.14119],[6.00814,46.14171],[6.00364,46.14088],[5.99338,46.1432],[5.98728,46.14171],[5.98464,46.14232],[5.98309,46.13712],[5.97603,46.1319],[5.97314,46.13081],[5.97037,46.13108],[5.96536,46.12882],[5.96163,46.12976],[5.9573,46.12767],[5.95575,46.12836],[5.95484,46.13214],[5.9589,46.13553],[5.96446,46.13738],[5.96517,46.13845],[5.9631,46.14241],[5.96383,46.14656],[5.97157,46.1558],[5.97884,46.16721],[5.98022,46.17354],[5.98322,46.17507],[5.98537,46.17478],[5.98754,46.17306],[5.99029,46.17955],[5.9936,46.18203],[5.98976,46.18692],[5.98287,46.18822],[5.98068,46.1904],[5.96282,46.1963],[5.96225,46.19719],[5.96465,46.20022],[5.97164,46.20302],[5.96985,46.20383],[5.96794,46.20675],[5.97227,46.21418],[5.97364,46.21563],[5.97897,46.21821],[6.00857,46.24444],[6.01422,46.24855],[6.06593,46.28345],[6.11511,46.31511],[6.12573,46.31843],[6.12972,46.31568],[6.12978,46.31407],[6.13604,46.30896],[6.14179,46.30555],[6.15393,46.30014],[6.17157,46.29507],[6.17125,46.29223],[6.17277,46.28629],[6.17018,46.28533],[6.16834,46.28109],[6.17201,46.27554],[6.1722,46.27301],[6.1691,46.26785],[6.16746,46.26217],[6.16531,46.26195],[6.16455,46.26274],[6.15943,46.25898],[6.15532,46.25216],[6.15387,46.25212],[6.15273,46.25037],[6.15311,46.2477],[6.15494,46.24591],[6.1521,46.23878],[6.15217,46.23273],[6.15034,46.22659],[6.15454,46.22191],[6.15483,46.22044],[6.15296,46.21738],[6.154,46.21355],[6.1571,46.21097],[6.16263,46.21043],[6.16387,46.2097],[6.16911,46.21191],[6.16867,46.21318],[6.17073,46.21478],[6.17471,46.21603],[6.18221,46.22618]],[[6.18834,46.34901],[6.18696,46.34862],[6.18195,46.35015],[6.17961,46.352],[6.17142,46.35444],[6.17022,46.35911],[6.17415,46.36036],[6.17272,46.36189],[6.17348,46.36288],[6.17999,46.36547],[6.1877,46.36132],[6.19447,46.36175],[6.19905,46.36086],[6.20113,46.35634],[6.20258,46.35567],[6.20791,46.35583],[6.21374,46.35379],[6.21247,46.35085],[6.20846,46.34665],[6.2086,46.33991],[6.20659,46.33792],[6.20493,46.33861],[6.20348,46.33793],[6.19181,46.34333],[6.19318,46.34787],[6.19076,46.3477],[6.18834,46.34901]],[[6.18182,46.34281],[6.18016,46.34318],[6.1752,46.34532],[6.17341,46.34398],[6.17324,46.34054],[6.1714,46.33952],[6.16588,46.34254],[6.16564,46.34339],[6.17091,46.35054],[6.17341,46.35029],[6.17458,46.35192],[6.17587,46.35205],[6.18579,46.34593],[6.18182,46.34281]]],terms_url:"http://ge.ch/sitg/donnees/conditions-d-utilisation/open-data",terms_text:"Orthophotos du SITG 2011"},{id:"CTFRIBOURG2016",name:"Canton Fribourg 2016",type:"tms",template:"https://mapproxy.osm.ch/tiles/fribourg_2016/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[1,21],polygon:[[[6.79478,46.57542],[6.79949,46.57407],[6.80256,46.57491],[6.80336,46.57687],[6.80427,46.57664],[6.80489,46.57792],[6.80794,46.57761],[6.8094,46.57885],[6.81084,46.57896],[6.81322,46.57823],[6.81153,46.58099],[6.8142,46.58396],[6.81411,46.58567],[6.8206,46.58368],[6.82371,46.57747],[6.82693,46.57796],[6.82927,46.57637],[6.83485,46.57533],[6.83744,46.57677],[6.83691,46.57748],[6.83982,46.57896],[6.84239,46.58244],[6.84532,46.58276],[6.84644,46.58394],[6.84857,46.58331],[6.85087,46.58113],[6.85262,46.58197],[6.85996,46.57987],[6.86554,46.57725],[6.86507,46.57623],[6.8679,46.57515],[6.87446,46.56497],[6.8845,46.56195],[6.88686,46.56341],[6.89214,46.5679],[6.89918,46.56671],[6.89885,46.56499],[6.89393,46.55991],[6.88822,46.55815],[6.86839,46.54164],[6.86498,46.53896],[6.86015,46.53597],[6.85563,46.54086],[6.85501,46.54144],[6.85087,46.54111],[6.8407,46.53819],[6.83032,46.53744],[6.82783,46.54298],[6.82553,46.54357],[6.81278,46.52707],[6.81088,46.52513],[6.81534,46.52139],[6.8181,46.5165],[6.82263,46.51411],[6.82429,46.51207],[6.83034,46.51246],[6.83239,46.50544],[6.83503,46.50231],[6.84126,46.49706],[6.84294,46.49632],[6.84554,46.49667],[6.84775,46.49369],[6.84891,46.49337],[6.85729,46.49305],[6.86276,46.49384],[6.86634,46.50079],[6.87244,46.50431],[6.88168,46.51257],[6.8967,46.52044],[6.89773,46.52005],[6.89711,46.51766],[6.89767,46.51483],[6.89522,46.51079],[6.89572,46.50773],[6.89974,46.51039],[6.90142,46.51233],[6.92517,46.50769],[6.92759,46.50467],[6.93363,46.50167],[6.93674,46.50096],[6.95614,46.49949],[6.97239,46.48879],[6.97581,46.4784],[6.97783,46.47289],[6.97815,46.46833],[6.97906,46.46107],[6.98016,46.45896],[6.99212,46.44891],[6.98361,46.43873],[6.98394,46.43799],[6.98746,46.43794],[7.01786,46.44707],[7.02103,46.45729],[7.06583,46.48904],[7.0724,46.4864],[7.10037,46.48699],[7.12279,46.49869],[7.1264,46.50317],[7.13096,46.50466],[7.13624,46.50861],[7.13704,46.51308],[7.14005,46.51688],[7.14044,46.51988],[7.14318,46.52183],[7.1437,46.52475],[7.1453,46.52701],[7.14835,46.52846],[7.15834,46.52681],[7.16346,46.52855],[7.16709,46.53101],[7.18234,46.53837],[7.19218,46.54656],[7.20081,46.54169],[7.20108,46.543],[7.20765,46.53291],[7.21417,46.53762],[7.21811,46.54211],[7.22171,46.54481],[7.22311,46.5476],[7.22543,46.54923],[7.2322,46.55123],[7.23614,46.554],[7.24047,46.55424],[7.24705,46.55623],[7.25574,46.56029],[7.26385,46.56752],[7.2681,46.57369],[7.28136,46.58411],[7.2992,46.5791],[7.30805,46.58132],[7.31254,46.58917],[7.3207,46.59183],[7.31479,46.60042],[7.3162,46.60937],[7.31826,46.61615],[7.3178,46.61856],[7.31213,46.6217],[7.31327,46.63662],[7.32284,46.63731],[7.32684,46.63873],[7.32975,46.64171],[7.32787,46.64616],[7.321,46.65465],[7.32345,46.65526],[7.32914,46.65459],[7.33116,46.65522],[7.33403,46.65471],[7.34549,46.6553],[7.34756,46.65307],[7.35063,46.65164],[7.35079,46.64799],[7.35456,46.64669],[7.3558,46.64533],[7.35528,46.64193],[7.35714,46.63927],[7.35877,46.64418],[7.36209,46.64683],[7.36229,46.64791],[7.36608,46.64898],[7.37747,46.65636],[7.36933,46.65564],[7.36953,46.65748],[7.37103,46.65907],[7.37083,46.66085],[7.37187,46.66283],[7.37122,46.66375],[7.37252,46.66757],[7.37108,46.66942],[7.37649,46.67503],[7.37293,46.68012],[7.37777,46.68357],[7.37587,46.68645],[7.376,46.6878],[7.38027,46.69018],[7.37693,46.69272],[7.3686,46.69265],[7.3649,46.69505],[7.36261,46.69928],[7.3598,46.69802],[7.34598,46.69895],[7.34604,46.7019],[7.34939,46.70555],[7.35037,46.70874],[7.35021,46.71119],[7.34903,46.71249],[7.34065,46.71464],[7.33277,46.71491],[7.32868,46.71641],[7.31011,46.71815],[7.30785,46.71717],[7.30002,46.72247],[7.29683,46.72737],[7.29685,46.73565],[7.29834,46.74013],[7.30304,46.74517],[7.30454,46.74816],[7.30486,46.75026],[7.30335,46.7514],[7.30309,46.75261],[7.30359,46.75919],[7.29987,46.76375],[7.29881,46.76513],[7.29307,46.77136],[7.29532,46.77537],[7.29639,46.77729],[7.30081,46.77905],[7.30053,46.78064],[7.30113,46.78134],[7.30447,46.78321],[7.30447,46.78415],[7.30207,46.78638],[7.30351,46.78887],[7.30201,46.79079],[7.30159,46.79283],[7.30732,46.79872],[7.31044,46.80823],[7.31537,46.81246],[7.32028,46.8149],[7.32047,46.81564],[7.32072,46.82011],[7.31981,46.82515],[7.32891,46.829],[7.3302,46.82968],[7.33123,46.83177],[7.33103,46.8328],[7.32926,46.83563],[7.32333,46.84041],[7.30755,46.84704],[7.30775,46.84808],[7.30613,46.84999],[7.31207,46.85557],[7.31351,46.85936],[7.31739,46.8606],[7.32087,46.86154],[7.32576,46.85681],[7.323,46.85476],[7.32603,46.85163],[7.33181,46.8512],[7.33536,46.85043],[7.33678,46.84979],[7.33821,46.84946],[7.34726,46.85375],[7.34934,46.85331],[7.35167,46.85502],[7.35444,46.85875],[7.35772,46.86065],[7.35925,46.86311],[7.35794,46.86513],[7.35838,46.8688],[7.35738,46.8701],[7.35386,46.87129],[7.35253,46.87555],[7.35339,46.88676],[7.34843,46.88934],[7.32573,46.89373],[7.30935,46.89152],[7.29618,46.89377],[7.28938,46.89377],[7.28639,46.89269],[7.28245,46.8898],[7.2802,46.8896],[7.27259,46.89249],[7.26634,46.89361],[7.25931,46.89797],[7.24433,46.90037],[7.24314,46.89792],[7.23633,46.89809],[7.23203,46.90029],[7.2309,46.9024],[7.23032,46.90394],[7.22351,46.90276],[7.21755,46.89735],[7.21244,46.90173],[7.2088,46.9026],[7.20781,46.90913],[7.20578,46.91477],[7.20692,46.92481],[7.2111,46.92527],[7.21854,46.92434],[7.2342,46.92939],[7.23411,46.93669],[7.23477,46.93827],[7.2302,46.93995],[7.2282,46.93881],[7.22555,46.93633],[7.2174,46.93307],[7.2093,46.93334],[7.20823,46.93323],[7.2058,46.94023],[7.2055,46.94112],[7.20951,46.94188],[7.21027,46.94302],[7.21044,46.94569],[7.21011,46.94781],[7.20885,46.95435],[7.21102,46.95652],[7.20838,46.95768],[7.20742,46.95967],[7.19764,46.96065],[7.19459,46.96135],[7.19463,46.9629],[7.19552,46.96416],[7.19633,46.96365],[7.19794,46.96445],[7.1993,46.9638],[7.20646,46.96413],[7.20745,46.96751],[7.21422,46.96692],[7.21467,46.97133],[7.21739,46.97147],[7.21686,46.97271],[7.22247,46.97454],[7.22163,46.97556],[7.22821,46.97836],[7.23569,46.98456],[7.23486,46.98675],[7.22594,46.9924],[7.22625,46.99868],[7.22575,46.99915],[7.21779,47.00641],[7.21299,47.0068],[7.09058,46.978],[7.03295,46.98265],[6.73785,46.81195],[6.73908,46.71021],[6.81908,46.65533],[6.82741,46.65982],[6.82089,46.65179],[6.81729,46.64923],[6.81851,46.6478],[6.81458,46.64747],[6.81344,46.64953],[6.81194,46.6492],[6.81081,46.65038],[6.80674,46.65059],[6.80203,46.64889],[6.79891,46.64914],[6.79879,46.64781],[6.80367,46.64567],[6.80325,46.6448],[6.8038,46.64451],[6.80321,46.64376],[6.80171,46.64421],[6.79895,46.63959],[6.79692,46.63314],[6.79838,46.63016],[6.80043,46.62991],[6.80065,46.62843],[6.80172,46.62854],[6.80228,46.62775],[6.80197,46.62507],[6.80355,46.62124],[6.80244,46.61877],[6.80296,46.61615],[6.80185,46.61555],[6.80389,46.60903],[6.80239,46.60142],[6.79833,46.59986],[6.8002,46.59362],[6.80124,46.5925],[6.79848,46.58616],[6.79948,46.58559],[6.79894,46.58205],[6.79611,46.57932],[6.79626,46.57728],[6.79478,46.57542]]],terms_text:"Canton Fribourg 2016 'orthophoto technique'"},{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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.03321,-9.45741],[-36.03322,-9.45581],[-36.03336,-9.45483],[-36.0334,-9.45291],[-36.03327,-9.45141],[-36.03336,-9.44287],[-36.0335,-9.43821],[-36.03353,-9.42881],[-36.03363,-9.42027],[-36.03389,-9.41091],[-36.03389,-9.40032],[-36.03401,-9.3888],[-36.03413,-9.38528],[-36.03428,-9.38265],[-36.03417,-9.37849],[-36.03444,-9.36688],[-36.05246,-9.3671],[-36.05791,-9.36711],[-36.0716,-9.36727],[-36.08622,-9.36731],[-36.103,-9.3675],[-36.11652,-9.36755],[-36.12515,-9.36768],[-36.12522,-9.37473],[-36.12521,-9.37721],[-36.12511,-9.38038],[-36.12514,-9.38529],[-36.12505,-9.39026],[-36.12504,-9.39477],[-36.12506,-9.40172],[-36.12499,-9.40382],[-36.1248,-9.40679],[-36.12463,-9.41123],[-36.12474,-9.4136],[-36.12456,-9.4163],[-36.12459,-9.42461],[-36.12466,-9.42691],[-36.12465,-9.42925],[-36.12457,-9.4297],[-36.12464,-9.43538],[-36.12438,-9.44109],[-36.12446,-9.44387],[-36.12452,-9.44579],[-36.12438,-9.44736],[-36.12448,-9.44856],[-36.12448,-9.45095],[-36.12436,-9.45392],[-36.12434,-9.45791],[-36.11758,-9.45783],[-36.1089,-9.45778],[-36.10419,-9.4578],[-36.10116,-9.45773],[-36.0953,-9.45773],[-36.08461,-9.45767],[-36.07361,-9.45757],[-36.05726,-9.45741],[-36.04816,-9.45747],[-36.04177,-9.45739],[-36.03767,-9.45739],[-36.03321,-9.45741]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"COS2010_v1.0",name:"Carta de Uso do Solo 2010 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt/wms-inspire/cos2010v1?language=por&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=COS2010_v1.0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2010-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",zoomExtent:[14,18],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/cos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{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",zoomExtent:[14,20],polygon:[[[7.02235,46.42856],[7.0224,46.42045],[7.02176,46.41955],[7.02225,46.41954],[7.02161,46.41749],[7.02242,46.4174],[7.02242,46.41681],[7.02113,46.41443],[7.02164,46.41259],[7.0216,46.41188],[7.01918,46.41055],[7.01896,46.41004],[7.01757,46.40826],[7.01426,46.40696],[7.00948,46.40695],[7.00952,46.40451],[7.00368,46.40153],[6.97052,46.40139],[6.97056,46.39354],[6.96507,46.38333],[6.89379,46.383],[6.89327,46.39209],[6.8968,46.4],[6.89678,46.40097],[6.89395,46.401],[6.89768,46.40888],[6.89246,46.41386],[6.89237,46.41807],[6.8949,46.4193],[6.89285,46.41948],[6.89395,46.42312],[6.89225,46.42339],[6.89219,46.42802],[6.88743,46.428],[6.87652,46.43163],[6.86624,46.43633],[6.84003,46.44591],[6.83504,46.44934],[6.827,46.45204],[6.82695,46.45379],[6.81953,46.45655],[6.80361,46.45993],[6.78775,46.46253],[6.78697,46.5246],[6.82604,46.5248],[6.82609,46.52662],[6.83907,46.5267],[6.83888,46.55006],[6.90658,46.55042],[6.912,46.54301],[6.91083,46.53983],[6.90979,46.53512],[6.90931,46.53517],[6.90867,46.53373],[6.91195,46.53297],[6.91335,46.53604],[6.9268,46.53364],[6.92723,46.5349],[6.93714,46.53311],[6.93691,46.5327],[6.94028,46.53196],[6.94164,46.53477],[6.94309,46.53455],[6.94345,46.53528],[6.95641,46.53003],[6.95632,46.52733],[6.95111,46.52725],[6.95301,46.52611],[6.94341,46.52605],[6.94343,46.52546],[7.01629,46.52568],[7.02158,46.52211],[7.02196,46.47355],[7.07099,46.47368],[7.07402,46.4719],[7.07383,46.4326],[7.05947,46.43233],[7.05278,46.42879],[7.02235,46.42856]]],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.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-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],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-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]]]},{id:"Chorzow-buildings",name:"Chorzów: Buildings",type:"wms",template:"http://e-odgik.chorzow.eu/services/wms/wms_funkcje_bud/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,2,1,8,7,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.94562,50.31836],[18.94349,50.32385],[18.95466,50.32599],[18.96426,50.33307],[18.96521,50.33777],[18.98692,50.33621],[18.98468,50.32501],[18.99777,50.32204],[18.99686,50.31716],[18.98774,50.31736],[18.98695,50.30989],[18.99736,50.30031],[18.99744,50.29722],[19.00546,50.29548],[19.0073,50.28342],[19.00574,50.27871],[18.99236,50.27091],[18.96792,50.28661],[18.96215,50.27972],[18.96169,50.27337],[18.95824,50.27291],[18.95492,50.26193],[18.96014,50.24927],[18.95672,50.2452],[18.95555,50.23891],[18.94132,50.243],[18.93475,50.25314],[18.93324,50.26032],[18.93262,50.26588],[18.9296,50.26774],[18.92976,50.27131],[18.92669,50.27289],[18.92632,50.27623],[18.93071,50.27619],[18.93437,50.28729],[18.92383,50.29533],[18.92635,50.29986],[18.91905,50.30212],[18.91955,50.30576],[18.92463,50.31192],[18.9262,50.31883],[18.94562,50.31836]]],terms_text:"Urząd Miasta Chorzowa"},{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",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],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",zoomExtent:[1,21],polygon:[[[18.44866,-33.89362],[18.44859,-33.90264],[18.4702,-33.90277],[18.48139,-33.84724],[18.44925,-33.80107],[18.42815,-33.73564],[18.43914,-33.71772],[18.40719,-33.65899],[18.33224,-33.57752],[18.33245,-33.55045],[18.354,-33.55059],[18.35425,-33.5236],[18.36524,-33.52366],[18.36503,-33.5148],[18.37601,-33.51477],[18.37605,-33.5058],[18.42966,-33.50594],[18.4297,-33.48785],[18.44049,-33.48789],[18.4406,-33.46988],[18.49437,-33.4701],[18.49433,-33.47916],[18.51583,-33.47917],[18.51574,-33.48819],[18.52647,-33.4883],[18.52632,-33.52435],[18.54793,-33.52443],[18.54795,-33.51539],[18.56937,-33.5155],[18.56937,-33.52448],[18.58012,-33.52453],[18.58007,-33.5426],[18.59078,-33.5426],[18.59074,-33.56064],[18.57995,-33.56053],[18.57988,-33.56962],[18.5907,-33.56962],[18.59065,-33.57868],[18.62301,-33.57873],[18.62292,-33.58773],[18.66597,-33.58789],[18.66593,-33.61493],[18.67672,-33.61497],[18.67658,-33.65103],[18.6873,-33.65102],[18.68734,-33.66004],[18.69807,-33.66009],[18.69807,-33.66907],[18.75204,-33.66925],[18.75208,-33.64219],[18.77364,-33.64225],[18.77371,-33.63319],[18.82746,-33.6333],[18.82752,-33.6603],[18.81667,-33.66029],[18.8166,-33.67832],[18.80581,-33.67831],[18.80581,-33.70539],[18.8274,-33.70544],[18.82733,-33.72347],[18.83812,-33.72343],[18.83804,-33.74139],[18.81652,-33.74137],[18.81637,-33.79551],[18.80559,-33.79551],[18.80551,-33.81357],[18.79476,-33.81355],[18.79472,-33.83154],[18.77311,-33.83152],[18.77313,-33.84052],[18.76236,-33.84052],[18.76227,-33.90359],[18.75146,-33.90352],[18.75108,-33.98478],[18.76191,-33.9848],[18.76178,-34.02988],[18.7726,-34.0299],[18.77258,-34.03891],[18.79403,-34.03894],[18.79388,-34.0407],[18.79845,-34.04119],[18.80324,-34.04118],[18.80341,-34.03892],[18.81594,-34.03897],[18.81634,-34.02993],[18.83798,-34.03165],[18.838,-34.03],[18.84842,-34.03001],[18.84847,-34.02185],[18.85993,-34.02347],[18.85986,-34.02101],[18.86827,-34.02208],[18.86819,-34.02117],[18.88546,-34.02343],[18.88518,-34.02132],[18.90252,-34.02103],[18.90258,-34.012],[18.91342,-34.012],[18.91348,-33.99396],[18.94588,-33.99403],[18.94586,-34.0031],[18.96743,-34.003],[18.96747,-34.01208],[18.97822,-34.01208],[18.97833,-34.02114],[18.98914,-34.02114],[18.98916,-34.03913],[19.00002,-34.03913],[19.00002,-34.05718],[19.01084,-34.05725],[19.01079,-34.08414],[19,-34.08413],[19.00002,-34.0932],[18.98915,-34.09317],[18.98918,-34.1022],[18.97832,-34.10218],[18.97832,-34.11123],[18.9675,-34.11121],[18.96749,-34.12925],[18.9566,-34.12924],[18.95656,-34.13824],[18.96742,-34.13831],[18.96742,-34.14732],[18.98918,-34.1473],[18.98918,-34.1653],[18.97827,-34.16529],[18.97832,-34.17429],[18.96742,-34.17427],[18.96746,-34.1833],[18.95656,-34.18332],[18.95656,-34.19236],[18.94574,-34.19232],[18.9457,-34.20132],[18.93487,-34.20137],[18.93489,-34.21933],[18.90236,-34.21935],[18.90176,-34.23626],[18.88784,-34.23735],[18.88942,-34.25541],[18.88059,-34.25534],[18.87927,-34.26443],[18.86969,-34.26441],[18.86971,-34.27344],[18.83714,-34.27342],[18.83712,-34.26438],[18.84802,-34.2644],[18.84803,-34.23739],[18.81549,-34.21028],[18.81565,-34.17413],[18.85488,-34.15627],[18.76176,-34.08405],[18.65337,-34.07748],[18.47974,-34.11012],[18.44637,-34.13423],[18.44445,-34.16409],[18.436,-34.16405],[18.43597,-34.18202],[18.44681,-34.18211],[18.44673,-34.19111],[18.46593,-34.19121],[18.48662,-34.24539],[18.47889,-34.25437],[18.486,-34.25437],[18.46771,-34.29941],[18.48922,-34.34458],[18.50011,-34.34458],[18.49992,-34.36262],[18.46743,-34.36251],[18.46737,-34.35349],[18.3916,-34.31707],[18.39177,-34.29002],[18.37016,-34.28087],[18.37068,-34.21789],[18.34923,-34.18162],[18.32747,-34.18149],[18.32767,-34.16346],[18.31187,-34.15438],[18.3114,-34.14353],[18.32367,-34.13469],[18.34993,-34.10421],[18.33932,-34.08828],[18.36125,-34.05972],[18.35505,-34.05538],[18.34275,-34.06433],[18.32,-34.06443],[18.29607,-34.04513],[18.30682,-34.02526],[18.32877,-34.0192],[18.32892,-34.00125],[18.33974,-34.00127],[18.3398,-33.98663],[18.36287,-33.97351],[18.36381,-33.92925],[18.37262,-33.92927],[18.37284,-33.91776],[18.39773,-33.89335],[18.44866,-33.89362]]],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:"City_of_Melbourne_May_2018",name:"City of Melbourne",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/openstreetmapau.gdbhzo3g/{zoom}/{x}/{y}.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcGF1IiwiYSI6ImNqbWl3bXZ6aDA0MTkzd21xdnV1d2k0azEifQ.HYkMOqH_E2fYd1b0oXRe6w",endDate:"2018-05-01T00:00:00.000Z",startDate:"2018-05-01T00:00:00.000Z",zoomExtent:[10,22],polygon:[[[144.9146,-37.79929],[144.9139,-37.79888],[144.91276,-37.79858],[144.91138,-37.79876],[144.90975,-37.79976],[144.90604,-37.80641],[144.90428,-37.81261],[144.9042,-37.81421],[144.90561,-37.82089],[144.90426,-37.82245],[144.89902,-37.82728],[144.89686,-37.83007],[144.89598,-37.83355],[144.89602,-37.83873],[144.89703,-37.84192],[144.90113,-37.84692],[144.9052,-37.85019],[144.90684,-37.85056],[144.90802,-37.8502],[144.9084,-37.84948],[144.90701,-37.84771],[144.90763,-37.84693],[144.90448,-37.84165],[144.90529,-37.84139],[144.90806,-37.8458],[144.91181,-37.8502],[144.91274,-37.85039],[144.91548,-37.84892],[144.91553,-37.84814],[144.91396,-37.84594],[144.91619,-37.84451],[144.91396,-37.84131],[144.91634,-37.83985],[144.91651,-37.83841],[144.91508,-37.83441],[144.91829,-37.83307],[144.91947,-37.83258],[144.92102,-37.83087],[144.92186,-37.83002],[144.92297,-37.8295],[144.92937,-37.82816],[144.93529,-37.82702],[144.94112,-37.82692],[144.94181,-37.82679],[144.94585,-37.8275],[144.94707,-37.82794],[144.94784,-37.82779],[144.95786,-37.82953],[144.95921,-37.82941],[144.9613,-37.82902],[144.96254,-37.82972],[144.96477,-37.83184],[144.96565,-37.83229],[144.96621,-37.83231],[144.97033,-37.83121],[144.97052,-37.83228],[144.97106,-37.83307],[144.97346,-37.83507],[144.97428,-37.83595],[144.97943,-37.85002],[144.97968,-37.85081],[144.98061,-37.85117],[144.98425,-37.85151],[144.98483,-37.85139],[144.98537,-37.85085],[144.98923,-37.83109],[144.98891,-37.83038],[144.99226,-37.81041],[144.99243,-37.80983],[144.99187,-37.80895],[144.97449,-37.80714],[144.97683,-37.79327],[144.97674,-37.7928],[144.97642,-37.79232],[144.97589,-37.79219],[144.96977,-37.79146],[144.97076,-37.78566],[144.97041,-37.785],[144.9699,-37.78477],[144.96488,-37.7842],[144.96511,-37.78252],[144.96507,-37.78198],[144.96421,-37.78142],[144.96398,-37.78082],[144.96389,-37.77964],[144.96355,-37.7785],[144.96267,-37.77779],[144.96136,-37.77724],[144.93919,-37.77456],[144.93836,-37.77458],[144.93801,-37.77485],[144.93728,-37.77601],[144.93658,-37.77692],[144.93613,-37.77728],[144.93598,-37.77791],[144.93778,-37.78142],[144.93827,-37.78421],[144.93911,-37.78654],[144.93885,-37.78672],[144.93881,-37.7873],[144.93773,-37.78801],[144.93216,-37.7874],[144.93123,-37.78783],[144.93076,-37.78786],[144.93003,-37.78735],[144.92181,-37.78642],[144.91488,-37.77938],[144.91428,-37.77865],[144.9137,-37.77853],[144.91293,-37.77855],[144.90819,-37.78135],[144.90722,-37.78206],[144.90572,-37.7845],[144.90529,-37.78637],[144.90428,-37.78657],[144.90375,-37.78718],[144.90319,-37.78827],[144.90201,-37.78883],[144.90143,-37.78964],[144.90188,-37.79103],[144.90257,-37.79198],[144.90415,-37.79288],[144.90645,-37.79383],[144.90814,-37.79456],[144.91046,-37.79519],[144.9127,-37.79605],[144.91429,-37.79695],[144.91525,-37.79783],[144.91539,-37.79815],[144.91531,-37.79848],[144.91518,-37.79872],[144.9148,-37.79914],[144.9146,-37.79929]]],terms_url:"https://data.melbourne.vic.gov.au/Property-Planning/2018-Aerial-Imagery-True-Ortho-/qa5h-sfgh",terms_text:"City of Melbourne",best:true,icon:"https://www.melbourne.vic.gov.au/_catalogs/masterpage/android-icon.png"},{id:"Zuerich-aerial_2011",name:"City of Zürich Orthophoto 2011",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_2011&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",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],terms_text:"Stadt Zürich Open Government Data"},{id:"Zuerich-overview",name:"City of Zürich Overview map (Steets, buildings, house numbers)",type:"wms",template:"https://www.gis.stadt-zuerich.ch/maps/services/wms/WMS-ZH-STZH-OGD/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Uebersichtsplan&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.6023,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33678],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{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.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],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",zoomExtent:[13,18],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],overlay:true},{id:"Czech_pLPIS",name:"Czech pLPIS",type:"wms",template:"https://eagri.cz/public/app/wms/plpis.fcgi?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LPIS_FB4,LPIS_FB4_KOD&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}&TRANSPARENT=true",projection:"EPSG:4326",polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]]},{id:"Czech_RUIAN-budovy",name:"Czech RUIAN budovy",type:"tms",template:"https://tile.poloha.net/budovy/{zoom}/{x}/{y}.png",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],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",zoomExtent:[12,20],polygon:[[[15.00637,49.01774],[15.15599,49.00138],[15.1909,48.94246],[15.31059,48.98829],[15.40535,48.9752],[15.54,48.91624],[15.71456,48.86706],[15.83425,48.88018],[15.9689,48.81782],[16.0886,48.74553],[16.39781,48.74553],[16.48758,48.81454],[16.6721,48.7784],[16.68208,48.73566],[16.90152,48.71263],[16.9464,48.6237],[17.11597,48.83752],[17.21072,48.88018],[17.40523,48.81782],[17.48004,48.85393],[17.52991,48.81782],[17.70446,48.86706],[17.81418,48.9359],[17.884,48.9359],[17.94385,49.02101],[18.06354,49.03409],[18.1184,49.09944],[18.1982,49.30473],[18.38771,49.33399],[18.57723,49.50917],[18.75677,49.49946],[18.84654,49.52536],[18.87646,49.57066],[18.79666,49.69341],[18.64206,49.70954],[18.5872,49.83515],[18.61214,49.88338],[18.56226,49.93477],[18.51239,49.90587],[18.36277,49.95403],[18.32786,49.92193],[18.26303,49.97328],[18.1184,50.00534],[18.06354,50.07581],[17.91392,49.97969],[17.77927,50.03098],[17.71444,50.12379],[17.60472,50.16534],[17.75932,50.21962],[17.73438,50.34391],[17.63963,50.28021],[17.38029,50.28021],[17.35037,50.34391],[17.28055,50.33754],[17.18579,50.40752],[16.90152,50.46152],[16.86661,50.41388],[16.96635,50.31844],[17.03617,50.23238],[16.83668,50.21962],[16.712,50.1046],[16.58233,50.15895],[16.56238,50.23876],[16.43272,50.33754],[16.35292,50.39163],[16.27811,50.39163],[16.20829,50.44565],[16.39781,50.53449],[16.44768,50.59785],[16.35292,50.6706],[16.23821,50.67692],[16.21827,50.63266],[16.1285,50.68324],[16.0487,50.60734],[15.98885,50.7022],[15.87415,50.68324],[15.82926,50.76533],[15.72952,50.74324],[15.45023,50.81577],[15.39039,50.77479],[15.38041,50.85987],[15.29563,50.88504],[15.29563,50.98876],[15.17095,51.02014],[14.99141,51.00131],[15.00637,50.88819],[14.84179,50.8756],[14.7969,50.82522],[14.63233,50.85672],[14.66225,50.93536],[14.57248,50.92278],[14.61238,50.98562],[14.49767,51.04837],[14.41788,51.02328],[14.30816,51.06717],[14.2533,51.00445],[14.40291,50.93221],[14.37299,50.89763],[14.24332,50.90706],[14.20841,50.84412],[14.03386,50.81262],[13.979,50.82522],[13.90419,50.79686],[13.87427,50.74009],[13.53514,50.7243],[13.53015,50.65796],[13.4703,50.61367],[13.39051,50.66428],[13.32567,50.58835],[13.25086,50.61051],[13.196,50.50595],[13.05137,50.52181],[12.96659,50.4107],[12.82695,50.47105],[12.70227,50.41388],[12.50777,50.40116],[12.34319,50.25471],[12.32324,50.18451],[12.24843,50.27384],[12.17362,50.33118],[12.09881,50.33436],[12.11876,50.25152],[12.22349,50.16534],[12.20354,50.12379],[12.50278,49.97328],[12.47784,49.93798],[12.54766,49.91551],[12.46787,49.80298],[12.40802,49.76111],[12.48283,49.68696],[12.5327,49.68696],[12.51774,49.62885],[12.60751,49.54155],[12.67234,49.43788],[12.81199,49.34699],[12.94664,49.34374],[13.23091,49.12882],[13.32567,49.10597],[13.43539,49.0439],[13.41544,48.99484],[13.50022,48.94901],[13.56506,48.98829],[13.68475,48.88346],[13.7446,48.90313],[13.82439,48.77511],[13.8992,48.77511],[14.05879,48.67642],[14.04383,48.63029],[14.14358,48.59072],[14.37299,48.56103],[14.48271,48.65007],[14.57747,48.60721],[14.62734,48.63359],[14.70713,48.58083],[14.74703,48.70276],[14.81187,48.73895],[14.81685,48.79483],[14.98642,48.76525],[15.00637,49.01774]]],terms_url:"https://poloha.net/",terms_text:"Czech RUIAN"},{id:"Czestochowa-buildings",name:"Częstochowa: Buildings",type:"wms",template:"http://geoportal.czestochowa.um.gov.pl/isdp/scripts/isdp.dll/wms?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ieg_budynek&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.08183,50.8554],[19.0888,50.86563],[19.11082,50.86616],[19.10961,50.86092],[19.11709,50.85933],[19.11531,50.86283],[19.11997,50.86327],[19.1227,50.85452],[19.12938,50.85519],[19.12566,50.86165],[19.13364,50.86147],[19.14318,50.86815],[19.1498,50.87916],[19.16507,50.8794],[19.16816,50.88501],[19.17265,50.88477],[19.18346,50.87706],[19.18084,50.86562],[19.18711,50.84712],[19.19973,50.84395],[19.19637,50.83678],[19.19358,50.83357],[19.19454,50.83145],[19.20696,50.82985],[19.20838,50.82484],[19.21831,50.82571],[19.22564,50.82475],[19.23075,50.82509],[19.2308,50.82666],[19.23351,50.82683],[19.23303,50.82335],[19.21868,50.80115],[19.21753,50.79272],[19.22592,50.78822],[19.20889,50.77561],[19.19891,50.76355],[19.19521,50.75182],[19.19074,50.75211],[19.18245,50.7545],[19.16504,50.7535],[19.16417,50.75586],[19.14559,50.75805],[19.14282,50.75543],[19.13021,50.75786],[19.127,50.75314],[19.1216,50.75363],[19.12066,50.74981],[19.10348,50.75228],[19.09598,50.75201],[19.0956,50.74912],[19.09351,50.7488],[19.09285,50.75027],[19.08442,50.74986],[19.08473,50.74349],[19.08382,50.73741],[19.07878,50.73668],[19.07503,50.73465],[19.07284,50.73708],[19.07153,50.74042],[19.0685,50.74339],[19.06632,50.74233],[19.06392,50.74554],[19.06595,50.7466],[19.06548,50.7496],[19.06202,50.75041],[19.06018,50.74455],[19.04257,50.74466],[19.0333,50.74827],[19.01869,50.76252],[19.01554,50.77044],[19.01101,50.7718],[19.01353,50.77766],[19.01159,50.78077],[19.01081,50.78759],[19.01362,50.79262],[19.01972,50.79555],[19.01896,50.80703],[19.03439,50.80116],[19.03453,50.804],[19.02593,50.80731],[19.02308,50.81499],[19.03154,50.81614],[19.02909,50.82435],[19.03787,50.82584],[19.03921,50.84083],[19.04676,50.84934],[19.05993,50.8532],[19.06209,50.8596],[19.06492,50.86134],[19.08183,50.8554]]],terms_text:"Urząd Miasta Częstochowy"},{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",zoomExtent:[10,20],polygon:[[[19.07732,47.69597],[19.07799,47.69598],[19.09462,47.69446],[19.08056,47.59587],[19.07434,47.58909],[19.07952,47.58883],[19.07717,47.57241],[19.05779,47.57209],[19.07732,47.69597]]],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.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],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.01771,38.45189],[-75.74174,38.44996],[-75.807,39.73907],[-75.75559,39.80106],[-75.64692,39.85638],[-75.47115,39.84646],[-75.37726,39.81478],[-75.48746,39.67181],[-75.50901,39.43446],[-75.39327,39.27784],[-75.30707,39.01667],[-75.19317,38.82219],[-75.05341,38.80876],[-75.01771,38.45189]]],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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.94962,-9.42957],[-37.94834,-9.33972],[-38.03903,-9.33834],[-38.04034,-9.42846],[-37.94962,-9.42957]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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.94577,-21.31404],[-40.6231,-20.86278],[-40.38882,-20.65177],[-40.22209,-20.29831],[-39.80383,-19.66412],[-39.69603,-19.42573],[-39.67304,-19.30437],[-39.70538,-18.61384],[-39.65292,-18.33096],[-40.22281,-17.97587],[-40.34282,-17.9198],[-40.45278,-17.91502],[-40.46499,-17.92049],[-40.48368,-17.90408],[-40.50164,-17.90681],[-40.51602,-17.88903],[-40.53326,-17.88903],[-40.54548,-17.90134],[-40.58932,-17.91502],[-40.58932,-17.93211],[-40.61519,-17.93416],[-40.62956,-17.9868],[-40.64609,-17.9868],[-40.65903,-18.00731],[-40.68777,-18.00594],[-40.70574,-18.01756],[-40.71365,-18.00184],[-40.72155,-17.99774],[-40.75102,-18.00252],[-40.76754,-17.99842],[-40.76754,-17.98133],[-40.80923,-17.94852],[-40.82432,-17.96014],[-40.83151,-17.94989],[-40.86528,-17.9827],[-40.88397,-17.96766],[-40.90912,-17.98475],[-40.77761,-18.10775],[-40.77832,-18.15146],[-40.79054,-18.15351],[-40.8351,-18.14531],[-40.89547,-18.10365],[-40.93283,-18.12755],[-40.95583,-18.1255],[-40.95296,-18.14463],[-40.96014,-18.15009],[-40.96374,-18.14326],[-40.97955,-18.13643],[-40.99248,-18.15009],[-40.99105,-18.16307],[-41.00901,-18.16307],[-41.05788,-18.1658],[-41.05788,-18.17536],[-41.09597,-18.19243],[-41.09597,-18.2054],[-41.1089,-18.21291],[-41.09812,-18.22997],[-41.10531,-18.2327],[-41.09884,-18.25591],[-41.12903,-18.27502],[-41.16137,-18.30572],[-41.15059,-18.37394],[-41.16424,-18.37939],[-41.16424,-18.4019],[-41.15059,-18.40735],[-41.15849,-18.41144],[-41.17358,-18.41144],[-41.18868,-18.44485],[-41.02123,-18.46667],[-41.04638,-18.60362],[-41.03776,-18.61452],[-41.05788,-18.62678],[-41.0471,-18.64857],[-41.03488,-18.65402],[-40.99895,-18.67716],[-40.94505,-18.69418],[-40.94433,-18.76973],[-40.92134,-18.81055],[-40.93715,-18.82347],[-40.94721,-18.82143],[-40.97092,-18.83572],[-41.08375,-18.83232],[-41.10675,-18.83572],[-41.11753,-18.80783],[-41.13118,-18.79286],[-41.23611,-18.7949],[-41.2512,-18.81667],[-41.2476,-18.85544],[-41.2203,-18.87992],[-41.20808,-18.87992],[-41.20664,-18.86632],[-41.16424,-18.867],[-41.15634,-18.88876],[-41.12903,-18.9044],[-41.12112,-18.92412],[-41.0392,-18.98665],[-41.07585,-19.00567],[-41.06507,-19.06342],[-40.96877,-19.12726],[-40.96158,-19.15102],[-40.92996,-19.206],[-40.94649,-19.22296],[-40.94793,-19.24264],[-40.92565,-19.26299],[-40.94936,-19.2786],[-40.92277,-19.31048],[-40.94361,-19.35252],[-40.93427,-19.381],[-40.95727,-19.39184],[-40.9738,-19.42641],[-40.95439,-19.46165],[-40.97883,-19.50298],[-41.01332,-19.50298],[-41.04638,-19.48333],[-41.05429,-19.48401],[-41.04135,-19.56664],[-41.09238,-19.58966],[-41.14627,-19.656],[-41.16496,-19.65871],[-41.17933,-19.6939],[-41.19658,-19.74599],[-41.16999,-19.80618],[-41.18939,-19.82375],[-41.18868,-19.88526],[-41.21239,-19.89743],[-41.22964,-19.90216],[-41.24689,-19.93324],[-41.25479,-19.92919],[-41.26988,-19.93797],[-41.30653,-19.93392],[-41.31516,-19.96972],[-41.3245,-19.97647],[-41.313,-20.01226],[-41.33672,-20.05548],[-41.34822,-20.08653],[-41.3554,-20.12094],[-41.37768,-20.15805],[-41.38702,-20.18638],[-41.41074,-20.19448],[-41.4208,-20.20257],[-41.7636,-20.2046],[-41.78516,-20.28483],[-41.85055,-20.3246],[-41.86349,-20.37513],[-41.85127,-20.38187],[-41.84337,-20.40949],[-41.80887,-20.42498],[-41.80672,-20.47211],[-41.83115,-20.47885],[-41.81103,-20.54212],[-41.83115,-20.55086],[-41.86205,-20.61814],[-41.82109,-20.64437],[-41.85343,-20.68068],[-41.87139,-20.72102],[-41.8678,-20.73849],[-41.88002,-20.73984],[-41.88289,-20.76739],[-41.85415,-20.77478],[-41.83331,-20.7983],[-41.80887,-20.80905],[-41.78444,-20.80569],[-41.75138,-20.82382],[-41.74707,-20.87487],[-41.72335,-20.87554],[-41.74132,-20.92723],[-41.72335,-20.97757],[-41.74347,-21.09763],[-41.7291,-21.12579],[-41.594,-21.16332],[-41.57244,-21.18678],[-41.49051,-21.18879],[-41.48332,-21.20085],[-41.43948,-21.22095],[-41.41289,-21.20956],[-41.34965,-21.21291],[-41.27994,-21.2464],[-41.24473,-21.23234],[-41.17718,-21.25511],[-41.09238,-21.2243],[-41.04854,-21.25913],[-41.01548,-21.25578],[-41.00254,-21.28726],[-40.94577,-21.31404]]],terms_url:"https://der.es.gov.br",terms_text:"Departamento de Estradas de Rodagem do Estado do Espírito Santo",overlay:true},{id:"db-inspire-2013-11",name:"Deutsche Bahn VzG lines January 2017",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2017?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2013-11-01T00:00:00.000Z",startDate:"2013-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",overlay:true},{id:"db-inspire-2015-11",name:"Deutsche Bahn VzG lines Nov 2015",type:"wms",template:"https://wms.michreichert.de/vzg-strecken-2015?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=vzg_strecken,station_codes,level_crossings&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[8.19422,48.97504],[7.97355,49.02623],[7.94677,49.06313],[7.44328,49.18928],[7.05679,49.11163],[6.94302,49.21345],[6.81633,49.16389],[6.68209,49.24061],[6.3501,49.46202],[6.35353,49.57302],[6.42632,49.67177],[6.50254,49.71885],[6.45241,50.61258],[6.03871,50.71215],[6.00369,50.753],[6.05742,50.8559],[6.0787,50.90247],[6.0727,51.06792],[6.17123,51.33853],[6.22548,51.36554],[6.15715,51.5509],[6.12763,51.91069],[6.79985,51.86661],[7.02851,52.31255],[6.72947,52.64179],[7.07486,52.75269],[7.20532,53.18442],[7.04464,53.33106],[6.5173,53.65785],[8.23529,54.99001],[11.92257,54.52963],[14.1679,54.59631],[14.46591,53.24712],[14.14318,52.83946],[14.64375,52.58613],[14.57646,52.32756],[14.74537,52.06577],[14.66847,51.7353],[14.7234,51.53927],[15.03926,51.28745],[14.98845,51.09207],[14.88922,50.93856],[14.81593,50.87729],[14.63671,50.89116],[14.59311,50.91887],[14.57217,51.01076],[14.26283,51.06473],[14.28086,50.98024],[14.22816,50.85796],[13.69532,50.72883],[13.03442,50.50085],[12.49077,50.34582],[12.32632,50.29277],[12.35379,50.21462],[12.32701,50.16363],[12.1677,50.34889],[12.07707,50.2524],[12.18195,50.21136],[12.26014,50.09069],[12.53892,49.4164],[12.88808,49.3385],[13.21287,49.12439],[13.73952,48.83688],[13.45371,48.56222],[13.40555,48.37812],[13.03648,48.25986],[12.71376,48.10856],[12.93108,47.9376],[13.00455,47.84506],[12.90671,47.73249],[13.05228,47.59329],[12.15792,47.7087],[12.20393,47.61667],[12.17783,47.59815],[11.61753,47.60093],[11.26666,47.39124],[10.9247,47.46811],[10.91578,47.55623],[10.59031,47.5567],[10.29848,47.39937],[9.78144,47.61274],[9.74024,47.52842],[9.00278,47.69137],[8.68933,47.72371],[8.63809,47.70261],[8.63079,47.69359],[8.62127,47.69177],[8.62414,47.68221],[8.61243,47.68115],[8.35382,47.61367],[8.27485,47.619],[8.23709,47.61023],[8.22808,47.60583],[8.20284,47.61555],[8.10834,47.58251],[8.08568,47.5583],[8.06714,47.56444],[8.04981,47.55645],[8.02749,47.55112],[7.98097,47.55494],[7.91917,47.54787],[7.88862,47.58888],[7.81257,47.57122],[7.79455,47.55558],[7.71404,47.54063],[7.66043,47.54485],[7.65219,47.54702],[7.63439,47.56173],[7.61499,47.55669],[7.5834,47.57048],[7.58559,47.5845],[7.59366,47.60048],[7.58761,47.608],[7.51491,47.6652],[7.5434,47.81539],[7.57671,48.02454],[7.56812,48.06012],[7.80639,48.52438],[7.79987,48.58029],[7.80665,48.60106],[8.11014,48.84977],[8.19422,48.97504]]],terms_url:"https://data.deutschebahn.com/dataset/data-streckennetz",terms_text:"Data CC-BY 4.0 Deutsche Bahn AG",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",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Premium is a mosaic composed of DigitalGlobe basemap with select regions filled with +Vivid or custom area of interest imagery, 50cm resolution or better, and refreshed more frequently with ongoing updates.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",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",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/DigitalGlobe",terms_text:"Terms & Feedback","default":true,description:"DigitalGlobe-Standard is a curated set of imagery covering 86% of the earth’s landmass, with 30-60cm resolution where available, backfilled by Landsat. Average age is 2.31 years, with some areas updated 2x per year.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/world/DigitalGlobePremiumImagery.png",overlay:true},{id:"drone-imagery-2014",name:"Drone Imagery 2014 (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_2014/{zoom}/{x}/{y}",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[-72.3286,18.69461],[-72.33034,18.69412],[-72.33117,18.69284],[-72.33413,18.68542],[-72.33452,18.68414],[-72.33443,18.68355],[-72.33375,18.68235],[-72.32147,18.67721],[-72.32027,18.67698],[-72.31909,18.67713],[-72.3183,18.67804],[-72.31508,18.68457],[-72.31394,18.689],[-72.31553,18.68993],[-72.3286,18.69461]],[[-72.34695,18.61833],[-72.34553,18.62166],[-72.34355,18.62447],[-72.34245,18.62553],[-72.34076,18.62658],[-72.33786,18.62639],[-72.33649,18.62597],[-72.33589,18.62504],[-72.33482,18.62559],[-72.33472,18.6255],[-72.33459,18.62513],[-72.33343,18.62438],[-72.33174,18.62469],[-72.3313,18.62457],[-72.33126,18.62321],[-72.33088,18.62276],[-72.33066,18.62277],[-72.32985,18.62345],[-72.32862,18.62186],[-72.32829,18.6218],[-72.32817,18.62193],[-72.32809,18.6218],[-72.32734,18.62261],[-72.32541,18.62101],[-72.32422,18.62122],[-72.32396,18.61869],[-72.32354,18.61815],[-72.32325,18.61818],[-72.32351,18.61877],[-72.32058,18.62031],[-72.32043,18.61993],[-72.31978,18.62066],[-72.31807,18.61907],[-72.31742,18.61958],[-72.31523,18.61782],[-72.31463,18.61844],[-72.31324,18.6165],[-72.31275,18.61677],[-72.31232,18.6172],[-72.31198,18.61704],[-72.31042,18.61764],[-72.31062,18.61564],[-72.30996,18.61526],[-72.30936,18.61623],[-72.30786,18.61542],[-72.30669,18.61623],[-72.30604,18.61704],[-72.30419,18.61545],[-72.30288,18.61688],[-72.30191,18.61637],[-72.30131,18.61552],[-72.30118,18.6158],[-72.30087,18.61546],[-72.30076,18.61567],[-72.30062,18.6156],[-72.30012,18.61609],[-72.29198,18.61365],[-72.29194,18.61347],[-72.29143,18.61342],[-72.29094,18.61323],[-72.29105,18.61199],[-72.29057,18.61152],[-72.28772,18.61145],[-72.28801,18.6096],[-72.2865,18.60968],[-72.28635,18.60799],[-72.28448,18.60844],[-72.28436,18.60789],[-72.283,18.60808],[-72.283,18.60658],[-72.2828,18.60676],[-72.2816,18.60537],[-72.28106,18.60533],[-72.27973,18.60682],[-72.27805,18.60525],[-72.27793,18.6053],[-72.2778,18.60524],[-72.2772,18.60638],[-72.27589,18.60564],[-72.27544,18.60629],[-72.27385,18.60508],[-72.27341,18.60508],[-72.27241,18.60593],[-72.27099,18.60442],[-72.27047,18.60429],[-72.27038,18.60446],[-72.27024,18.60427],[-72.27011,18.60433],[-72.26862,18.60368],[-72.26778,18.6037],[-72.26751,18.60429],[-72.2655,18.60318],[-72.26539,18.60336],[-72.26515,18.60309],[-72.26471,18.603],[-72.26436,18.60331],[-72.26312,18.60193],[-72.26258,18.60188],[-72.262,18.60251],[-72.26139,18.60184],[-72.26106,18.60182],[-72.26106,18.60148],[-72.26014,18.6005],[-72.25994,18.60049],[-72.25803,18.60079],[-72.2576,18.60054],[-72.25691,18.60094],[-72.25413,18.59992],[-72.25093,18.59739],[-72.25062,18.59676],[-72.25033,18.59701],[-72.24451,18.59231],[-72.24215,18.58872],[-72.24167,18.58756],[-72.24077,18.58654],[-72.24147,18.58592],[-72.2413,18.58543],[-72.2395,18.58424],[-72.24007,18.58358],[-72.2382,18.58197],[-72.23868,18.58157],[-72.2385,18.58119],[-72.23703,18.58054],[-72.23612,18.57894],[-72.23646,18.57825],[-72.23636,18.5777],[-72.23467,18.57684],[-72.2353,18.57562],[-72.235,18.57499],[-72.23335,18.57423],[-72.23399,18.57293],[-72.23182,18.57169],[-72.23188,18.57137],[-72.23175,18.57127],[-72.23198,18.5708],[-72.23072,18.5694],[-72.23097,18.56874],[-72.23082,18.56844],[-72.23046,18.56855],[-72.23009,18.56754],[-72.22942,18.56715],[-72.22972,18.56651],[-72.22961,18.566],[-72.22908,18.56612],[-72.22848,18.56396],[-72.22818,18.56395],[-72.22733,18.56421],[-72.2265,18.56179],[-72.22623,18.56191],[-72.22436,18.55908],[-72.22471,18.55882],[-72.22357,18.55689],[-72.22379,18.55675],[-72.22325,18.55579],[-72.22387,18.55544],[-72.22382,18.55528],[-72.22458,18.55483],[-72.22453,18.55439],[-72.22625,18.55408],[-72.22705,18.55349],[-72.22692,18.55333],[-72.2271,18.55324],[-72.22687,18.55273],[-72.22592,18.55308],[-72.22465,18.55027],[-72.22483,18.5501],[-72.22457,18.54956],[-72.22327,18.55014],[-72.22261,18.54869],[-72.2208,18.54918],[-72.22051,18.54852],[-72.22034,18.54865],[-72.2201,18.54845],[-72.21952,18.54876],[-72.21862,18.54755],[-72.2174,18.5478],[-72.21714,18.54733],[-72.21694,18.54734],[-72.21583,18.54517],[-72.21505,18.54533],[-72.21477,18.54494],[-72.21442,18.54218],[-72.21421,18.54233],[-72.21293,18.5401],[-72.21199,18.5404],[-72.21188,18.54025],[-72.21145,18.53781],[-72.21085,18.53797],[-72.21028,18.53545],[-72.20993,18.53465],[-72.20942,18.53478],[-72.20942,18.53456],[-72.20851,18.53472],[-72.2057,18.53039],[-72.20444,18.52693],[-72.20438,18.52643],[-72.20418,18.52637],[-72.20399,18.52572],[-72.20263,18.5222],[-72.20182,18.5197],[-72.20148,18.51742],[-72.20301,18.51606],[-72.20503,18.51506],[-72.20767,18.51432],[-72.20936,18.5142],[-72.2095,18.51448],[-72.21082,18.51416],[-72.21095,18.51444],[-72.21189,18.51412],[-72.21266,18.51403],[-72.21277,18.51417],[-72.21462,18.51393],[-72.21697,18.51569],[-72.21731,18.51648],[-72.21787,18.51642],[-72.21818,18.51975],[-72.21798,18.51984],[-72.21909,18.52189],[-72.22031,18.52152],[-72.22096,18.52382],[-72.22209,18.52355],[-72.22251,18.52685],[-72.22229,18.52693],[-72.22271,18.52726],[-72.22289,18.52707],[-72.2231,18.52722],[-72.22404,18.52681],[-72.22551,18.52936],[-72.22596,18.5297],[-72.22642,18.52964],[-72.2265,18.53018],[-72.2275,18.53118],[-72.22673,18.53171],[-72.22885,18.53383],[-72.22811,18.53435],[-72.22981,18.53623],[-72.22912,18.5367],[-72.22935,18.53731],[-72.23059,18.53875],[-72.23222,18.54189],[-72.23215,18.5421],[-72.23258,18.54324],[-72.23311,18.54304],[-72.2342,18.54558],[-72.23436,18.5455],[-72.23554,18.54776],[-72.23571,18.54779],[-72.23601,18.54899],[-72.23839,18.55165],[-72.23747,18.55231],[-72.23951,18.55397],[-72.23918,18.55413],[-72.2407,18.55661],[-72.24014,18.5568],[-72.24079,18.55824],[-72.24063,18.55835],[-72.24067,18.55845],[-72.24117,18.55815],[-72.24161,18.55898],[-72.24216,18.55882],[-72.24242,18.56062],[-72.24262,18.56101],[-72.24294,18.56089],[-72.24399,18.56371],[-72.24466,18.56356],[-72.24475,18.56413],[-72.24536,18.56445],[-72.2449,18.56525],[-72.24518,18.56549],[-72.245,18.56581],[-72.24499,18.56607],[-72.24543,18.56633],[-72.24559,18.56618],[-72.24588,18.56662],[-72.24687,18.56727],[-72.24662,18.56749],[-72.24781,18.56897],[-72.24728,18.56938],[-72.24859,18.57137],[-72.24894,18.57159],[-72.24865,18.57222],[-72.2488,18.57219],[-72.24885,18.5723],[-72.24945,18.57197],[-72.25068,18.57411],[-72.25147,18.5737],[-72.25251,18.57598],[-72.25339,18.57551],[-72.25491,18.57848],[-72.25462,18.57863],[-72.25467,18.57878],[-72.25505,18.57894],[-72.25495,18.57913],[-72.256,18.58074],[-72.2563,18.58054],[-72.25752,18.58237],[-72.25769,18.58227],[-72.2578,18.5824],[-72.25808,18.5823],[-72.25857,18.5821],[-72.25862,18.58222],[-72.25889,18.58219],[-72.25894,18.58302],[-72.25958,18.58445],[-72.25984,18.58472],[-72.26072,18.58443],[-72.26094,18.58565],[-72.2622,18.58722],[-72.26351,18.58643],[-72.2643,18.58738],[-72.26474,18.58708],[-72.26594,18.58862],[-72.26756,18.58877],[-72.26742,18.58917],[-72.27039,18.58893],[-72.27021,18.5903],[-72.2722,18.59048],[-72.27211,18.59145],[-72.27381,18.59188],[-72.27384,18.59168],[-72.27729,18.59169],[-72.28014,18.59129],[-72.28059,18.59048],[-72.28106,18.59071],[-72.28226,18.58989],[-72.28286,18.59047],[-72.28367,18.58966],[-72.28401,18.59014],[-72.28468,18.59029],[-72.2851,18.58997],[-72.2857,18.59062],[-72.28661,18.59068],[-72.28681,18.59014],[-72.28728,18.59032],[-72.28741,18.59013],[-72.28801,18.59052],[-72.28991,18.59071],[-72.29077,18.58997],[-72.29196,18.59186],[-72.2945,18.59148],[-72.29454,18.59361],[-72.29654,18.59322],[-72.29689,18.59586],[-72.2976,18.59675],[-72.29824,18.59722],[-72.29871,18.5962],[-72.30053,18.59733],[-72.30081,18.59675],[-72.30113,18.59691],[-72.30131,18.59676],[-72.30175,18.59721],[-72.30303,18.59774],[-72.3033,18.59729],[-72.30394,18.59761],[-72.30394,18.59736],[-72.30555,18.59794],[-72.30598,18.59756],[-72.30703,18.59838],[-72.30723,18.59799],[-72.30862,18.59833],[-72.30938,18.59752],[-72.31013,18.5981],[-72.31037,18.59739],[-72.3121,18.5983],[-72.3122,18.59807],[-72.31424,18.59902],[-72.31456,18.59873],[-72.31524,18.59922],[-72.31681,18.59952],[-72.31662,18.60004],[-72.31958,18.60072],[-72.31907,18.60202],[-72.32042,18.60247],[-72.32061,18.60242],[-72.32082,18.60267],[-72.3211,18.6027],[-72.32105,18.60298],[-72.32144,18.60347],[-72.32368,18.60322],[-72.32375,18.60432],[-72.32584,18.60436],[-72.32588,18.60522],[-72.32617,18.60585],[-72.32864,18.60525],[-72.32897,18.60527],[-72.32916,18.60727],[-72.33006,18.60812],[-72.3294,18.60867],[-72.33004,18.60959],[-72.33282,18.60949],[-72.33258,18.61058],[-72.33302,18.61005],[-72.3335,18.61054],[-72.33477,18.61035],[-72.33485,18.61167],[-72.33735,18.61174],[-72.33725,18.61237],[-72.33767,18.61298],[-72.34038,18.61306],[-72.34016,18.6138],[-72.34153,18.61384],[-72.34258,18.61457],[-72.3426,18.61512],[-72.34306,18.61499],[-72.34682,18.61792],[-72.34695,18.61833]],[[-72.72363,19.09461],[-72.72302,19.09518],[-72.72206,19.0965],[-72.72169,19.09612],[-72.72164,19.0962],[-72.72132,19.09609],[-72.72073,19.0967],[-72.7198,19.09587],[-72.71965,19.09591],[-72.7197,19.09601],[-72.71955,19.09602],[-72.71911,19.09623],[-72.71906,19.09627],[-72.71904,19.09625],[-72.71888,19.09631],[-72.71886,19.09626],[-72.71817,19.09643],[-72.71776,19.09679],[-72.71756,19.09657],[-72.71693,19.09705],[-72.71713,19.09735],[-72.71495,19.0988],[-72.71479,19.09852],[-72.71483,19.09849],[-72.7148,19.0984],[-72.71455,19.09859],[-72.71449,19.09851],[-72.71413,19.09877],[-72.71413,19.09893],[-72.71419,19.09891],[-72.71417,19.09978],[-72.71324,19.09971],[-72.71287,19.09974],[-72.71295,19.09967],[-72.71278,19.09968],[-72.71278,19.09977],[-72.71282,19.09976],[-72.71285,19.09988],[-72.71266,19.09989],[-72.71266,19.09987],[-72.71245,19.09987],[-72.71182,19.09991],[-72.71178,19.10012],[-72.71157,19.10009],[-72.71147,19.10102],[-72.71042,19.10086],[-72.71039,19.10119],[-72.7103,19.1012],[-72.71031,19.10151],[-72.7097,19.10156],[-72.7097,19.10162],[-72.70917,19.10169],[-72.70917,19.1021],[-72.70828,19.10211],[-72.70809,19.10289],[-72.70788,19.10284],[-72.70798,19.10367],[-72.70724,19.1038],[-72.70731,19.10501],[-72.70723,19.10501],[-72.70736,19.10565],[-72.70637,19.10584],[-72.7062,19.10714],[-72.70588,19.10706],[-72.70591,19.10747],[-72.7053,19.10757],[-72.7054,19.10813],[-72.70568,19.10809],[-72.70568,19.10928],[-72.70591,19.11013],[-72.70589,19.11022],[-72.70574,19.11025],[-72.70574,19.11116],[-72.70538,19.11114],[-72.70557,19.11247],[-72.70499,19.11256],[-72.70537,19.11361],[-72.7047,19.11388],[-72.70496,19.11563],[-72.70418,19.11564],[-72.70442,19.11762],[-72.70371,19.11764],[-72.70371,19.1178],[-72.70352,19.11779],[-72.70339,19.12227],[-72.70264,19.12205],[-72.70253,19.12301],[-72.70289,19.12592],[-72.70308,19.12595],[-72.70316,19.12864],[-72.70234,19.12997],[-72.70206,19.1301],[-72.69987,19.1305],[-72.69325,19.13064],[-72.687,19.13075],[-72.68456,19.13073],[-72.68338,19.13056],[-72.6828,19.1297],[-72.68203,19.1283],[-72.68201,19.12715],[-72.68158,19.12714],[-72.68187,19.12508],[-72.68185,19.12507],[-72.68215,19.12414],[-72.68253,19.12295],[-72.68265,19.12243],[-72.68263,19.12185],[-72.68302,19.12185],[-72.68301,19.12132],[-72.68286,19.12133],[-72.68293,19.11947],[-72.68251,19.11946],[-72.68256,19.11803],[-72.68265,19.11751],[-72.68265,19.11703],[-72.68318,19.11704],[-72.68319,19.11685],[-72.68371,19.11687],[-72.68384,19.11684],[-72.684,19.11685],[-72.68398,19.11689],[-72.68426,19.11688],[-72.68426,19.11679],[-72.68481,19.11674],[-72.68546,19.11667],[-72.68557,19.11664],[-72.68551,19.11664],[-72.6856,19.11662],[-72.68595,19.11658],[-72.68596,19.11654],[-72.68608,19.11654],[-72.68661,19.11663],[-72.68662,19.11656],[-72.68713,19.11665],[-72.68721,19.11666],[-72.68721,19.11663],[-72.6878,19.11666],[-72.68779,19.11659],[-72.68833,19.11663],[-72.68832,19.11658],[-72.68928,19.11657],[-72.6897,19.11656],[-72.68998,19.11644],[-72.6902,19.11644],[-72.69019,19.11615],[-72.69027,19.11563],[-72.69029,19.11541],[-72.69017,19.11543],[-72.69018,19.11493],[-72.69018,19.11458],[-72.69019,19.11445],[-72.69022,19.11433],[-72.6902,19.11406],[-72.68972,19.11398],[-72.68968,19.11397],[-72.68973,19.11415],[-72.68974,19.1142],[-72.68937,19.11417],[-72.68872,19.11412],[-72.688,19.11412],[-72.68758,19.11409],[-72.68759,19.11401],[-72.68736,19.11403],[-72.68711,19.11406],[-72.68682,19.11406],[-72.68677,19.11405],[-72.68591,19.11422],[-72.68554,19.11421],[-72.68557,19.11369],[-72.68554,19.11308],[-72.68533,19.11314],[-72.6852,19.11316],[-72.68519,19.1132],[-72.68504,19.11325],[-72.68495,19.1127],[-72.68474,19.11278],[-72.68468,19.11277],[-72.68446,19.11281],[-72.68416,19.1128],[-72.6836,19.11254],[-72.68353,19.11102],[-72.68363,19.11007],[-72.68338,19.11003],[-72.68344,19.10974],[-72.68295,19.1096],[-72.68305,19.10892],[-72.68111,19.10826],[-72.68112,19.1081],[-72.67965,19.10781],[-72.67968,19.10765],[-72.67923,19.10749],[-72.67916,19.10802],[-72.67838,19.10755],[-72.67779,19.10753],[-72.67775,19.10769],[-72.67623,19.10765],[-72.67606,19.10762],[-72.67621,19.10797],[-72.67549,19.10804],[-72.67548,19.1079],[-72.67431,19.10804],[-72.67432,19.10795],[-72.67398,19.10794],[-72.67382,19.10798],[-72.6739,19.10864],[-72.67319,19.10856],[-72.67307,19.10852],[-72.67284,19.10855],[-72.67276,19.10855],[-72.67286,19.10907],[-72.67284,19.10915],[-72.67251,19.10903],[-72.67236,19.10906],[-72.6723,19.10905],[-72.67224,19.10913],[-72.67179,19.10912],[-72.67051,19.10679],[-72.6704,19.10401],[-72.67048,19.10396],[-72.67032,19.10223],[-72.67034,19.1016],[-72.67062,19.09856],[-72.67121,19.09697],[-72.67278,19.09595],[-72.67277,19.09629],[-72.67364,19.09636],[-72.6736,19.09662],[-72.67484,19.09623],[-72.67489,19.09666],[-72.67566,19.09655],[-72.67566,19.09648],[-72.67655,19.09642],[-72.67772,19.09626],[-72.67786,19.09675],[-72.67784,19.09689],[-72.67826,19.09677],[-72.67837,19.09698],[-72.67858,19.09698],[-72.67853,19.09665],[-72.67878,19.09666],[-72.67861,19.09635],[-72.67927,19.09633],[-72.67973,19.0962],[-72.68015,19.09604],[-72.68058,19.09598],[-72.68029,19.09501],[-72.68072,19.095],[-72.68066,19.09474],[-72.68048,19.09418],[-72.68037,19.09335],[-72.68064,19.09335],[-72.68064,19.09266],[-72.67973,19.09263],[-72.67972,19.09269],[-72.67943,19.09266],[-72.67966,19.09132],[-72.67977,19.09107],[-72.68249,19.0892],[-72.68272,19.08907],[-72.68506,19.0888],[-72.68508,19.08888],[-72.68616,19.08873],[-72.6862,19.08887],[-72.68718,19.08866],[-72.68717,19.0886],[-72.68849,19.08844],[-72.68852,19.08847],[-72.69006,19.0884],[-72.69018,19.08871],[-72.69227,19.08828],[-72.69229,19.08887],[-72.69218,19.08924],[-72.69222,19.08928],[-72.69277,19.08923],[-72.69279,19.08933],[-72.69335,19.08934],[-72.69289,19.0888],[-72.69274,19.0883],[-72.69496,19.08857],[-72.69571,19.08831],[-72.69579,19.08892],[-72.69625,19.08904],[-72.69649,19.08889],[-72.69849,19.08845],[-72.69849,19.08866],[-72.6988,19.08858],[-72.69885,19.08895],[-72.69884,19.08903],[-72.69926,19.08895],[-72.70023,19.08884],[-72.70023,19.08893],[-72.70088,19.08892],[-72.7014,19.08887],[-72.70128,19.08828],[-72.70257,19.08859],[-72.70282,19.08874],[-72.70309,19.08883],[-72.70293,19.08855],[-72.70341,19.08862],[-72.70557,19.08863],[-72.70552,19.08906],[-72.70665,19.08889],[-72.70666,19.08938],[-72.70902,19.08917],[-72.70898,19.0891],[-72.71116,19.08894],[-72.71121,19.0892],[-72.71281,19.08912],[-72.71286,19.0898],[-72.71502,19.08882],[-72.71569,19.08838],[-72.71573,19.08847],[-72.7161,19.08824],[-72.71598,19.08795],[-72.71653,19.0877],[-72.71653,19.08761],[-72.71579,19.08781],[-72.71676,19.08727],[-72.71671,19.08717],[-72.71815,19.08638],[-72.71795,19.08602],[-72.71954,19.08518],[-72.71954,19.08511],[-72.72217,19.08467],[-72.72327,19.08506],[-72.72622,19.08712],[-72.72763,19.0891],[-72.72752,19.08973],[-72.72548,19.09295],[-72.72482,19.09403],[-72.72399,19.09495],[-72.72363,19.09461]],[[-72.06537,19.65239],[-72.06565,19.6518],[-72.06603,19.65128],[-72.06697,19.65109],[-72.0676,19.6511],[-72.07102,19.65223],[-72.0719,19.65254],[-72.07189,19.65255],[-72.07264,19.6528],[-72.07262,19.65284],[-72.07268,19.65286],[-72.07269,19.65283],[-72.0733,19.65305],[-72.07393,19.65327],[-72.07416,19.65347],[-72.07418,19.65351],[-72.07435,19.65395],[-72.07432,19.65425],[-72.07419,19.65495],[-72.07399,19.65583],[-72.07384,19.65648],[-72.07307,19.65805],[-72.07274,19.65866],[-72.0727,19.65869],[-72.07228,19.65915],[-72.07221,19.65917],[-72.07196,19.65916],[-72.0714,19.65909],[-72.07012,19.65866],[-72.07017,19.65856],[-72.06983,19.65852],[-72.06984,19.65848],[-72.06939,19.65841],[-72.06944,19.65823],[-72.06941,19.65823],[-72.06937,19.65836],[-72.06842,19.65807],[-72.06707,19.65759],[-72.06451,19.65663],[-72.06434,19.65632],[-72.06421,19.65547],[-72.06422,19.65541],[-72.06472,19.65379],[-72.06487,19.65351],[-72.06537,19.65239]],[[-72.23222,18.69173],[-72.23182,18.69172],[-72.23115,18.69168],[-72.23128,18.69161],[-72.23072,18.69152],[-72.23068,18.69147],[-72.23135,18.69159],[-72.23157,18.69149],[-72.23162,18.69137],[-72.23165,18.69134],[-72.23165,18.69164],[-72.23222,18.69173]],[[-72.2406,18.69192],[-72.23953,18.6921],[-72.23891,18.69207],[-72.23878,18.69207],[-72.23856,18.692],[-72.23818,18.69192],[-72.23186,18.69054],[-72.22977,18.69113],[-72.21709,18.68967],[-72.21618,18.68724],[-72.21599,18.68673],[-72.21602,18.68659],[-72.2159,18.68601],[-72.21581,18.68593],[-72.21561,18.68483],[-72.21569,18.6847],[-72.21578,18.68435],[-72.21595,18.68347],[-72.21629,18.68289],[-72.2164,18.68221],[-72.21633,18.68211],[-72.21641,18.68208],[-72.21642,18.68189],[-72.21694,18.6813],[-72.21685,18.68096],[-72.21693,18.68099],[-72.21722,18.68091],[-72.21734,18.6808],[-72.21731,18.67964],[-72.21749,18.67958],[-72.21749,18.67946],[-72.21747,18.67908],[-72.21743,18.67853],[-72.21739,18.6785],[-72.21718,18.6786],[-72.2171,18.67856],[-72.21708,18.67838],[-72.21724,18.67767],[-72.21724,18.67745],[-72.21721,18.67744],[-72.21681,18.67754],[-72.21671,18.67688],[-72.21662,18.67612],[-72.21642,18.67621],[-72.21601,18.67548],[-72.21596,18.67551],[-72.21589,18.67549],[-72.21552,18.6756],[-72.2154,18.67561],[-72.21529,18.6757],[-72.21521,18.67571],[-72.21491,18.67472],[-72.21464,18.67387],[-72.21456,18.6737],[-72.21447,18.67348],[-72.21413,18.67301],[-72.21427,18.67293],[-72.21413,18.67271],[-72.21383,18.67278],[-72.21339,18.67181],[-72.21178,18.67209],[-72.21169,18.67172],[-72.21135,18.67183],[-72.21116,18.67196],[-72.21077,18.67121],[-72.21058,18.67129],[-72.20984,18.66963],[-72.20972,18.6697],[-72.20966,18.66968],[-72.20918,18.66838],[-72.20895,18.66773],[-72.2093,18.66606],[-72.20937,18.66571],[-72.20974,18.66536],[-72.21031,18.66477],[-72.21021,18.66416],[-72.21042,18.66401],[-72.2111,18.66329],[-72.21167,18.66268],[-72.21179,18.66236],[-72.21206,18.66242],[-72.21193,18.66185],[-72.21188,18.66155],[-72.21199,18.66147],[-72.21239,18.66137],[-72.21331,18.66103],[-72.21393,18.66039],[-72.21376,18.65992],[-72.21355,18.65956],[-72.21376,18.65943],[-72.21349,18.65869],[-72.21296,18.65736],[-72.21357,18.6572],[-72.21312,18.65639],[-72.21281,18.65534],[-72.21317,18.6551],[-72.21308,18.65459],[-72.21347,18.65438],[-72.21374,18.65436],[-72.21382,18.65416],[-72.2135,18.65353],[-72.21304,18.65171],[-72.21345,18.65143],[-72.21341,18.65133],[-72.21364,18.65105],[-72.21418,18.65077],[-72.21378,18.65016],[-72.21364,18.64989],[-72.21372,18.64975],[-72.21429,18.64943],[-72.21379,18.64934],[-72.21362,18.64922],[-72.21382,18.64869],[-72.21354,18.64765],[-72.21331,18.64717],[-72.21366,18.64552],[-72.21389,18.64539],[-72.21377,18.6451],[-72.214,18.64399],[-72.21412,18.64378],[-72.21437,18.64347],[-72.2158,18.64222],[-72.21601,18.64217],[-72.21761,18.64218],[-72.21778,18.64272],[-72.21798,18.64256],[-72.21816,18.64236],[-72.21821,18.6422],[-72.22119,18.64222],[-72.22125,18.6423],[-72.22135,18.64224],[-72.2215,18.64223],[-72.22293,18.64229],[-72.22299,18.64235],[-72.22311,18.64227],[-72.22717,18.64249],[-72.22828,18.64281],[-72.22811,18.6432],[-72.22848,18.64325],[-72.22919,18.64258],[-72.2304,18.64263],[-72.23711,18.64295],[-72.23719,18.64317],[-72.23807,18.64322],[-72.23828,18.64298],[-72.23988,18.64306],[-72.24332,18.6434],[-72.24367,18.64387],[-72.24518,18.64437],[-72.2456,18.64364],[-72.24562,18.64372],[-72.24574,18.64363],[-72.24723,18.64378],[-72.24853,18.64441],[-72.24918,18.64397],[-72.25155,18.64418],[-72.25382,18.64516],[-72.2546,18.64564],[-72.25517,18.64642],[-72.2554,18.64807],[-72.25531,18.64812],[-72.2552,18.64828],[-72.2555,18.64881],[-72.25586,18.64847],[-72.25603,18.64856],[-72.25625,18.64848],[-72.25685,18.64755],[-72.25965,18.64494],[-72.26253,18.64336],[-72.26304,18.64362],[-72.26388,18.64308],[-72.26486,18.64445],[-72.26525,18.64373],[-72.26533,18.64378],[-72.26576,18.64259],[-72.26652,18.64289],[-72.26641,18.64135],[-72.26714,18.64137],[-72.26737,18.6407],[-72.26824,18.64023],[-72.26853,18.6403],[-72.26901,18.63988],[-72.26908,18.63978],[-72.26948,18.63958],[-72.27214,18.63895],[-72.27383,18.63988],[-72.27375,18.64004],[-72.27476,18.64088],[-72.27501,18.64054],[-72.27622,18.64161],[-72.27639,18.64131],[-72.27652,18.64138],[-72.27845,18.643],[-72.27896,18.64273],[-72.2823,18.64457],[-72.28387,18.64607],[-72.28384,18.64611],[-72.28412,18.64641],[-72.28401,18.64647],[-72.28455,18.6471],[-72.28538,18.64803],[-72.28569,18.64785],[-72.28642,18.64857],[-72.28724,18.64936],[-72.28775,18.65003],[-72.28724,18.65028],[-72.28768,18.65089],[-72.28708,18.65122],[-72.28656,18.65188],[-72.28736,18.6532],[-72.2872,18.65332],[-72.2873,18.65355],[-72.28905,18.65383],[-72.28882,18.65459],[-72.28889,18.6546],[-72.28878,18.65512],[-72.29013,18.65481],[-72.29084,18.65766],[-72.2902,18.65767],[-72.29076,18.66015],[-72.28998,18.66022],[-72.29045,18.66151],[-72.29022,18.66161],[-72.29033,18.66256],[-72.29138,18.66227],[-72.29155,18.66276],[-72.29368,18.66243],[-72.29377,18.663],[-72.29441,18.66289],[-72.29444,18.66273],[-72.29656,18.66246],[-72.29662,18.66262],[-72.29708,18.66261],[-72.29692,18.66184],[-72.30025,18.66195],[-72.30141,18.66311],[-72.30141,18.66397],[-72.30192,18.66392],[-72.30197,18.66454],[-72.30311,18.66471],[-72.30471,18.66632],[-72.30471,18.66668],[-72.30505,18.66666],[-72.30529,18.66692],[-72.30519,18.66768],[-72.30607,18.66759],[-72.30749,18.66901],[-72.30782,18.67109],[-72.30784,18.67216],[-72.30757,18.67405],[-72.30716,18.67526],[-72.30674,18.67537],[-72.30687,18.67599],[-72.30657,18.67612],[-72.30611,18.67602],[-72.30585,18.67705],[-72.30607,18.67726],[-72.3061,18.67744],[-72.30635,18.678],[-72.30609,18.67871],[-72.30587,18.67881],[-72.3059,18.67951],[-72.30556,18.68062],[-72.30395,18.68368],[-72.30377,18.68373],[-72.30139,18.68415],[-72.29912,18.68452],[-72.29899,18.68432],[-72.29826,18.6844],[-72.29828,18.6845],[-72.29502,18.68412],[-72.29419,18.68422],[-72.29408,18.68376],[-72.29202,18.68398],[-72.29191,18.68364],[-72.29101,18.68377],[-72.29095,18.68347],[-72.29037,18.68378],[-72.29035,18.68363],[-72.28936,18.68384],[-72.28913,18.68345],[-72.28766,18.6835],[-72.2877,18.68329],[-72.28538,18.68344],[-72.2849,18.68243],[-72.28449,18.68243],[-72.28376,18.68198],[-72.28268,18.68186],[-72.2822,18.68284],[-72.28268,18.68296],[-72.28164,18.68413],[-72.28111,18.68523],[-72.28129,18.68628],[-72.28089,18.68726],[-72.28036,18.68726],[-72.28036,18.68762],[-72.2715,18.688],[-72.2715,18.68774],[-72.27171,18.6875],[-72.27193,18.68611],[-72.2713,18.68611],[-72.27115,18.68635],[-72.27115,18.68735],[-72.26903,18.68805],[-72.26661,18.68821],[-72.26315,18.68817],[-72.25798,18.6868],[-72.25503,18.68501],[-72.25415,18.68242],[-72.25408,18.68278],[-72.25266,18.68732],[-72.25106,18.68819],[-72.24828,18.68927],[-72.24695,18.68917],[-72.24718,18.68966],[-72.24628,18.68966],[-72.24632,18.68997],[-72.24527,18.69032],[-72.24487,18.69045],[-72.24361,18.69036],[-72.24351,18.69029],[-72.24321,18.6903],[-72.24318,18.69051],[-72.24324,18.69061],[-72.24325,18.691],[-72.24303,18.69122],[-72.24166,18.69171],[-72.24149,18.69178],[-72.2406,18.69192]],[[-72.27545,18.56614],[-72.27419,18.56701],[-72.27356,18.56701],[-72.27297,18.56706],[-72.27227,18.56707],[-72.27191,18.56707],[-72.27178,18.56718],[-72.2709,18.56724],[-72.27064,18.56724],[-72.26998,18.56708],[-72.26875,18.56671],[-72.2684,18.56661],[-72.26809,18.56639],[-72.26781,18.56611],[-72.26744,18.5652],[-72.26739,18.56308],[-72.26738,18.5626],[-72.26742,18.56195],[-72.26799,18.56064],[-72.26822,18.56014],[-72.26856,18.55975],[-72.26871,18.55962],[-72.2702,18.55963],[-72.27181,18.55967],[-72.27491,18.55982],[-72.27579,18.55986],[-72.27588,18.55999],[-72.2758,18.56491],[-72.27578,18.56541],[-72.27575,18.56556],[-72.27552,18.56608],[-72.27545,18.56614]],[[-72.33318,18.56014],[-72.33166,18.55959],[-72.33021,18.55904],[-72.32919,18.55866],[-72.3292,18.55861],[-72.32887,18.55838],[-72.32868,18.55826],[-72.3282,18.55827],[-72.32815,18.55828],[-72.3261,18.55752],[-72.32604,18.5575],[-72.32604,18.55745],[-72.32589,18.55732],[-72.32551,18.5573],[-72.32437,18.55688],[-72.32411,18.55678],[-72.32379,18.55662],[-72.32348,18.55633],[-72.32315,18.55628],[-72.32174,18.55556],[-72.32143,18.55541],[-72.3205,18.55488],[-72.32019,18.5547],[-72.32007,18.55453],[-72.31984,18.55412],[-72.31984,18.55385],[-72.31998,18.55322],[-72.32046,18.55124],[-72.32056,18.55083],[-72.32066,18.55047],[-72.32068,18.55039],[-72.32111,18.54857],[-72.32127,18.54791],[-72.32147,18.54719],[-72.32153,18.54699],[-72.322,18.5458],[-72.32203,18.54575],[-72.32354,18.54486],[-72.3236,18.54483],[-72.3236,18.54481],[-72.32486,18.54407],[-72.32534,18.54378],[-72.32533,18.5439],[-72.32534,18.54392],[-72.32555,18.54416],[-72.32588,18.54452],[-72.3259,18.54453],[-72.32621,18.54452],[-72.3266,18.54452],[-72.32666,18.54398],[-72.32669,18.54367],[-72.32666,18.54361],[-72.32666,18.54356],[-72.32669,18.54356],[-72.32677,18.5436],[-72.32704,18.54363],[-72.32714,18.5432],[-72.32713,18.54314],[-72.32704,18.54317],[-72.32697,18.54316],[-72.32698,18.54296],[-72.32697,18.54293],[-72.32697,18.54281],[-72.32728,18.54263],[-72.32814,18.5424],[-72.32864,18.54226],[-72.3297,18.54228],[-72.32979,18.54228],[-72.33174,18.54279],[-72.33242,18.54298],[-72.33329,18.54319],[-72.33328,18.54321],[-72.33529,18.54372],[-72.33589,18.54387],[-72.33689,18.54504],[-72.33734,18.54555],[-72.33761,18.546],[-72.33783,18.54639],[-72.33788,18.54658],[-72.33791,18.54693],[-72.33792,18.54705],[-72.33763,18.54705],[-72.33749,18.54705],[-72.33751,18.54753],[-72.33751,18.54764],[-72.33747,18.54764],[-72.33748,18.54773],[-72.33742,18.54773],[-72.33739,18.54776],[-72.33735,18.54773],[-72.33734,18.54774],[-72.33726,18.54774],[-72.33725,18.54782],[-72.33725,18.54804],[-72.33728,18.548],[-72.3373,18.54798],[-72.3373,18.54796],[-72.33737,18.54788],[-72.33739,18.54789],[-72.33741,18.5478],[-72.33744,18.5478],[-72.33755,18.5477],[-72.33752,18.54764],[-72.33773,18.54741],[-72.33775,18.54741],[-72.33775,18.54737],[-72.33789,18.54721],[-72.3389,18.54828],[-72.33902,18.54842],[-72.34008,18.55026],[-72.34014,18.55034],[-72.34028,18.55068],[-72.34041,18.55099],[-72.34029,18.55156],[-72.34021,18.55185],[-72.33985,18.55283],[-72.33973,18.55315],[-72.33927,18.55425],[-72.33914,18.55457],[-72.33915,18.55458],[-72.3391,18.5547],[-72.33896,18.55506],[-72.33847,18.55626],[-72.33842,18.55625],[-72.33844,18.55631],[-72.33832,18.55661],[-72.33822,18.55686],[-72.33821,18.55687],[-72.33816,18.55699],[-72.33815,18.55698],[-72.33807,18.557],[-72.33803,18.557],[-72.33806,18.55726],[-72.338,18.55742],[-72.33716,18.5593],[-72.33709,18.55945],[-72.33843,18.55931],[-72.33929,18.55922],[-72.33982,18.55941],[-72.33983,18.55943],[-72.34028,18.55975],[-72.34092,18.5598],[-72.34096,18.5598],[-72.34413,18.5609],[-72.3446,18.56107],[-72.34472,18.56111],[-72.34472,18.56109],[-72.34829,18.5623],[-72.34912,18.5626],[-72.35035,18.56335],[-72.35302,18.56496],[-72.35333,18.56616],[-72.35351,18.56901],[-72.35337,18.56949],[-72.35156,18.57185],[-72.35042,18.57341],[-72.35036,18.57338],[-72.34849,18.57592],[-72.34815,18.57636],[-72.34756,18.57636],[-72.34753,18.57634],[-72.34746,18.57647],[-72.34745,18.57639],[-72.34705,18.57703],[-72.34659,18.57672],[-72.34649,18.57683],[-72.34544,18.57618],[-72.34365,18.57629],[-72.34361,18.57636],[-72.34354,18.57631],[-72.34258,18.5764],[-72.34252,18.57699],[-72.3428,18.57707],[-72.343,18.57715],[-72.3429,18.57737],[-72.34338,18.5774],[-72.34321,18.57803],[-72.34324,18.57803],[-72.3432,18.57816],[-72.3444,18.57852],[-72.34395,18.57972],[-72.34414,18.57976],[-72.34377,18.58067],[-72.34424,18.58074],[-72.34398,18.58155],[-72.34388,18.58181],[-72.34392,18.5818],[-72.34371,18.5823],[-72.34375,18.58229],[-72.34371,18.58237],[-72.34283,18.58355],[-72.3424,18.58413],[-72.34238,18.58411],[-72.34234,18.58411],[-72.34209,18.58403],[-72.34207,18.58434],[-72.342,18.58433],[-72.34192,18.58474],[-72.34192,18.58477],[-72.34118,18.58575],[-72.3408,18.58627],[-72.34024,18.58655],[-72.33983,18.58675],[-72.33542,18.58843],[-72.33539,18.58845],[-72.33539,18.58843],[-72.33517,18.58851],[-72.3346,18.58806],[-72.33372,18.58896],[-72.33361,18.58917],[-72.33295,18.58941],[-72.33253,18.58912],[-72.33252,18.58916],[-72.33168,18.58889],[-72.33157,18.5891],[-72.33152,18.58918],[-72.33153,18.58917],[-72.33152,18.5892],[-72.33158,18.58929],[-72.33161,18.58934],[-72.33136,18.58951],[-72.33134,18.58953],[-72.33135,18.58954],[-72.3313,18.58963],[-72.33132,18.58976],[-72.33112,18.58977],[-72.33118,18.58983],[-72.33097,18.59017],[-72.33011,18.5905],[-72.32965,18.59068],[-72.32418,18.59182],[-72.3238,18.59189],[-72.32228,18.59068],[-72.32079,18.58947],[-72.32076,18.58801],[-72.32078,18.588],[-72.32078,18.58706],[-72.32073,18.58691],[-72.32073,18.58626],[-72.32092,18.58625],[-72.32081,18.58589],[-72.32074,18.58593],[-72.3207,18.58531],[-72.32114,18.58437],[-72.32185,18.58274],[-72.32202,18.58277],[-72.3222,18.58276],[-72.32211,18.58251],[-72.32196,18.58249],[-72.32242,18.5815],[-72.32245,18.5815],[-72.32295,18.58034],[-72.32368,18.579],[-72.32465,18.57947],[-72.32575,18.57852],[-72.32661,18.5778],[-72.32721,18.57838],[-72.32824,18.57817],[-72.32848,18.57756],[-72.32855,18.5776],[-72.32938,18.57666],[-72.32907,18.57629],[-72.32936,18.57607],[-72.32877,18.57563],[-72.32975,18.57451],[-72.32968,18.57443],[-72.32989,18.57408],[-72.32994,18.57359],[-72.3296,18.57363],[-72.32997,18.57247],[-72.33009,18.57153],[-72.33017,18.57152],[-72.33047,18.57045],[-72.3314,18.57052],[-72.33167,18.56999],[-72.33027,18.56999],[-72.33025,18.57003],[-72.33006,18.57004],[-72.3297,18.57],[-72.32981,18.56877],[-72.32877,18.56765],[-72.32858,18.56749],[-72.32877,18.56711],[-72.32912,18.5668],[-72.32897,18.56664],[-72.32938,18.56572],[-72.32946,18.56554],[-72.33052,18.56424],[-72.33056,18.56424],[-72.33056,18.5642],[-72.33105,18.56367],[-72.33112,18.56374],[-72.33111,18.56376],[-72.33117,18.56377],[-72.33131,18.56391],[-72.33153,18.5641],[-72.33154,18.56385],[-72.33161,18.56365],[-72.33168,18.56329],[-72.33169,18.56322],[-72.33171,18.56319],[-72.33181,18.5628],[-72.33187,18.5626],[-72.33299,18.56123],[-72.33318,18.561],[-72.33365,18.56064],[-72.33393,18.56042],[-72.33367,18.56033],[-72.33367,18.56027],[-72.33332,18.56011],[-72.33318,18.56014]],[[-72.31173,18.56168],[-72.31195,18.56259],[-72.31221,18.56365],[-72.31259,18.56628],[-72.31254,18.5663],[-72.31264,18.56654],[-72.31266,18.56682],[-72.3127,18.56687],[-72.31276,18.56734],[-72.31256,18.56746],[-72.31232,18.56754],[-72.31229,18.56757],[-72.31199,18.5677],[-72.31216,18.56801],[-72.31227,18.56815],[-72.31231,18.56828],[-72.31239,18.56841],[-72.31291,18.56909],[-72.31281,18.56916],[-72.31306,18.56945],[-72.31309,18.56956],[-72.31323,18.57061],[-72.31325,18.57137],[-72.31325,18.57213],[-72.31234,18.57268],[-72.31117,18.57341],[-72.30971,18.5739],[-72.30911,18.5739],[-72.30894,18.57369],[-72.3086,18.57389],[-72.30712,18.57389],[-72.307,18.57357],[-72.30666,18.57388],[-72.30605,18.57389],[-72.30581,18.57367],[-72.30555,18.57388],[-72.3007,18.57387],[-72.30059,18.57369],[-72.30044,18.57386],[-72.29691,18.57388],[-72.29518,18.57386],[-72.295,18.57371],[-72.29473,18.57341],[-72.29387,18.5722],[-72.29341,18.57156],[-72.29338,18.57142],[-72.2933,18.57075],[-72.29338,18.57008],[-72.29349,18.56992],[-72.29361,18.56978],[-72.29361,18.56985],[-72.29378,18.56959],[-72.29364,18.56957],[-72.29345,18.56951],[-72.29358,18.56919],[-72.29389,18.56859],[-72.29373,18.56847],[-72.29359,18.56827],[-72.29359,18.5681],[-72.29379,18.5679],[-72.29403,18.56774],[-72.29387,18.56762],[-72.29368,18.56743],[-72.29396,18.56457],[-72.29411,18.56426],[-72.29401,18.56418],[-72.29402,18.5638],[-72.29412,18.56283],[-72.29451,18.56209],[-72.29462,18.56196],[-72.29767,18.5617],[-72.29849,18.56192],[-72.29864,18.56184],[-72.29857,18.56174],[-72.2988,18.56157],[-72.30144,18.56133],[-72.30181,18.56176],[-72.30228,18.56125],[-72.30275,18.56122],[-72.30427,18.56126],[-72.30505,18.56147],[-72.30522,18.5613],[-72.30609,18.56132],[-72.30821,18.56138],[-72.31173,18.56168]]]},{id:"DroneImageryCanaanHaitiNovember2015",name:"Drone Imagery Canaan(Haiti) November 2015",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/haiti_canaan_nov2015/{zoom}/{x}/{y}",endDate:"2015-11-01T00:00:00.000Z",startDate:"2015-11-01T00:00:00.000Z",polygon:[[[-72.23109,18.67676],[-72.23101,18.67675],[-72.23108,18.67675],[-72.23104,18.67669],[-72.23105,18.67665],[-72.23151,18.67663],[-72.23153,18.67665],[-72.23146,18.67676],[-72.23285,18.67669],[-72.23506,18.67641],[-72.23507,18.67638],[-72.23507,18.67635],[-72.23505,18.67635],[-72.23511,18.6762],[-72.23509,18.67614],[-72.23523,18.67613],[-72.23522,18.67611],[-72.23523,18.67606],[-72.2352,18.67598],[-72.23515,18.6758],[-72.23629,18.67565],[-72.23625,18.67553],[-72.23624,18.67551],[-72.23648,18.67548],[-72.23648,18.67565],[-72.23648,18.67581],[-72.23689,18.67575],[-72.2372,18.67571],[-72.23747,18.67567],[-72.23772,18.67563],[-72.23805,18.6756],[-72.23854,18.67555],[-72.23888,18.67552],[-72.239,18.67551],[-72.23897,18.67565],[-72.23897,18.67571],[-72.23901,18.67576],[-72.239,18.67576],[-72.23902,18.67584],[-72.23905,18.67589],[-72.23929,18.67587],[-72.23981,18.67581],[-72.24059,18.67571],[-72.24142,18.67561],[-72.24177,18.67556],[-72.24179,18.67553],[-72.2421,18.67551],[-72.24272,18.67545],[-72.24276,18.67536],[-72.24278,18.67537],[-72.24279,18.67537],[-72.24299,18.67536],[-72.24334,18.67535],[-72.24339,18.67535],[-72.2434,18.67534],[-72.24372,18.67532],[-72.24424,18.67525],[-72.24443,18.67509],[-72.2474,18.67253],[-72.24731,18.67233],[-72.24681,18.67157],[-72.2469,18.67061],[-72.24652,18.67055],[-72.24661,18.66991],[-72.24669,18.66991],[-72.24688,18.66884],[-72.24707,18.66789],[-72.24709,18.66749],[-72.24728,18.66743],[-72.24716,18.66691],[-72.24717,18.66642],[-72.24703,18.66644],[-72.24701,18.66616],[-72.24971,18.66598],[-72.24947,18.66475],[-72.24989,18.66489],[-72.24989,18.66507],[-72.25113,18.66515],[-72.25102,18.66548],[-72.25111,18.66548],[-72.25111,18.66559],[-72.25219,18.66551],[-72.25387,18.66554],[-72.25387,18.66563],[-72.25551,18.66559],[-72.25638,18.66484],[-72.25719,18.66359],[-72.25763,18.66208],[-72.25768,18.65694],[-72.25779,18.64996],[-72.25713,18.64563],[-72.25696,18.64517],[-72.25564,18.64352],[-72.2493,18.64358],[-72.2482,18.64361],[-72.24637,18.64397],[-72.24629,18.64462],[-72.24454,18.64436],[-72.24442,18.64527],[-72.24311,18.6455],[-72.24326,18.64639],[-72.24286,18.64794],[-72.24272,18.64801],[-72.24282,18.6482],[-72.24257,18.64894],[-72.24109,18.64902],[-72.24109,18.64918],[-72.2405,18.64906],[-72.24036,18.6495],[-72.2403,18.64863],[-72.23753,18.64915],[-72.23664,18.64899],[-72.23666,18.64883],[-72.23582,18.64888],[-72.23488,18.64878],[-72.23487,18.64893],[-72.2338,18.649],[-72.23384,18.64932],[-72.23262,18.64927],[-72.2325,18.64824],[-72.23028,18.64837],[-72.23028,18.64821],[-72.22743,18.64815],[-72.2263,18.64775],[-72.22608,18.64845],[-72.22583,18.64841],[-72.22576,18.64828],[-72.22417,18.64849],[-72.22417,18.64805],[-72.22166,18.64804],[-72.21921,18.6485],[-72.21767,18.64995],[-72.21719,18.6509],[-72.21637,18.65422],[-72.21633,18.65888],[-72.21633,18.66198],[-72.2171,18.66448],[-72.21737,18.66441],[-72.21814,18.66454],[-72.21864,18.66568],[-72.21837,18.66588],[-72.21881,18.66817],[-72.21881,18.66893],[-72.21846,18.66888],[-72.21884,18.67018],[-72.22015,18.67173],[-72.22175,18.67311],[-72.22175,18.67288],[-72.2225,18.67317],[-72.22257,18.67357],[-72.22241,18.67368],[-72.22489,18.67588],[-72.2287,18.67693],[-72.23073,18.6768],[-72.23111,18.67678],[-72.23109,18.67676]]]},{id:"drone-imagery-2016",name:"Drone Imagery Matthew(Haiti) October 2016",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/haiti_uav_201610/{zoom}/{x}/{y}",endDate:"2016-10-01T00:00:00.000Z",startDate:"2016-10-01T00:00:00.000Z",polygon:[[[-74.11291,18.64948],[-74.10903,18.64598],[-74.10873,18.64446],[-74.1095,18.64452],[-74.1095,18.64181],[-74.10968,18.64187],[-74.11053,18.64103],[-74.10988,18.64034],[-74.11005,18.64014],[-74.11005,18.64009],[-74.11011,18.64002],[-74.10949,18.63959],[-74.1095,18.63924],[-74.10904,18.63926],[-74.10894,18.63917],[-74.10905,18.63912],[-74.10898,18.63899],[-74.10782,18.63839],[-74.10823,18.63775],[-74.10812,18.63764],[-74.10786,18.63774],[-74.10768,18.63733],[-74.10748,18.63719],[-74.10722,18.63559],[-74.10901,18.63394],[-74.11678,18.62847],[-74.11952,18.62815],[-74.12251,18.63132],[-74.12731,18.63703],[-74.12684,18.6374],[-74.12731,18.63771],[-74.12768,18.63756],[-74.13403,18.64671],[-74.13401,18.64897],[-74.13087,18.65167],[-74.13076,18.65153],[-74.13053,18.65179],[-74.13054,18.65195],[-74.12878,18.65342],[-74.1274,18.65412],[-74.12514,18.65497],[-74.11997,18.65432],[-74.11938,18.65429],[-74.11291,18.64948]],[[-74.11305,18.4922],[-74.10884,18.49216],[-74.10118,18.49095],[-74.10105,18.49057],[-74.10131,18.4902],[-74.10101,18.48996],[-74.10142,18.48933],[-74.10099,18.48931],[-74.1009,18.48886],[-74.10166,18.48725],[-74.10108,18.48713],[-74.10133,18.48664],[-74.10058,18.48654],[-74.10048,18.48552],[-74.10062,18.4849],[-74.10037,18.48478],[-74.10012,18.4827],[-74.09994,18.48123],[-74.10033,18.48114],[-74.10242,18.48116],[-74.10492,18.48149],[-74.10771,18.48189],[-74.1099,18.48226],[-74.10987,18.48243],[-74.10992,18.48246],[-74.11018,18.48232],[-74.11196,18.48261],[-74.11247,18.48278],[-74.11316,18.48382],[-74.1134,18.48521],[-74.11349,18.48709],[-74.11338,18.48704],[-74.11336,18.48717],[-74.11349,18.48727],[-74.11355,18.48931],[-74.11349,18.48949],[-74.1135,18.48951],[-74.11349,18.48952],[-74.11347,18.48951],[-74.11334,18.48957],[-74.11336,18.48962],[-74.11341,18.48958],[-74.11344,18.48959],[-74.11349,18.48956],[-74.11352,18.48957],[-74.11355,18.48956],[-74.11357,18.48998],[-74.11359,18.49067],[-74.11354,18.49108],[-74.11322,18.492],[-74.11305,18.4922]],[[-74.10198,18.24954],[-74.09767,18.24744],[-74.09419,18.2474],[-74.09338,18.24885],[-74.09638,18.25292],[-74.09934,18.25335],[-74.10198,18.24954]],[[-74.02901,18.59744],[-74.02881,18.60255],[-74.00847,18.60182],[-74.00867,18.59671],[-74.02901,18.59744]],[[-73.91991,18.07466],[-73.91468,18.07482],[-73.91535,18.07742],[-73.91478,18.08009],[-73.91997,18.08014],[-73.91924,18.07802],[-73.91999,18.07637],[-73.91991,18.07466]],[[-74.22365,18.3081],[-74.22061,18.30272],[-74.21902,18.30278],[-74.21592,18.30364],[-74.21615,18.30804],[-74.22365,18.3081]],[[-74.00508,18.17646],[-74.00072,18.17657],[-74.00186,18.18175],[-74.00269,18.18344],[-74.00653,18.18336],[-74.00715,18.18218],[-74.00649,18.18056],[-74.0052,18.17922],[-74.00508,18.17646]],[[-74.0653,18.22881],[-74.06361,18.2268],[-74.06114,18.22672],[-74.05968,18.22853],[-74.06281,18.23083],[-74.06446,18.23034],[-74.0653,18.22881]],[[-74.11371,18.47184],[-74.11002,18.47177],[-74.10959,18.47536],[-74.11341,18.47497],[-74.11371,18.47184]],[[-73.95852,18.47452],[-73.95446,18.47465],[-73.95548,18.4794],[-73.95965,18.47878],[-73.95852,18.47452]],[[-74.16719,18.27229],[-74.16196,18.27232],[-74.16175,18.27303],[-74.16255,18.27452],[-74.16372,18.27542],[-74.16341,18.27749],[-74.16404,18.27854],[-74.16756,18.27868],[-74.16742,18.27592],[-74.16775,18.27416],[-74.16719,18.27229]],[[-74.11091,18.45286],[-74.10701,18.45258],[-74.10684,18.4586],[-74.11102,18.45781],[-74.11091,18.45286]],[[-73.76854,18.18022],[-73.75773,18.18006],[-73.73559,18.19311],[-73.73567,18.20143],[-73.74563,18.20191],[-73.74468,18.22311],[-73.77121,18.22417],[-73.77129,18.20844],[-73.76915,18.2064],[-73.76854,18.18022]],[[-74.13455,18.60914],[-74.1388,18.60929],[-74.13871,18.61165],[-74.13447,18.6115],[-74.13455,18.60914]],[[-74.04228,18.20945],[-74.042,18.20484],[-74.04155,18.20239],[-74.03959,18.20051],[-74.03836,18.20028],[-74.03764,18.20242],[-74.03792,18.20562],[-74.03918,18.20932],[-74.04228,18.20945]],[[-74.08668,18.61121],[-74.08669,18.61217],[-74.09146,18.61689],[-74.09211,18.61603],[-74.09313,18.61699],[-74.09603,18.62025],[-74.09627,18.6206],[-74.0967,18.62202],[-74.09337,18.62651],[-74.09237,18.62754],[-74.08862,18.62596],[-74.08863,18.62561],[-74.08778,18.62561],[-74.08661,18.6251],[-74.08662,18.62368],[-74.08514,18.62367],[-74.08462,18.62289],[-74.08463,18.62175],[-74.08339,18.62174],[-74.08261,18.62057],[-74.08262,18.61982],[-74.07659,18.6198],[-74.07658,18.61596],[-74.07255,18.61591],[-74.07259,18.61403],[-74.07062,18.61402],[-74.06858,18.6129],[-74.06855,18.61208],[-74.06614,18.61207],[-74.06414,18.61206],[-74.0625,18.61105],[-74.06254,18.61011],[-74.05927,18.61013],[-74.0545,18.60876],[-74.05451,18.60817],[-74.05168,18.60816],[-74.04932,18.60776],[-74.04647,18.60664],[-74.04646,18.6062],[-74.04243,18.6062],[-74.04133,18.60592],[-74.03625,18.60378],[-74.03597,18.60345],[-74.03642,18.60252],[-74.03719,18.6019],[-74.04003,18.60217],[-74.05608,18.60473],[-74.05851,18.6054],[-74.05861,18.60623],[-74.0611,18.60627],[-74.06481,18.60745],[-74.06518,18.60686],[-74.06679,18.60802],[-74.0696,18.60885],[-74.07142,18.60711],[-74.07239,18.60736],[-74.07515,18.61024],[-74.07701,18.61019],[-74.07798,18.61096],[-74.07901,18.61013],[-74.08109,18.61234],[-74.08234,18.60896],[-74.08383,18.60922],[-74.08513,18.60977],[-74.08668,18.61121]],[[-74.45922,18.4663],[-74.45589,18.46471],[-74.44779,18.47],[-74.44693,18.4713],[-74.44726,18.47934],[-74.44554,18.47915],[-74.44515,18.48326],[-74.43968,18.4839],[-74.439,18.48762],[-74.44299,18.49004],[-74.44906,18.49104],[-74.45382,18.49311],[-74.45571,18.49635],[-74.45786,18.49725],[-74.46052,18.49523],[-74.46241,18.49143],[-74.46198,18.48799],[-74.45537,18.48597],[-74.45526,18.47111],[-74.45944,18.46871],[-74.45922,18.4663]],[[-74.41888,18.57551],[-74.41499,18.57331],[-74.41045,18.57648],[-74.40824,18.58233],[-74.40954,18.58894],[-74.4112,18.59195],[-74.41081,18.59689],[-74.41663,18.60063],[-74.42178,18.59671],[-74.42146,18.59416],[-74.41745,18.59419],[-74.41753,18.59067],[-74.41538,18.59002],[-74.41533,18.58382],[-74.41652,18.58382],[-74.41756,18.5814],[-74.41756,18.57967],[-74.41924,18.57754],[-74.41888,18.57551]]]},{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.92791,49.53196],[10.97194,49.52969],[10.97821,49.53568],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03663,49.57167],[11.04029,49.58572],[11.07287,49.58587],[11.07243,49.63486],[11.0054,49.6344],[11.00397,49.62599],[10.9748,49.62541],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],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.92791,49.53196],[10.9726,49.52939],[10.97909,49.53475],[10.99934,49.53589],[11.03214,49.53089],[11.04425,49.54317],[11.03842,49.55239],[11.03743,49.57873],[11.0568,49.592],[11.05748,49.61358],[11.04681,49.61447],[11.04788,49.6187],[11.00308,49.62367],[10.98107,49.62339],[10.98069,49.62617],[10.96737,49.62781],[10.96539,49.63415],[10.94293,49.64563],[10.92532,49.64876],[10.91002,49.63793],[10.92235,49.60463],[10.91949,49.57823],[10.91135,49.57095],[10.91256,49.5606],[10.92907,49.55674],[10.92791,49.53196]]],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.53765],[10.99101,49.53392],[10.99389,49.53835],[11.02784,49.53254],[11.0346,49.53462],[11.03407,49.53759],[11.04318,49.54321],[11.03557,49.55303],[11.0384,49.55842],[11.03508,49.56929],[11.03791,49.58659],[11.04797,49.5902],[11.04922,49.5937],[11.05749,49.59521],[11.05623,49.59905],[11.05127,49.6003],[11.05351,49.60904],[11.04309,49.61381],[11.04076,49.61823],[11.0285,49.61735],[11.01929,49.61896],[11.0152,49.61372],[11.00581,49.61448],[11.00639,49.61931],[11.00083,49.6221],[10.9856,49.61651],[10.97837,49.61753],[10.9737,49.62495],[10.96539,49.62557],[10.96063,49.62856],[10.96382,49.63176],[10.95474,49.6379],[10.94837,49.637],[10.94185,49.64377],[10.9273,49.64837],[10.92063,49.63963],[10.91136,49.63773],[10.92429,49.60505],[10.92205,49.58004],[10.91221,49.57008],[10.91441,49.5618],[10.92353,49.55842],[10.92712,49.55976],[10.93345,49.55892],[10.93071,49.54467],[10.93067,49.53225],[10.9406,49.53325],[10.95488,49.53021],[10.97199,49.53126],[10.97664,49.53765]]],terms_text:"© Stadt Erlangen | © Geocart GmbH",best:true},{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}",zoomExtent:[0,22],terms_url:"https://wiki.openstreetmap.org/wiki/Esri",terms_text:"Terms & Feedback","default":true,description:"Esri world imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{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}",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/world/EsriImageryClarity.png"},{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.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti põhikaart"},{id:"Maaamet-Estonia_Cadastre",name:"Estonia Cadastre (Maaamet)",type:"wms",template:"https://kaart.maaamet.ee/wms/alus-geo?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=of10000,TOPOYKSUS_6569,TOPOYKSUS_6573&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti katastrikaart ortofoto alusel"},{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:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],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:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],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",zoomExtent:[6,18],polygon:[[[22.35364,58.85385],[22.09411,58.85038],[22.09179,58.8951],[22.00503,58.89371],[21.99979,58.98374],[22.34754,58.98845],[22.34535,59.03337],[22.51935,59.03538],[22.51556,59.1251],[22.69017,59.12686],[22.69212,59.08218],[22.77912,59.083],[22.78083,59.03814],[22.86808,59.03877],[22.8693,58.99399],[22.9563,58.99487],[22.95495,59.03959],[23.12895,59.04097],[23.12786,59.08582],[23.47671,59.0877],[23.47415,59.26726],[23.64924,59.26788],[23.64888,59.31281],[23.73698,59.313],[23.73649,59.3578],[23.91158,59.35787],[23.91207,59.4028],[24.176,59.4028],[24.17637,59.4478],[24.26446,59.44767],[24.26471,59.49236],[24.70605,59.49082],[24.70898,59.62553],[24.79744,59.62497],[24.79659,59.58009],[24.97327,59.57885],[24.97462,59.62386],[24.88603,59.62473],[24.88725,59.66918],[24.9762,59.66863],[24.9773,59.71346],[25.06601,59.71259],[25.0632,59.62306],[25.24037,59.62145],[25.24184,59.66647],[25.33055,59.66548],[25.32884,59.62078],[25.41755,59.61979],[25.41938,59.66468],[25.6855,59.66148],[25.68757,59.70613],[25.86511,59.70386],[25.86279,59.65901],[26.12855,59.65507],[26.12575,59.6101],[26.39114,59.60565],[26.38809,59.56099],[26.82967,59.55215],[26.82626,59.50729],[26.91423,59.50549],[26.91057,59.46051],[27.96689,59.43303],[27.9719,59.4778],[28.03669,59.4757],[28.04377,59.47223],[28.04767,59.46578],[28.05182,59.46342],[28.06915,59.46256],[28.08452,59.45939],[28.12174,59.44091],[28.13577,59.4277],[28.13711,59.42267],[28.14163,59.41901],[28.16652,59.41205],[28.17225,59.40789],[28.19275,59.4015],[28.21069,59.3836],[28.21069,59.37994],[28.20386,59.37459],[28.21057,59.37235],[28.21105,59.36937],[28.20678,59.36719],[28.20703,59.36377],[28.19971,59.36091],[28.20203,59.35731],[28.19263,59.35227],[28.19397,59.34642],[28.16969,59.33354],[28.13626,59.29244],[28.12515,59.28901],[28.11722,59.28895],[28.1099,59.29063],[28.05353,59.2902],[28.02022,59.28334],[27.99825,59.2753],[27.97983,59.27293],[27.96433,59.27268],[27.95335,59.26863],[27.9492,59.26533],[27.90564,59.24044],[27.90113,59.23488],[27.901,59.22639],[27.89783,59.21746],[27.90235,59.20728],[27.89234,59.19222],[27.88978,59.18379],[27.87648,59.17372],[27.87184,59.16841],[27.86818,59.16159],[27.84414,59.14814],[27.83206,59.14401],[27.82035,59.13362],[27.80986,59.12905],[27.80595,59.12166],[27.80534,59.1127],[27.81071,59.10819],[27.8101,59.10606],[27.80205,59.1028],[27.78887,59.0909],[27.7907,59.08112],[27.79375,59.07842],[27.79411,59.07566],[27.79277,59.0729],[27.79302,59.06927],[27.7885,59.06657],[27.78265,59.065],[27.77508,59.0581],[27.77313,59.05107],[27.77667,59.04743],[27.76983,59.03325],[27.76605,59.03155],[27.75153,59.03017],[27.74628,59.02716],[27.74567,59.01705],[27.74165,59.00951],[27.74787,58.99267],[27.74274,58.98845],[27.73213,58.9855],[27.6544,58.98783],[27.65501,58.99241],[27.39414,58.99964],[27.38974,58.95474],[27.12935,58.96135],[27.12557,58.9164],[27.03882,58.91841],[27.0271,58.7841],[27.11361,58.78183],[27.10934,58.73709],[27.19537,58.73512],[27.18731,58.64533],[27.27309,58.64305],[27.25259,58.41883],[27.53397,58.41142],[27.5552,58.36575],[27.51762,58.33265],[27.51408,58.32214],[27.49993,58.32246],[27.48687,58.18803],[27.52872,58.18687],[27.59205,58.11875],[27.63695,58.09735],[27.60938,58.05399],[27.62268,58.0058],[27.64489,58.00205],[27.65294,58.00644],[27.64781,58.01426],[27.64781,58.02086],[27.66172,58.01866],[27.66856,58.01045],[27.68393,58.00845],[27.6965,58.0045],[27.70065,57.99862],[27.69882,57.98827],[27.69125,57.98549],[27.68064,57.97449],[27.6821,57.9719],[27.68893,57.97184],[27.68588,57.95928],[27.65892,57.9554],[27.66758,57.951],[27.67161,57.94627],[27.66917,57.94174],[27.67649,57.93552],[27.68247,57.93655],[27.68613,57.92794],[27.68247,57.92437],[27.71078,57.92392],[27.72029,57.92036],[27.72054,57.91174],[27.70834,57.90616],[27.69882,57.90616],[27.70614,57.90136],[27.72896,57.90739],[27.74677,57.90169],[27.7536,57.90409],[27.75739,57.90318],[27.75592,57.89806],[27.76959,57.89566],[27.78094,57.89832],[27.799,57.89961],[27.81852,57.89579],[27.82096,57.89047],[27.81949,57.888],[27.81059,57.88612],[27.81827,57.88249],[27.81169,57.87204],[27.81583,57.87166],[27.8184,57.8651],[27.81632,57.86134],[27.79875,57.85205],[27.7946,57.84634],[27.80058,57.8442],[27.7957,57.84017],[27.78862,57.84186],[27.78411,57.83725],[27.77715,57.8325],[27.75849,57.83536],[27.74165,57.82679],[27.72383,57.83179],[27.70541,57.84192],[27.68771,57.83419],[27.66636,57.83653],[27.66026,57.83893],[27.64818,57.8377],[27.63634,57.83978],[27.62487,57.83751],[27.62207,57.83874],[27.59791,57.83328],[27.56252,57.83023],[27.5563,57.83127],[27.55227,57.82113],[27.54446,57.82204],[27.5452,57.81808],[27.55056,57.81769],[27.55667,57.81366],[27.5408,57.81288],[27.54471,57.808],[27.53726,57.80644],[27.53958,57.80144],[27.53592,57.79663],[27.53861,57.79396],[27.52921,57.78856],[27.5175,57.78876],[27.51847,57.79201],[27.50298,57.78798],[27.50005,57.78973],[27.4959,57.78869],[27.50774,57.78349],[27.51457,57.77516],[27.5081,57.77158],[27.51115,57.76416],[27.51591,57.7639],[27.52018,57.75993],[27.52811,57.75818],[27.53007,57.75368],[27.53116,57.74073],[27.548,57.7333],[27.5419,57.73037],[27.52799,57.72946],[27.5236,57.71616],[27.52762,57.70899],[27.5236,57.70802],[27.51652,57.70873],[27.51066,57.71101],[27.50859,57.70723],[27.49993,57.70495],[27.49529,57.70749],[27.48711,57.7191],[27.47357,57.71545],[27.47064,57.70802],[27.46149,57.70619],[27.44807,57.71616],[27.43086,57.70756],[27.42818,57.69902],[27.41341,57.69915],[27.41647,57.69524],[27.40744,57.69276],[27.40231,57.68493],[27.39133,57.68539],[27.39377,57.67913],[27.39145,57.67671],[27.38193,57.67332],[27.37779,57.66836],[27.38364,57.66059],[27.3801,57.65883],[27.38755,57.6555],[27.38047,57.6495],[27.38352,57.64799],[27.38157,57.64368],[27.39072,57.6431],[27.38816,57.64009],[27.40085,57.63742],[27.40317,57.62905],[27.40182,57.62376],[27.39597,57.62115],[27.39023,57.62036],[27.39084,57.6169],[27.40195,57.61775],[27.40634,57.61546],[27.40683,57.61246],[27.38572,57.60304],[27.37827,57.59513],[27.35692,57.59696],[27.3413,57.58984],[27.34179,57.58539],[27.32886,57.5797],[27.32141,57.57898],[27.3341,57.56596],[27.33178,57.56066],[27.33776,57.56007],[27.33886,57.54671],[27.34386,57.5454],[27.35472,57.52575],[27.35131,57.51632],[27.34569,57.52104],[27.32446,57.52274],[27.29664,57.53859],[27.28017,57.53643],[27.2737,57.54311],[27.26431,57.54377],[27.2637,57.54841],[27.25772,57.54979],[27.24796,57.54769],[27.2249,57.55385],[27.19329,57.54966],[27.16145,57.55922],[27.11654,57.56118],[27.10092,57.5653],[27.08506,57.57538],[27.07262,57.57734],[27.07225,57.57989],[27.0559,57.58251],[27.05285,57.58087],[27.04687,57.58048],[27.04492,57.58251],[27.0332,57.58532],[27.04126,57.58761],[27.04418,57.5967],[27.03101,57.60461],[26.99513,57.60461],[26.99233,57.61076],[26.98696,57.60867],[26.98366,57.61174],[26.97549,57.612],[26.97097,57.60448],[26.9595,57.60625],[26.9578,57.60468],[26.94596,57.60272],[26.93961,57.60932],[26.95133,57.61579],[26.94999,57.62056],[26.94059,57.61978],[26.92961,57.62376],[26.92644,57.6331],[26.90679,57.63304],[26.89971,57.63056],[26.90057,57.62918],[26.89581,57.62572],[26.88849,57.62357],[26.88898,57.62193],[26.87458,57.61906],[26.87275,57.61736],[26.86555,57.61592],[26.85786,57.60997],[26.86469,57.6084],[26.85811,57.60049],[26.85994,57.59598],[26.86433,57.59415],[26.86177,57.59108],[26.84688,57.5884],[26.83504,57.58244],[26.81589,57.58153],[26.80954,57.58473],[26.79685,57.58179],[26.79929,57.58002],[26.79295,57.57315],[26.78685,57.57525],[26.7766,57.55994],[26.76915,57.56039],[26.76354,57.56314],[26.75366,57.56249],[26.75817,57.5653],[26.76891,57.57041],[26.77379,57.57473],[26.76769,57.57754],[26.74804,57.5778],[26.75317,57.58009],[26.73816,57.58774],[26.72901,57.58016],[26.73828,57.57584],[26.73072,57.56903],[26.72388,57.57244],[26.71107,57.56596],[26.69972,57.57106],[26.69753,57.5706],[26.69741,57.56733],[26.69155,57.56615],[26.67569,57.56668],[26.67105,57.56327],[26.6719,57.55385],[26.66531,57.55287],[26.64652,57.55391],[26.64262,57.54658],[26.63444,57.54357],[26.61443,57.52909],[26.61712,57.50885],[26.60467,57.51212],[26.60479,57.51442],[26.5954,57.51376],[26.59479,57.51592],[26.58808,57.51619],[26.59015,57.52516],[26.58698,57.52621],[26.58771,57.53781],[26.58381,57.53957],[26.57978,57.53695],[26.57966,57.53375],[26.56123,57.5285],[26.56184,57.52261],[26.5666,57.51946],[26.55794,57.5137],[26.52585,57.51619],[26.49961,57.52451],[26.49095,57.54534],[26.46996,57.57551],[26.40151,57.57237],[26.34489,57.58408],[26.33476,57.5797],[26.32781,57.57963],[26.32635,57.58277],[26.3117,57.58473],[26.30853,57.59291],[26.3006,57.59343],[26.29291,57.59114],[26.28352,57.59232],[26.28217,57.5952],[26.27754,57.595],[26.27034,57.6001],[26.27022,57.60461],[26.25423,57.61383],[26.24715,57.62082],[26.24813,57.62775],[26.23947,57.63408],[26.24203,57.63539],[26.24667,57.63559],[26.23959,57.64649],[26.23239,57.6461],[26.23117,57.64904],[26.24215,57.65146],[26.2363,57.65753],[26.23032,57.65805],[26.21043,57.66601],[26.21372,57.66888],[26.21092,57.67071],[26.21018,57.67906],[26.20079,57.68102],[26.19896,57.68356],[26.19444,57.68519],[26.18541,57.68454],[26.17712,57.68761],[26.18871,57.69472],[26.19859,57.70906],[26.20567,57.71486],[26.1726,57.72867],[26.141,57.73278],[26.13563,57.73923],[26.13905,57.74548],[26.13551,57.7503],[26.10537,57.757],[26.08035,57.76547],[26.07974,57.76384],[26.07328,57.76371],[26.07047,57.7656],[26.05912,57.75987],[26.049,57.7611],[26.0435,57.76703],[26.03326,57.77054],[26.02374,57.76761],[26.01776,57.7723],[26.02459,57.77516],[26.02496,57.7816],[26.02252,57.78355],[26.02776,57.7898],[26.03081,57.79097],[26.03338,57.80105],[26.03679,57.80592],[26.03606,57.8108],[26.04851,57.82289],[26.05705,57.83842],[26.05558,57.84764],[26.03667,57.84926],[26.02008,57.84517],[26.00958,57.85731],[25.99848,57.85816],[25.96273,57.84491],[25.931,57.85244],[25.89537,57.84972],[25.8883,57.84595],[25.88085,57.84946],[25.88573,57.85277],[25.88427,57.85595],[25.87561,57.85796],[25.87475,57.86322],[25.8595,57.85614],[25.81923,57.86419],[25.78312,57.89948],[25.78629,57.90428],[25.77165,57.91206],[25.75102,57.91692],[25.73724,57.92295],[25.72833,57.92133],[25.72247,57.91245],[25.70356,57.90331],[25.67916,57.90461],[25.67549,57.91277],[25.66207,57.91511],[25.65609,57.91439],[25.64889,57.91666],[25.64987,57.91841],[25.63828,57.93059],[25.57983,57.9442],[25.59399,57.95961],[25.58935,57.96504],[25.58239,57.96783],[25.58044,57.9721],[25.57483,57.9741],[25.56556,57.96718],[25.56604,57.96258],[25.55714,57.96038],[25.55567,57.96711],[25.55079,57.97255],[25.53725,57.97139],[25.52566,57.97184],[25.5226,57.96802],[25.51638,57.96737],[25.51211,57.96977],[25.52212,57.97488],[25.51943,57.98031],[25.48539,57.97475],[25.47843,57.98006],[25.47843,57.98264],[25.44219,57.99616],[25.44817,58.00114],[25.46648,58.00515],[25.44817,58.01698],[25.40693,58.02893],[25.37155,58.02926],[25.36374,58.03171],[25.35336,58.04334],[25.34482,58.04676],[25.33604,58.05709],[25.3292,58.05858],[25.32664,58.0638],[25.31981,58.066],[25.31908,58.06929],[25.29553,58.08161],[25.28686,58.08149],[25.28113,58.07019],[25.266,58.06716],[25.26502,58.06],[25.27991,58.05063],[25.29309,58.0467],[25.30431,58.03449],[25.30114,58.01504],[25.29748,58.01459],[25.30285,58.00011],[25.29577,57.99972],[25.29736,57.99661],[25.30358,57.99396],[25.30138,57.99273],[25.29187,57.99286],[25.28308,57.98963],[25.26722,57.99454],[25.25611,57.9939],[25.25502,58.00347],[25.2455,58.00302],[25.22768,58.01782],[25.24587,58.01872],[25.23562,58.02286],[25.23635,58.02441],[25.22732,58.02435],[25.22537,58.02195],[25.21902,58.02977],[25.21658,58.04088],[25.22695,58.04799],[25.22817,58.05348],[25.22122,58.05302],[25.22146,58.05051],[25.2178,58.04908],[25.21597,58.05954],[25.21219,58.06226],[25.20523,58.06122],[25.20389,58.0651],[25.21621,58.07413],[25.21207,58.08052],[25.19962,58.08536],[25.18949,58.08007],[25.19169,58.07613],[25.1535,58.07478],[25.15154,58.07703],[25.13397,58.07974],[25.10579,58.07749],[25.10518,58.06645],[25.07662,58.06645],[25.02037,58.01769],[24.99512,58.01084],[24.94863,58.00942],[24.83234,57.97177],[24.80806,57.99066],[24.74229,57.98187],[24.74339,57.96491],[24.7329,57.96239],[24.71508,57.96271],[24.6919,57.94653],[24.67335,57.95896],[24.64468,57.95889],[24.64187,57.95423],[24.64577,57.95268],[24.62869,57.94193],[24.61612,57.94368],[24.60892,57.95125],[24.58464,57.96174],[24.57317,57.95436],[24.54792,57.94938],[24.54352,57.94478],[24.5301,57.94705],[24.5207,57.94303],[24.51839,57.93675],[24.5096,57.93442],[24.51326,57.93066],[24.4625,57.92496],[24.44579,57.90798],[24.46018,57.90662],[24.45225,57.89942],[24.46006,57.87977],[24.41138,57.86491],[24.40906,57.87191],[24.33707,57.87393],[24.33829,58.0109],[24.42272,58.01097],[24.42614,58.28002],[24.51155,58.2797],[24.51216,58.32471],[24.42638,58.32503],[24.42712,58.36972],[24.34182,58.37017],[24.34048,58.23547],[24.17014,58.23572],[24.17014,58.1908],[24.08485,58.19092],[24.0851,58.23605],[24.00066,58.23579],[23.99993,58.28092],[23.82971,58.28047],[23.82947,58.32554],[23.65864,58.32496],[23.65791,58.41493],[23.57225,58.41468],[23.57127,58.50436],[23.39935,58.50359],[23.40106,58.41391],[23.14421,58.41238],[23.14567,58.36735],[23.05989,58.36703],[23.06172,58.32221],[22.9757,58.32157],[22.97716,58.27681],[22.89187,58.27598],[22.89358,58.23103],[22.80865,58.2302],[22.81012,58.18539],[22.89529,58.1861],[22.89663,58.1413],[22.72641,58.13982],[22.72495,58.18475],[22.55522,58.18276],[22.55693,58.13744],[22.64173,58.13886],[22.64344,58.094],[22.38903,58.0909],[22.38525,58.18063],[22.29995,58.17967],[22.30679,58.04527],[22.22198,58.0436],[22.22626,57.95404],[22.14206,57.95281],[22.1445,57.90804],[22.06007,57.90681],[22.06263,57.86186],[21.97807,57.86043],[21.96831,58.04004],[22.05274,58.04134],[22.04506,58.17581],[21.96038,58.17471],[21.95781,58.21941],[21.78723,58.21638],[21.78211,58.30631],[21.69681,58.3049],[21.69401,58.34975],[21.77942,58.35122],[21.76795,58.53074],[22.02566,58.53488],[22.02797,58.49001],[22.11375,58.49167],[22.11144,58.53621],[22.19709,58.53742],[22.19453,58.5823],[22.45236,58.58573],[22.44638,58.7203],[22.36023,58.71916],[22.35364,58.85385]],[[23.47415,59.26726],[23.29868,59.26632],[23.29795,59.31138],[23.47293,59.31194],[23.47415,59.26726]],[[24.17014,58.1908],[24.25507,58.19073],[24.25458,58.14581],[24.17002,58.14588],[24.17014,58.1908]],[[24.08485,58.19092],[24.08497,58.10129],[23.99968,58.10116],[23.99993,58.05632],[23.91525,58.05612],[23.915,58.14613],[23.83032,58.146],[23.82971,58.23572],[23.91451,58.23585],[23.91476,58.19099],[24.08485,58.19092]],[[24.61854,59.53612],[24.44183,59.5368],[24.44309,59.62659],[24.62016,59.6258],[24.61854,59.53612]],[[26.40403,59.7852],[26.31501,59.78667],[26.31814,59.83152],[26.40732,59.82994],[26.40403,59.7852]],[[26.48308,59.649],[26.48647,59.69383],[26.57514,59.69202],[26.57166,59.64719],[26.48308,59.649]],[[23.15944,57.78408],[23.24346,57.78461],[23.24445,57.73971],[23.32848,57.74031],[23.32679,57.82998],[23.15845,57.82885],[23.15944,57.78408]]],terms_text:"Maa-Ameti ortofoto"},{id:"estrela_de_alagoas",name:"Estrela de Alagoas",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.71382,-9.43476],[-36.71477,-9.34443],[-36.80586,-9.34498],[-36.80525,-9.43542],[-36.71382,-9.43476]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"eufar-balaton",name:"EUFAR Balaton orthophotos",type:"tms",template:"http://e.tile.openstreetmap.hu/balaton/0/{zoom}/{x}/{y}.jpg",endDate:"2010-08-31T00:00:00.000Z",startDate:"2010-08-01T00:00:00.000Z",zoomExtent:[12,19],polygon:[[[18.17918,46.98502],[18.17773,47.01816],[18.08176,47.05643],[18.10281,47.06311],[18.08152,47.09344],[18.06436,47.09049],[18.03537,47.07983],[18.03344,47.08262],[17.9582,47.05567],[17.99436,47.00449],[17.86441,46.95517],[17.80274,47.0103],[17.67184,46.97207],[17.23875,46.77079],[17.22244,46.6796],[17.47175,46.70306],[18.16735,46.94133],[18.17918,46.98502]]],terms_url:"http://www.bli.okologia.mta.hu/",terms_text:"EUFAR Balaton ortofotó 2010",best:true,description:"1940 geo-tagged photography from Balaton Limnological Institute."},{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",zoomExtent:[14,20],polygon:[[[6.62313,46.82339],[6.62899,46.82484],[6.62882,46.82674],[6.62531,46.83274],[6.62382,46.83317],[6.61839,46.83194],[6.62313,46.82339]]],terms_url:"http://osmdata.asitvd.ch/",terms_text:"Fiez - Orthophoto technique 2013"},{id:"fiskeridir-akvakultur",name:"Fiskeridirektoratet Aquaculture overlay",type:"wms",template:"https://ogc.fiskeridir.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_262&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.fiskeridir.no/Kart",terms_text:"© Fiskeridirektoratet",description:"Aquaculture/marine farms (licensed sites, may not yet have any installations)",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/9/9c/Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg/175px-Emblem_of_the_Norwegian_Directorate_of_Fisheries.svg.png",overlay:true},{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",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],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",zoomExtent:[0,17],polygon:[[[16.11391,46.8691],[16.17897,46.90662],[16.20004,46.94151],[16.22175,46.93554],[16.24628,46.94639],[16.25532,46.96421],[16.27647,46.96261],[16.29058,47.01398],[16.30162,46.99923],[16.34146,46.99652],[16.35052,47.01063],[16.3734,46.99859],[16.41277,47.00475],[16.43327,46.99274],[16.44781,47.00389],[16.48,46.99412],[16.5122,47.00117],[16.46356,47.03227],[16.44786,47.02275],[16.43912,47.02966],[16.44567,47.03887],[16.52032,47.0561],[16.47321,47.07362],[16.46372,47.09392],[16.5008,47.11006],[16.50004,47.12329],[16.52953,47.12874],[16.51716,47.14969],[16.45495,47.14259],[16.46487,47.16833],[16.45556,47.18756],[16.43056,47.1847],[16.4195,47.19491],[16.41892,47.21071],[16.43713,47.2097],[16.44263,47.23371],[16.43131,47.25276],[16.46715,47.25317],[16.48923,47.27989],[16.46463,47.33385],[16.4337,47.35281],[16.45851,47.36705],[16.44546,47.40702],[16.48317,47.40936],[16.49638,47.38927],[16.51709,47.41002],[16.57491,47.40542],[16.58073,47.41917],[16.66185,47.4556],[16.67064,47.47422],[16.65234,47.50034],[16.68956,47.51016],[16.71478,47.5402],[16.66354,47.56773],[16.6732,47.60495],[16.65953,47.6061],[16.65276,47.62285],[16.63142,47.62832],[16.57391,47.61967],[16.51474,47.6462],[16.49675,47.63931],[16.42546,47.66217],[16.44374,47.67421],[16.44805,47.69647],[16.4747,47.68116],[16.48722,47.69798],[16.55217,47.72255],[16.53638,47.73678],[16.54798,47.75154],[16.60952,47.76037],[16.63441,47.75908],[16.65729,47.74149],[16.72094,47.73536],[16.75341,47.68282],[16.83016,47.68106],[16.83943,47.70451],[16.86689,47.72115],[16.87668,47.68765],[17.09374,47.70777],[17.07066,47.72854],[17.0516,47.79385],[17.07495,47.8085],[17.04714,47.82856],[17.05195,47.83777],[17.01055,47.85818],[17.01639,47.86733],[17.08575,47.87462],[17.11317,47.92716],[17.09171,47.93429],[17.11838,47.96011],[17.09466,47.97088],[17.20103,48.01999],[17.24177,48.02247],[17.25795,47.99865],[17.33465,47.99312],[17.40299,47.94785],[17.45392,47.88526],[17.52674,47.86551],[17.56758,47.81513],[17.6084,47.82189],[17.70858,47.75668],[17.77987,47.73949],[17.8661,47.74575],[17.90013,47.73926],[17.94687,47.74467],[17.97087,47.75784],[18.00441,47.74634],[18.03806,47.75768],[18.29588,47.73146],[18.45407,47.76512],[18.49316,47.75276],[18.55908,47.766],[18.64609,47.75909],[18.72607,47.78904],[18.74118,47.81382],[18.792,47.82309],[18.84854,47.81672],[18.85588,47.82608],[18.82801,47.83429],[18.81357,47.85555],[18.76353,47.8716],[18.75686,47.89684],[18.77675,47.95509],[18.75525,47.97635],[18.81574,47.99344],[18.82,48.03968],[18.83327,48.04824],[18.87494,48.04707],[18.88667,48.05868],[18.90898,48.05114],[18.9439,48.05886],[18.98161,48.0536],[19.01486,48.07818],[19.05852,48.05735],[19.08436,48.07278],[19.1074,48.0656],[19.13529,48.07415],[19.24137,48.05365],[19.25578,48.07156],[19.30311,48.08871],[19.3866,48.09191],[19.40002,48.0823],[19.45405,48.10144],[19.46735,48.08393],[19.49442,48.10991],[19.49238,48.13966],[19.51282,48.15466],[19.50452,48.17344],[19.52897,48.19036],[19.52604,48.20313],[19.5775,48.21601],[19.63083,48.25007],[19.64452,48.23917],[19.66986,48.23921],[19.69122,48.20389],[19.72113,48.20147],[19.74618,48.21651],[19.78716,48.19253],[19.79873,48.19482],[19.80528,48.18373],[19.78242,48.16504],[19.79481,48.15353],[19.82133,48.16908],[19.84528,48.16274],[19.85517,48.17843],[19.86013,48.16941],[19.89875,48.16631],[19.91454,48.14686],[19.8983,48.1249],[19.93738,48.13112],[19.97439,48.166],[19.98871,48.16217],[20.02904,48.17768],[20.04945,48.1672],[20.07299,48.17961],[20.07004,48.1917],[20.13409,48.22518],[20.13319,48.25398],[20.20616,48.25098],[20.20383,48.26191],[20.22847,48.26278],[20.23495,48.27993],[20.28686,48.26164],[20.32571,48.27279],[20.33746,48.30167],[20.36566,48.31661],[20.38408,48.35118],[20.40983,48.36586],[20.40253,48.38256],[20.42053,48.40386],[20.41623,48.41854],[20.50793,48.48936],[20.50651,48.53442],[20.53747,48.52788],[20.54649,48.54429],[20.58659,48.53576],[20.65387,48.56141],[20.83636,48.58284],[20.8378,48.57421],[20.85044,48.58163],[20.84533,48.5665],[20.86815,48.55182],[20.92232,48.55945],[20.93463,48.53834],[20.95588,48.53396],[20.9562,48.52167],[20.98158,48.51777],[21.01511,48.53231],[21.06632,48.52589],[21.11745,48.49105],[21.16087,48.5215],[21.17963,48.51823],[21.22106,48.5375],[21.30549,48.52225],[21.31338,48.55084],[21.32688,48.55413],[21.31938,48.5612],[21.41545,48.55895],[21.42266,48.57882],[21.44061,48.5851],[21.51409,48.55107],[21.54202,48.5084],[21.61393,48.50942],[21.62019,48.46983],[21.66355,48.41796],[21.66456,48.39216],[21.70174,48.3807],[21.71187,48.35762],[21.81741,48.33279],[21.8352,48.33464],[21.83721,48.36325],[21.8843,48.35605],[21.88484,48.36754],[21.89788,48.36256],[21.8998,48.37022],[21.92819,48.3616],[21.92681,48.3709],[21.9492,48.37873],[21.99446,48.37732],[22.02133,48.39275],[22.0546,48.37753],[22.07649,48.38724],[22.08674,48.37156],[22.13591,48.38052],[22.13106,48.39123],[22.15277,48.39624],[22.15619,48.40931],[22.21257,48.42565],[22.23714,48.41004],[22.26549,48.40987],[22.23988,48.38701],[22.26757,48.36116],[22.31781,48.35454],[22.31329,48.32507],[22.33729,48.30791],[22.33843,48.27921],[22.38475,48.23396],[22.40064,48.2492],[22.43284,48.25252],[22.45639,48.24231],[22.4899,48.25342],[22.49722,48.23955],[22.51615,48.23797],[22.53111,48.20943],[22.57114,48.19614],[22.56164,48.18161],[22.59824,48.14476],[22.59028,48.10734],[22.67545,48.092],[22.73472,48.11985],[22.75762,48.12006],[22.77039,48.10902],[22.77232,48.12187],[22.80277,48.12211],[22.80253,48.10708],[22.82543,48.11751],[22.83644,48.08025],[22.86113,48.07503],[22.8678,48.05243],[22.88204,48.05481],[22.86597,48.01132],[22.83556,47.9906],[22.84076,47.98136],[22.87257,47.97527],[22.86973,47.96596],[22.89157,47.96724],[22.89744,47.95406],[22.84733,47.90776],[22.79281,47.89086],[22.75869,47.89414],[22.77775,47.84225],[22.71363,47.83609],[22.68019,47.78775],[22.61112,47.77175],[22.549,47.77222],[22.48121,47.81089],[22.45131,47.80339],[22.43133,47.73981],[22.35662,47.74862],[22.31777,47.76609],[22.31762,47.74337],[22.28514,47.72928],[22.26432,47.73107],[22.259,47.69791],[22.23068,47.6932],[22.17965,47.59161],[22.12892,47.5979],[22.09428,47.55836],[22.07826,47.56213],[22.05345,47.54748],[22.07122,47.53807],[22.06179,47.5288],[22.04513,47.53989],[22.03672,47.53267],[22.00719,47.48362],[22.03279,47.45084],[22.02388,47.39086],[22.01198,47.3758],[21.96274,47.38105],[21.93825,47.37253],[21.87779,47.28578],[21.88728,47.27305],[21.85349,47.23976],[21.85807,47.18736],[21.81248,47.16675],[21.79241,47.10598],[21.72683,47.09839],[21.6976,47.05792],[21.65042,47.04083],[21.68887,47.002],[21.66787,46.97123],[21.68149,46.96521],[21.6382,46.93305],[21.59845,46.92747],[21.61429,46.88673],[21.60167,46.86682],[21.52033,46.83737],[21.51861,46.80007],[21.48318,46.76502],[21.52634,46.73932],[21.52937,46.72097],[21.49233,46.68597],[21.47284,46.69591],[21.4299,46.69394],[21.43096,46.67814],[21.45467,46.66086],[21.41624,46.64262],[21.4098,46.62181],[21.3657,46.63795],[21.33005,46.63182],[21.31397,46.61767],[21.30124,46.59087],[21.32079,46.58286],[21.2743,46.54074],[21.26003,46.50216],[21.27442,46.47673],[21.29645,46.4763],[21.31743,46.45073],[21.28952,46.41548],[21.29633,46.40696],[21.22501,46.41369],[21.20642,46.40338],[21.19926,46.3479],[21.17623,46.33577],[21.1805,46.30445],[21.11554,46.30185],[21.10305,46.26246],[21.07088,46.2539],[21.06608,46.24294],[21.03662,46.24804],[21.02467,46.26653],[20.96082,46.2623],[20.94658,46.2793],[20.92507,46.27662],[20.92181,46.26181],[20.87327,46.28776],[20.77565,46.27596],[20.74905,46.25085],[20.76186,46.20456],[20.7274,46.20775],[20.73411,46.19394],[20.71405,46.16605],[20.68436,46.14478],[20.65492,46.14977],[20.63945,46.12676],[20.54505,46.17909],[20.50148,46.19033],[20.49494,46.17099],[20.45923,46.14288],[20.39751,46.15747],[20.36853,46.15286],[20.35571,46.16963],[20.29681,46.15215],[20.2549,46.11585],[20.24848,46.1301],[20.23301,46.12417],[20.18174,46.16011],[20.1365,46.14495],[20.10097,46.17728],[20.06362,46.14373],[20.03461,46.14589],[20.01581,46.17684],[19.93541,46.17642],[19.85335,46.15],[19.81797,46.12817],[19.75854,46.14798],[19.69821,46.18793],[19.68277,46.18004],[19.66151,46.19044],[19.63174,46.1693],[19.56765,46.17911],[19.5604,46.16658],[19.50266,46.14245],[19.52712,46.12103],[19.4645,46.09538],[19.46658,46.08204],[19.416,46.04605],[19.3804,46.03587],[19.36409,46.0523],[19.2819,46.0148],[19.29653,45.98812],[19.28565,45.9969],[19.14799,45.99634],[19.13384,46.0371],[19.10487,46.04017],[19.06604,46.0002],[19.07968,45.96364],[19.00598,45.95907],[19.00927,45.92366],[18.90613,45.93538],[18.87946,45.91668],[18.86471,45.92085],[18.86856,45.91134],[18.82768,45.90517],[18.822,45.91459],[18.80751,45.90361],[18.80925,45.87962],[18.79562,45.87845],[18.70489,45.91819],[18.67002,45.91084],[18.65966,45.91689],[18.66513,45.89928],[18.64128,45.88904],[18.65502,45.87424],[18.62777,45.87338],[18.61484,45.85314],[18.62367,45.83985],[18.57324,45.81376],[18.57498,45.80043],[18.55972,45.8038],[18.52235,45.78269],[18.49067,45.79472],[18.48219,45.7655],[18.45628,45.76952],[18.44508,45.76052],[18.44685,45.73713],[18.40763,45.73971],[18.39189,45.7617],[18.36423,45.77294],[18.33942,45.74716],[18.29682,45.76122],[18.24405,45.76123],[18.23073,45.77903],[18.19087,45.78788],[18.16819,45.77627],[18.12465,45.78963],[18.10681,45.77083],[18.08189,45.76452],[17.99588,45.79573],[17.93021,45.78633],[17.90668,45.79257],[17.86531,45.76701],[17.82627,45.81],[17.80898,45.8041],[17.78091,45.81749],[17.76034,45.81192],[17.74086,45.8296],[17.66329,45.83818],[17.62762,45.89794],[17.57007,45.93582],[17.43783,45.95038],[17.4259,45.92727],[17.41081,45.93997],[17.39215,45.93021],[17.38287,45.94757],[17.34762,45.94234],[17.34388,45.96053],[17.35377,45.9525],[17.39054,45.95819],[17.38742,45.96618],[17.35835,45.96427],[17.37549,45.96869],[17.37519,45.98811],[17.36357,45.99154],[17.35672,45.97358],[17.33396,45.99608],[17.33198,45.97289],[17.313,45.96653],[17.32365,45.98878],[17.29877,45.98387],[17.3042,46.00211],[17.25797,46.01103],[17.29632,46.02852],[17.25415,46.03001],[17.27096,46.05671],[17.23248,46.0592],[17.25251,46.06647],[17.23131,46.07903],[17.20199,46.07655],[17.23313,46.09896],[17.2104,46.10017],[17.21297,46.11386],[17.17593,46.10846],[17.17434,46.12876],[17.18652,46.13323],[17.1811,46.15055],[17.15623,46.15858],[17.15929,46.16968],[17.1261,46.16845],[17.12274,46.17898],[17.07525,46.18895],[17.06616,46.2023],[16.97354,46.2252],[16.97395,46.24311],[16.95041,46.24153],[16.88624,46.28146],[16.87137,46.32528],[16.88021,46.3357],[16.86154,46.34524],[16.86562,46.35565],[16.8522,46.35172],[16.84986,46.36262],[16.83529,46.36382],[16.83765,46.3748],[16.82617,46.3671],[16.79334,46.38739],[16.75921,46.37766],[16.72987,46.40149],[16.71821,46.38987],[16.67729,46.44945],[16.66318,46.4487],[16.66637,46.4583],[16.61879,46.46199],[16.60447,46.47608],[16.5236,46.50538],[16.53258,46.5314],[16.51767,46.53635],[16.50841,46.56527],[16.483,46.56604],[16.4834,46.5786],[16.44557,46.61095],[16.42486,46.61316],[16.38594,46.64425],[16.39154,46.66373],[16.41985,46.65848],[16.42863,46.69397],[16.36892,46.70401],[16.37983,46.71539],[16.37109,46.72229],[16.35706,46.71424],[16.3186,46.75414],[16.33054,46.77521],[16.31216,46.778],[16.31277,46.79731],[16.34064,46.80519],[16.35084,46.83006],[16.34033,46.84688],[16.3015,46.85951],[16.29139,46.87283],[16.23323,46.87667],[16.15609,46.85371],[16.12657,46.85691],[16.11391,46.8691]]],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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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",zoomExtent:[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:"fta-digiroad-functional",name:"FTA Road Network",type:"wms",template:"https://extranet.liikennevirasto.fi/inspirepalvelu/beta/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dr_tielinkki_toim_lk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.liikennevirasto.fi/web/en/open-data/digiroad/",terms_text:"© Liikennevirasto",description:"Digiroad national road network from the Finnish Transport Agency, functional road classes.",icon:"https://www.liikennevirasto.fi/livi-theme/images/general/liikennevirasto_logo_2x.png",overlay:true},{id:"gaza_pleiades_20140706",name:"Gaza Strip - Pléiades - 2014/07/06",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{id:"gaza_pleiades_20140706_nir",name:"Gaza Strip - Pléiades - 2014/07/06 (NIR)",type:"tms",template:"https://imagery.openstreetmap.fr/tms/1.0.0/gaza_pleiades_20140706_nir/{zoom}/{x}/{y}",endDate:"2014-07-06T00:00:00.000Z",startDate:"2014-07-06T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[34.49022,31.59487],[34.49339,31.59263],[34.5678,31.5401],[34.5653,31.53226],[34.55613,31.52552],[34.54729,31.5121],[34.53011,31.5066],[34.5255,31.50251],[34.51369,31.50067],[34.505,31.49543],[34.4887,31.48263],[34.48532,31.48028],[34.47962,31.47778],[34.47471,31.47207],[34.4674,31.46448],[34.46576,31.46275],[34.45308,31.45139],[34.44585,31.4441],[34.44216,31.44327],[34.43798,31.44112],[34.43226,31.43458],[34.43164,31.43265],[34.4268,31.42804],[34.42211,31.42437],[34.41326,31.41862],[34.41329,31.41758],[34.41174,31.41604],[34.40918,31.41542],[34.4067,31.41295],[34.40506,31.41295],[34.40197,31.4112],[34.40134,31.40986],[34.39492,31.40391],[34.39351,31.40113],[34.38824,31.39599],[34.38037,31.38951],[34.38074,31.38791],[34.37407,31.37915],[34.37338,31.37422],[34.37159,31.37209],[34.37214,31.37093],[34.37158,31.36972],[34.3704,31.36909],[34.36827,31.36992],[34.36685,31.36914],[34.36497,31.36137],[34.37438,31.30609],[34.36708,31.29074],[34.34339,31.27846],[34.33119,31.26149],[34.31931,31.25317],[34.29093,31.24009],[34.26762,31.21894],[34.25915,31.22131],[34.231,31.26295],[34.21113,31.32157],[34.2434,31.34554],[34.29954,31.39629],[34.34172,31.43251],[34.36439,31.45715],[34.41099,31.50162],[34.42619,31.52686],[34.44463,31.54193],[34.49022,31.59487]]],terms_url:"https://wiki.openstreetmap.org/wiki/2014_Gaza_Strip",terms_text:"Copyright CNES 2014, Distribution Airbus Defence and Space"},{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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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://cartes.geogratis.gc.ca/wms/roads_fr?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=routes&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[4,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.19237,48.65504],[-122.99582,48.51065],[-122.4869,48.4098],[-122.32915,48.4528],[-122.22939,48.50649],[-122.17908,48.52965],[-122.1842,48.5669],[-121.77833,48.57593],[-121.66578,48.42791],[-121.33068,48.35714],[-121.02713,48.34977],[-121.03054,48.49406],[-120.698,48.51497],[-120.51041,48.8718],[-119.97579,48.88134],[-119.95447,48.51497],[-119.90758,48.29421],[-119.73193,48.15503],[-119.74386,48.07419],[-119.62279,48.10951],[-119.60232,48.14707],[-119.25273,48.16243],[-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:"https://gis.bmlfuw.gv.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.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]]],terms_url:"http://geoimage.at",terms_text:"geoimage.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/GeoimageatMaxRes.png"},{id:"Geolittoral-Orthophotos2000",name:"Géolittoral - Orthophotos 2000",type:"wms",template:"http://geolittoral.din.developpement-durable.gouv.fr/wxs?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.07962,46.10959],[-0.94115,46.01474],[-0.56306,45.15178],[-0.7266,45.08425],[-0.87904,45.34094],[-0.99794,45.33779],[-0.95558,44.69982],[-1.15862,44.19865],[-1.21512,44.20558],[-1.24654,44.1162],[-1.27903,44.03937],[-1.28825,44.02304],[-1.32117,43.94094],[-1.32151,43.92296],[-1.3092,43.92337],[-1.3085,43.91439],[-1.28366,43.91514],[-1.28302,43.90624],[-1.2761,43.90655],[-1.28211,43.89254],[-1.30102,43.85159],[-1.30384,43.8424],[-1.30923,43.83498],[-1.33474,43.76946],[-1.34407,43.74875],[-1.3456,43.74214],[-1.34673,43.73688],[-1.43284,43.53152],[-1.42806,43.46812],[-1.60627,43.40591],[-1.6061,43.36012],[-1.77441,43.30357],[-1.82995,43.38484],[-1.58551,43.46856],[-1.35706,44.03374],[-1.40217,44.06461],[-1.33584,44.22832],[-1.21836,44.23033],[-1.16795,44.41097],[-1.30744,44.41847],[-1.16979,45.59107],[-1.48685,46.06042],[-1.36364,46.09146],[-1.60176,46.17019],[-1.64442,46.22375],[-1.58595,46.30426],[-1.51008,46.33888],[-1.75643,46.42214],[-2.1872,46.81857],[-2.16423,46.85534],[-2.23654,46.9337],[-2.39769,46.96718],[-2.282,47.07631],[-2.12563,47.01875],[-2.09013,47.06562],[-2.18487,47.10698],[-2.2647,47.10763],[-2.24489,47.18562],[-2.56779,47.24467],[-2.66727,47.46686],[-2.74787,47.47122],[-2.75771,47.43461],[-2.89321,47.4629],[-2.90369,47.50905],[-3.03383,47.53833],[-3.07113,47.51185],[-3.01653,47.49873],[-3.12502,47.42693],[-3.18803,47.48441],[-3.22791,47.61132],[-3.2967,47.63161],[-3.2876,47.67154],[-3.34074,47.66893],[-3.38912,47.59473],[-3.55087,47.63827],[-3.53384,47.72488],[-3.76577,47.76476],[-3.77595,47.7371],[-3.91168,47.75915],[-3.8959,47.79911],[-3.97236,47.81526],[-3.99722,47.7975],[-3.97956,47.76268],[-3.8945,47.72193],[-3.9162,47.67831],[-4.10163,47.70921],[-4.08989,47.78944],[-4.03798,47.79909],[-4.04125,47.83109],[-4.08765,47.84221],[-4.14781,47.82525],[-4.14314,47.78847],[-4.35162,47.7415],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.63576,48.07798],[-4.60147,48.11469],[-4.385,48.10962],[-4.38955,48.14543],[-4.30925,48.15009],[-4.31268,48.17694],[-4.46369,48.18468],[-4.49748,48.1453],[-4.5921,48.14758],[-4.57537,48.22488],[-4.67101,48.2331],[-4.65434,48.31049],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.81465,48.39413],[-4.83515,48.54319],[-4.63387,48.66373],[-3.96692,48.77978],[-3.94939,48.74715],[-3.6502,48.75356],[-3.65853,48.82527],[-3.53931,48.85834],[-3.54444,48.90297],[-3.40954,48.91866],[-3.40755,48.87366],[-3.02769,48.9275],[-2.67861,48.58841],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.80392,48.66126],[-1.61161,48.68582],[-1.71645,49.24781],[-1.8026,49.32721],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.17134,49.55412],[-1.27353,49.55245],[-1.1328,49.3934],[-0.93059,49.40804],[-0.74827,49.35976],[-0.38935,49.34167],[-0.24704,49.29995],[-0.12454,49.29353],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.4521,51.12144],[2.59286,51.12124],[2.60683,51.05779],[1.7976,50.89906],[1.66458,50.82379],[1.70786,50.1282],[1.05936,49.85],[0.61607,49.79062],[0.24731,49.65027],[0.1709,49.53174],[0.57065,49.49622],[0.41115,49.3396],[0.19504,49.35736],[0.01718,49.25479],[-0.24453,49.26312],[-0.38408,49.30495],[-0.74091,49.32438],[-0.9954,49.37133],[-1.05453,49.25175],[-1.27704,49.29022],[-1.25966,49.43463],[-1.39141,49.53985],[-1.27535,49.62056],[-1.29775,49.65946],[-1.4905,49.57139],[-1.77517,49.63398],[-1.74601,49.48155],[-1.51294,49.24691],[-1.48261,48.72607],[-1.30574,48.72531],[-1.28323,48.59731],[-2.76114,48.43471],[-3.00174,48.67646],[-3.21062,48.72097],[-3.95404,48.56051],[-4.15643,48.60792],[-4.44475,48.55852],[-4.63683,48.48299],[-4.6319,48.44727],[-4.25022,48.43088],[-4.06141,48.21805],[-4.1757,48.05165],[-4.31904,48.0141],[-4.26781,47.89977],[-3.88484,47.98172],[-3.76375,47.86403],[-2.32727,47.52634],[-2.36911,47.3339],[-1.74067,47.33507],[-1.77062,47.20451],[-2.03678,47.21942],[-2.0968,47.15548],[-1.88786,47.01239],[-2.08797,46.83007],[-2.01214,46.83436],[-1.84079,46.69651],[-1.87318,46.65484],[-1.68859,46.50392],[-1.62117,46.51513],[-1.42428,46.41675],[-1.01761,46.35917],[-1.07962,46.10959]],[[-2.41232,46.69242],[-2.37197,46.67611],[-2.26749,46.68033],[-2.27007,46.70705],[-2.29827,46.73286],[-2.41655,46.73711],[-2.41232,46.69242]],[[-3.06018,47.40542],[-2.82587,47.29635],[-2.78787,47.33417],[-3.02436,47.44563],[-3.06018,47.40542]],[[-3.26482,47.4295],[-3.3343,47.35928],[-3.29614,47.34133],[-3.31489,47.30057],[-3.19941,47.24492],[-3.16567,47.27751],[-3.08686,47.23612],[-3.00637,47.30855],[-3.26482,47.4295]],[[-1.93966,48.86346],[-1.93993,48.91179],[-1.701,48.91105],[-1.69726,48.86173],[-1.93966,48.86346]]],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.din.developpement-durable.gouv.fr/wxs?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.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],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.din.developpement-durable.gouv.fr/wxs?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.98385,46.18807],[-0.89497,46.15628],[-0.93455,46.10163],[-0.84388,46.06949],[-0.88241,46.01637],[-0.53787,45.89558],[-0.63498,45.76444],[-0.86666,45.8479],[-0.76264,45.6245],[-0.69695,45.62659],[-0.69397,45.60184],[-0.68755,45.60174],[-0.688,45.50986],[-0.63799,45.50892],[-0.63978,45.44747],[-0.61574,45.44695],[-0.61619,45.38586],[-0.58544,45.38596],[-0.58529,45.32334],[-0.55379,45.32344],[-0.55275,45.19661],[-0.49094,45.19577],[-0.49184,45.13315],[-0.45661,45.13325],[-0.45512,45.07161],[-0.41611,45.07089],[-0.41621,45.02696],[-0.2907,44.98278],[-0.22,45.06771],[-0.12252,45.02563],[-0.18925,44.94591],[-0.09266,44.91019],[-0.14521,44.8392],[-0.15491,44.84238],[-0.19387,44.78678],[-0.43541,44.87317],[-0.39048,44.68413],[-0.58798,44.66014],[-0.66628,44.99129],[-0.77838,44.99263],[-0.77764,45.05389],[-0.81584,45.05321],[-0.81838,45.11962],[-0.88393,45.12051],[-0.88171,45.18081],[-0.93438,45.18185],[-0.9328,45.24484],[-1.00163,45.24439],[-1.00247,45.30827],[-1.0524,45.31013],[-1.04828,45.36911],[-1.06412,45.36911],[-1.05039,45.18252],[-1.10761,44.80787],[-1.01514,44.80113],[-1.01946,44.76914],[-0.93365,44.76149],[-0.9404,44.7018],[-0.96035,44.56434],[-1.01408,44.56765],[-1.09916,44.1456],[-1.22689,44.14022],[-1.21853,44.03249],[-1.30762,44.029],[-1.39572,43.74301],[-1.31296,43.72951],[-1.37439,43.53109],[-1.34589,43.50606],[-1.59964,43.35423],[-1.76549,43.25548],[-1.79281,43.28038],[-1.80281,43.40425],[-1.72832,43.45033],[-1.58531,43.489],[-1.33584,44.22832],[-1.30744,44.41847],[-1.22511,45.44416],[-1.48685,46.06042],[-1.60176,46.17019],[-1.64442,46.22375],[-1.75643,46.42214],[-2.03483,46.61895],[-2.3466,46.62382],[-2.46561,46.71196],[-2.3233,46.83812],[-2.45286,46.93856],[-2.31733,47.16214],[-2.92848,47.28413],[-2.96742,47.22147],[-3.35602,47.32474],[-3.18803,47.48441],[-3.22791,47.61132],[-3.38912,47.59473],[-3.9162,47.67831],[-4.10163,47.70921],[-4.14314,47.78847],[-4.37619,47.71067],[-4.47962,47.9776],[-4.98565,47.99896],[-4.96938,48.08972],[-4.60147,48.11469],[-4.5921,48.14758],[-4.67101,48.2331],[-4.84243,48.3005],[-5.19867,48.44926],[-5.10346,48.51722],[-4.83515,48.54319],[-4.63117,48.66129],[-3.96692,48.77978],[-3.94939,48.74715],[-3.67013,48.89508],[-3.54444,48.90297],[-3.40954,48.91866],[-3.33344,48.90458],[-3.02769,48.9275],[-2.80207,48.79793],[-2.69353,48.76722],[-2.45786,48.70896],[-2.28475,48.71909],[-2.17543,48.65016],[-2.0137,48.73221],[-1.80953,48.73178],[-1.7243,48.75828],[-1.70557,48.84512],[-1.90304,48.86288],[-1.91027,48.92348],[-1.68714,48.93249],[-1.74277,49.24473],[-1.85748,49.3253],[-1.9262,49.65573],[-2.03908,49.67872],[-2.00445,49.76087],[-1.61759,49.68498],[-1.28373,49.76067],[-1.1492,49.63504],[-1.18545,49.54836],[-0.96463,49.42509],[-0.74429,49.36802],[-0.39014,49.3622],[-0.24976,49.3158],[-0.13342,49.31293],[0.02731,49.37619],[0.01801,49.54656],[0.12211,49.69292],[0.51713,49.86466],[1.05727,49.94904],[1.43908,50.11819],[1.53177,50.46437],[1.52549,50.85867],[1.64118,50.95919],[2.59712,51.17355],[2.66071,51.0196],[2.07124,50.92022],[2.05937,50.94709],[1.7976,50.89906],[1.68089,50.8717],[1.65569,50.59729],[1.75357,50.5932],[1.72295,50.24702],[1.82156,50.24262],[1.80149,50.05116],[1.54565,50.06311],[1.54155,50.01267],[1.42462,50.01747],[1.42667,50.05276],[1.03838,49.84609],[0.9827,49.88916],[0.57961,49.82133],[0.42063,49.76297],[0.4281,49.75445],[0.20831,49.67269],[0.14765,49.57767],[0.13461,49.5809],[0.11117,49.54365],[0.56598,49.52045],[0.5632,49.49989],[0.63001,49.49666],[0.61478,49.37441],[0.54825,49.37851],[0.54254,49.33461],[0.45741,49.33938],[0.45843,49.34492],[0.32597,49.35456],[0.32846,49.38128],[0.28011,49.38433],[0.27689,49.36334],[0.21095,49.36658],[0.20817,49.35084],[0.14326,49.35532],[0.13769,49.3115],[0.07204,49.31532],[0.0675,49.28713],[0.00274,49.29076],[0.00508,49.25711],[-0.02027,49.26036],[-0.03492,49.1973],[-0.19448,49.21463],[-0.38966,49.12726],[-0.45369,49.18792],[-0.3561,49.23214],[-0.82088,49.28331],[-0.99778,49.30149],[-1.16728,49.24545],[-1.19515,49.28183],[-1.26768,49.24099],[-1.34114,49.2975],[-1.24768,49.35025],[-1.44583,49.60689],[-1.81105,49.61757],[-1.77479,49.44333],[-1.72775,49.46509],[-1.5339,49.29098],[-1.47909,49.29233],[-1.47608,49.24027],[-1.43557,49.20326],[-1.47225,49.1822],[-1.45091,48.75725],[-1.31155,48.76408],[-1.30533,48.70216],[-1.2584,48.70421],[-1.25229,48.64353],[-1.23519,48.64435],[-1.2269,48.56824],[-1.85218,48.53086],[-1.84908,48.4975],[-1.92326,48.49187],[-1.92813,48.44096],[-2.04272,48.43601],[-2.03889,48.48191],[-2.2895,48.46102],[-2.3021,48.52433],[-2.40863,48.51618],[-2.42035,48.56954],[-2.43084,48.57852],[-2.49083,48.54924],[-2.47353,48.53326],[-2.54978,48.49647],[-2.54005,48.48747],[-2.70681,48.40746],[-3.02979,48.69115],[-4.01034,48.53179],[-4.05342,48.64412],[-4.38281,48.57349],[-4.35482,48.5118],[-4.38853,48.50473],[-4.13495,48.44868],[-4.16411,48.38936],[-4.01832,48.35685],[-4.04733,48.29918],[-3.98814,48.2867],[-4.0214,48.21606],[-4.03634,48.21958],[-4.06623,48.16028],[-4.16675,48.18247],[-4.18331,48.14934],[-4.17232,48.1065],[-4.20111,48.10285],[-4.18643,48.04389],[-4.18806,48.04061],[-4.35686,48.02305],[-4.25657,47.93997],[-4.23363,47.93497],[-4.21371,47.97598],[-4.21854,47.97726],[-4.1806,48.05569],[-3.6172,47.93124],[-2.17991,47.58642],[-2.25449,47.44501],[-2.30182,47.4568],[-2.32043,47.42092],[-2.30372,47.41755],[-2.34753,47.33499],[-2.36219,47.33837],[-2.38079,47.3039],[-2.35852,47.29854],[-2.29962,47.29784],[-2.29742,47.3618],[-2.13199,47.35852],[-2.13478,47.39107],[-2.01565,47.39623],[-2.01404,47.38095],[-1.92862,47.38254],[-1.92891,47.37956],[-1.8322,47.38184],[-1.82986,47.34165],[-1.73608,47.34304],[-1.73418,47.305],[-1.64084,47.30639],[-1.64011,47.29427],[-1.58355,47.29566],[-1.58531,47.33708],[-1.4612,47.33966],[-1.46003,47.32924],[-1.37211,47.33221],[-1.36054,47.11239],[-1.48567,47.11149],[-1.48582,47.11877],[-1.66897,47.11688],[-1.66971,47.12864],[-1.72553,47.12764],[-1.72612,47.13761],[-1.93975,47.13263],[-1.94019,47.1422],[-1.9925,47.14309],[-1.81066,47.00588],[-1.94723,46.92078],[-1.92891,46.90677],[-1.99529,46.86461],[-1.73652,46.66839],[-1.77535,46.64386],[-1.82678,46.64174],[-1.82473,46.62071],[-1.18192,46.39987],[-0.91261,46.3048],[-0.95481,46.2489],[-0.94235,46.24424],[-0.98385,46.18807]],[[3.14769,42.40072],[3.14949,42.40015],[3.15305,42.40052],[3.15804,42.40243],[3.1877,42.42805],[3.14227,42.5248],[3.06837,42.54635],[3.04884,42.6942],[3.0799,43.03073],[3.22641,43.18727],[3.40916,43.26032],[3.52104,43.25877],[3.66429,43.37628],[3.73841,43.39054],[4.00979,43.53607],[4.17692,43.45636],[4.54355,43.43349],[4.54943,43.35401],[4.83506,43.30891],[4.97506,43.38309],[5.03219,43.31928],[5.25919,43.31928],[5.31082,43.20504],[5.35682,43.18645],[5.36882,43.16785],[5.40232,43.16211],[5.41382,43.17123],[5.40919,43.19921],[5.54232,43.18827],[5.60582,43.14797],[5.6197,43.1529],[5.63832,43.17159],[5.67157,43.1674],[5.69095,43.13411],[5.77607,43.10637],[5.7762,43.09432],[5.75407,43.08328],[5.75707,43.0725],[5.77032,43.06465],[5.85933,43.03469],[5.8877,43.06273],[5.9567,43.06109],[5.96383,43.09277],[6.00033,43.09186],[6.01745,43.06849],[6.10233,43.07415],[6.10483,43.0526],[6.0666,43.04318],[6.06722,43.03785],[6.1427,43.00923],[6.15676,42.98715],[6.19635,42.97331],[6.22221,42.9801],[6.26891,42.99651],[6.25515,43.03627],[6.2019,43.02713],[6.18378,43.09188],[6.30153,43.09909],[6.32478,43.07974],[6.37778,43.08011],[6.38866,43.13395],[6.51341,43.14608],[6.57704,43.17881],[6.62291,43.14563],[6.69779,43.19969],[6.68016,43.23357],[6.72116,43.26007],[6.72241,43.27472],[6.67054,43.29192],[6.68741,43.33113],[6.72416,43.34267],[6.75291,43.409],[6.79104,43.39674],[6.90629,43.41672],[6.96767,43.50273],[6.96617,43.52812],[7.00617,43.53845],[7.03554,43.4982],[7.06892,43.5001],[7.09079,43.51642],[7.06267,43.53672],[7.08254,43.5456],[7.1238,43.53074],[7.1558,43.5437],[7.1433,43.62284],[7.16867,43.64636],[7.2138,43.63469],[7.25417,43.68497],[7.3403,43.66744],[7.36442,43.6894],[7.35305,43.7082],[7.4163,43.71091],[7.45405,43.74506],[7.4943,43.74524],[7.57943,43.78424],[7.60552,43.78603],[7.60368,43.78898],[7.59588,43.79528],[7.59628,43.79549],[7.53853,43.84195],[7.45996,43.79988],[7.44781,43.80934],[7.32353,43.74806],[7.30822,43.76357],[6.64878,43.3885],[6.66865,43.37178],[6.51003,43.27803],[6.56584,43.22509],[6.12681,43.10527],[5.48229,43.24939],[5.47267,43.2309],[5.41567,43.24657],[5.45267,43.3451],[4.80191,43.48158],[4.76416,43.39244],[4.65716,43.42368],[4.67228,43.45608],[4.43203,43.52419],[4.41453,43.49255],[4.16102,43.56433],[4.14452,43.57067],[4.14165,43.57393],[4.18677,43.59946],[4.10565,43.68196],[3.79689,43.52165],[3.77851,43.51313],[3.76464,43.50597],[3.76201,43.50334],[3.74226,43.49328],[3.71601,43.52075],[3.26213,43.28143],[3.24638,43.29735],[3.18388,43.28052],[3.10675,43.24083],[3.15475,43.19419],[2.90625,43.19383],[2.90675,42.76189],[2.94613,42.76208],[2.9465,42.61516],[2.99238,42.61497],[2.99238,42.5125],[3.041,42.51259],[3.04121,42.50093],[3.09086,42.50082],[3.14769,42.40072]],[[6.35945,43.02321],[6.42477,43.02444],[6.45244,43.03504],[6.46985,43.05461],[6.51121,43.05765],[6.52156,43.04318],[6.48364,43.02444],[6.47179,43.00725],[6.41178,42.9918],[6.39852,42.98048],[6.35178,42.99905],[6.35945,43.02321]]],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:"https://{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",zoomExtent:[0,21],polygon:[[[6.05001,49.82175],[6.04979,49.91166],[6.18901,49.91172],[6.18897,49.82181],[6.05001,49.82175]]],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:"Geoportal2-PL-aerial_image",name:"Geoportal 2: Orthophotomap (aerial image)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/img/guest/ORTO/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Raster&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://geoportal.gov.pl/web/guest/regulamin",terms_text:"Główny Urząd Geodezji i Kartografii",best:true,icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png"},{id:"Geoportal2-PL-prng",name:"Geoportal 2: PRNG (geo names)",type:"wms",template:"http://mapy.geoportal.gov.pl/wss/service/pub/guest/G2_PRNG_WMS/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=PozostaleObiektyFizjograficzne,Hydrografia,PozostaleMiejscowosci,Wies,UksztaltowanieTerenu&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}{header(User-Agent,Mozilla/5.0 (JOSM)}",projection:"EPSG:4326",polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"http://www.codgik.gov.pl/index.php/darmowe-dane/prng.html",terms_text:"Centralny Ośrodek Dokumentacji Geodezyjnej i Kartograficznej",icon:"https://wiki.openstreetmap.org/w/images/2/25/Geoportal-josm.png",overlay:true},{id:"Geoportal-PL-aerial_image",name:"Geoportal.gov.pl (Orthophotomap)",type:"tms",template:"https://wms.misek.pl/geoportal.orto/tms/{zoom}/{x}/{y}",zoomExtent:[6,24],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.78013,-9.92939],[-36.78087,-9.83892],[-36.87233,-9.83917],[-36.87173,-9.90542],[-36.87037,-9.92989],[-36.86156,-9.92994],[-36.85566,-9.92981],[-36.85146,-9.92973],[-36.84575,-9.92977],[-36.83213,-9.92967],[-36.81456,-9.9296],[-36.78013,-9.92939]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Gliwice-buildings",name:"Gliwice: Buildings",type:"wms",template:"http://185.60.246.14:9090/isdp/gs/ows?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=default:EGIB_budynek,default:pkt_adr&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.57376,50.34828],[18.58723,50.35464],[18.58421,50.3601],[18.59264,50.37522],[18.65228,50.38297],[18.67384,50.37675],[18.67672,50.36174],[18.69218,50.34467],[18.70805,50.33799],[18.74154,50.3391],[18.75145,50.33046],[18.74679,50.31236],[18.75512,50.30193],[18.76358,50.29989],[18.76539,50.26873],[18.744,50.26541],[18.73482,50.25377],[18.72775,50.22843],[18.71439,50.22835],[18.71426,50.21978],[18.67522,50.21969],[18.67607,50.22562],[18.65098,50.23169],[18.6288,50.22539],[18.61744,50.24044],[18.62699,50.24369],[18.6315,50.25487],[18.61406,50.2576],[18.60319,50.25206],[18.56536,50.24763],[18.54841,50.2492],[18.55857,50.2826],[18.5459,50.29947],[18.52896,50.33687],[18.55118,50.35332],[18.57376,50.34828]]],terms_text:"Urząd Miasta Gliwice"},{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.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress Urbana 2009"},{id:"GRAFCAN_Express-Canary_Islands",name:"GRAFCAN Express - Canary Islands",type:"wms",template:"https://idecan1.grafcan.es/ServicioWMS/OrtoExpress?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=ortoexpress&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[-17.92917,28.89106],[-18.03334,28.79981],[-18.03743,28.73178],[-17.87811,28.43224],[-17.83113,28.41787],[-17.72696,28.56328],[-17.73105,28.67982],[-17.68407,28.73715],[-17.75352,28.86781],[-17.85768,28.86065],[-17.92917,28.89106]],[[-18.07818,27.77211],[-18.13707,27.78751],[-18.17054,27.76441],[-18.1779,27.70695],[-18.15782,27.68799],[-18.0581,27.6791],[-18.00656,27.62574],[-17.96105,27.62218],[-17.93896,27.70814],[-17.90751,27.7194],[-17.86199,27.80468],[-17.8727,27.84079],[-17.92558,27.86801],[-18.00522,27.83605],[-18.01392,27.8035],[-18.07818,27.77211]],[[-17.26878,28.23996],[-17.33403,28.21933],[-17.36331,28.1537],[-17.36666,28.08803],[-17.33069,28.04742],[-17.27296,28.00681],[-17.20017,28.00533],[-17.14412,28.02896],[-17.07803,28.0836],[-17.08723,28.1537],[-17.1826,28.2149],[-17.26878,28.23996]],[[-16.9358,28.37623],[-16.945,28.33574],[-16.71995,27.98317],[-16.62541,27.98317],[-16.52753,28.01641],[-16.39953,28.14632],[-16.33594,28.30922],[-16.33009,28.36445],[-16.10253,28.52408],[-16.09834,28.5814],[-16.14268,28.62547],[-16.33929,28.59609],[-16.43801,28.53143],[-16.53924,28.44025],[-16.83959,28.41229],[-16.9358,28.37623]],[[-15.68833,28.20585],[-15.47395,28.16437],[-15.42427,28.21046],[-15.36283,28.17244],[-15.38375,28.05598],[-15.33146,27.98444],[-15.3576,27.8042],[-15.5916,27.69777],[-15.7001,27.73365],[-15.79944,27.80305],[-15.87134,27.92439],[-15.84781,28.03637],[-15.74716,28.08943],[-15.73147,28.18396],[-15.68833,28.20585]],[[-14.50882,28.13448],[-14.41078,28.13448],[-14.24868,28.24278],[-14.23822,28.34637],[-14.03953,28.73911],[-13.89442,28.78265],[-13.78592,28.77692],[-13.82122,28.38433],[-13.91534,28.19095],[-14.18593,28.13563],[-14.30881,28.00529],[-14.54019,28.05144],[-14.50882,28.13448]],[[-13.5525,29.37727],[-13.50868,29.36824],[-13.47955,29.38728],[-13.47543,29.40963],[-13.5003,29.42807],[-13.5505,29.40712],[-13.5525,29.37727]],[[-13.3976,29.16102],[-13.42814,29.12157],[-13.44174,28.99084],[-13.53899,28.91947],[-13.70841,28.88468],[-13.77116,28.80865],[-13.90083,28.83522],[-13.90711,28.88926],[-13.85796,28.93686],[-13.85691,29.03657],[-13.67599,29.14988],[-13.56723,29.15719],[-13.55428,29.35073],[-13.39988,29.21806],[-13.3976,29.16102]],[[-13.33792,29.28667],[-13.35035,29.27436],[-13.3386,29.26533],[-13.32617,29.27765],[-13.33792,29.28667]]],terms_text:"GRAFCAN OrtoExpress"},{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",zoomExtent:[0,22],polygon:[[[6.06066,48.60554],[6.29717,48.59923],[6.30611,48.74077],[6.06896,48.7471],[6.06066,48.60554]]],terms_url:"https://wiki.openstreetmap.org/wiki/Nancy/Orthophotographie",terms_text:"GrandNancy Orthophotographie 2012"},{id:"GURS-buildings",name:"GURS: Building outlines",type:"tms",template:"http://wms.openstreetmap.de/tms/GURS-building-outlines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2018 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"GURS-roads",name:"GURS: Road lines",type:"tms",template:"http://wms.openstreetmap.de/tms/GURS-road-lines/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"http://egp.gu.gov.si/",terms_text:"CC-BY ©2018 Geodetska uprava Republike Slovenije (gu.gov.si).",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/GURSRoadlines.png",overlay:true},{id:"hamburg-20cm",name:"Hamburg (20 cm)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DOP20?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.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{id:"Hamburg-DK5",name:"Hamburg (DK5)",type:"wms",template:"https://geodienste.hamburg.de/HH_WMS_DK5?FORMAT=image/png&TRANSPARENT=false&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[8.4826,53.9356],[8.48274,53.90924],[8.5275,53.90941],[8.52792,53.93577],[8.4826,53.9356]],[[9.77232,53.54352],[9.77434,53.55433],[9.76314,53.55521],[9.73047,53.55787],[9.73465,53.56536],[9.75793,53.61828],[9.77129,53.63131],[9.7707,53.61607],[9.79634,53.6103],[9.78993,53.60386],[9.81817,53.58591],[9.83773,53.59198],[9.84498,53.59498],[9.85416,53.59805],[9.86814,53.6093],[9.86931,53.61323],[9.88505,53.62199],[9.88697,53.6252],[9.89356,53.63026],[9.89637,53.63122],[9.89688,53.63492],[9.90678,53.65231],[9.93115,53.65262],[9.94552,53.65276],[9.95024,53.65085],[9.95155,53.65065],[9.97795,53.64887],[9.98492,53.6483],[9.98739,53.65072],[9.9996,53.68153],[10.02282,53.68157],[10.04338,53.68198],[10.05148,53.67759],[10.06925,53.67955],[10.0604,53.68833],[10.071,53.69585],[10.0707,53.70996],[10.08198,53.72044],[10.11908,53.71324],[10.16939,53.73896],[10.19369,53.731],[10.1779,53.70992],[10.15694,53.70451],[10.15829,53.68944],[10.14342,53.68057],[10.14176,53.67744],[10.14473,53.67613],[10.14643,53.67588],[10.14955,53.67545],[10.17153,53.66869],[10.19885,53.64675],[10.18973,53.63838],[10.22202,53.63349],[10.18887,53.61316],[10.19236,53.59474],[10.20117,53.58392],[10.15169,53.57619],[10.15067,53.56973],[10.148,53.5639],[10.15308,53.56242],[10.15942,53.56091],[10.15189,53.5417],[10.15465,53.53657],[10.16874,53.5374],[10.16327,53.52185],[10.16611,53.52013],[10.16919,53.51965],[10.18951,53.51148],[10.21043,53.51996],[10.21828,53.49923],[10.2367,53.49629],[10.25008,53.47898],[10.26592,53.47079],[10.29043,53.45512],[10.30962,53.44309],[10.31223,53.45229],[10.32514,53.44979],[10.30799,53.43332],[10.25598,53.41623],[10.25089,53.41024],[10.24578,53.40261],[10.24155,53.39797],[10.16555,53.39933],[10.14506,53.41614],[10.10949,53.42649],[10.1068,53.42658],[10.07581,53.45436],[10.05155,53.46394],[10.03517,53.4469],[10.01449,53.44203],[10.02294,53.43228],[9.99754,53.42546],[9.98243,53.41478],[9.97873,53.4142],[9.9581,53.42708],[9.92953,53.42007],[9.92552,53.41924],[9.90667,53.41596],[9.92305,53.43631],[9.91704,53.44664],[9.90436,53.45707],[9.89493,53.45583],[9.86885,53.44462],[9.86211,53.42942],[9.84872,53.44111],[9.80663,53.46648],[9.80021,53.47372],[9.8028,53.49383],[9.78203,53.49236],[9.76885,53.5053],[9.77107,53.52185],[9.78105,53.51838],[9.77352,53.52796],[9.77232,53.54352]]],terms_url:"https://www.hamburg.de/bsw/landesbetrieb-geoinformation-und-vermessung",terms_text:"Freie und Hansestadt Hamburg, Landesbetrieb Geoinformation und Vermessung"},{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",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,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",zoomExtent:[8,20],polygon:[[[-1.31567,50.77809],[-1.49139,50.73027],[-1.57113,50.69041],[-1.68095,50.71748],[-1.69338,50.73484],[-1.69528,50.74065],[-1.68689,50.74999],[-1.71068,50.74812],[-1.7195,50.75261],[-1.746,50.74452],[-1.74845,50.75675],[-1.74287,50.76397],[-1.75101,50.77577],[-1.78525,50.76177],[-1.79911,50.77236],[-1.82256,50.77225],[-1.82678,50.78077],[-1.8225,50.79933],[-1.80732,50.80074],[-1.81566,50.80752],[-1.80889,50.81358],[-1.80579,50.83249],[-1.79816,50.83535],[-1.80649,50.84414],[-1.80988,50.86189],[-1.81378,50.85591],[-1.83052,50.85261],[-1.85271,50.85651],[-1.85655,50.86684],[-1.8492,50.87802],[-1.85082,50.89178],[-1.84077,50.90051],[-1.82693,50.89939],[-1.82006,50.90492],[-1.82151,50.91691],[-1.81689,50.92412],[-1.84114,50.92886],[-1.87446,50.91441],[-1.91129,50.9439],[-1.92339,50.95917],[-1.95751,50.97575],[-1.9591,50.99152],[-1.94907,50.98649],[-1.92879,51.00055],[-1.88709,51.0026],[-1.87393,51.0097],[-1.8717,50.99083],[-1.85433,51.00786],[-1.83567,51.01238],[-1.81502,50.9899],[-1.80031,50.99457],[-1.75184,50.98133],[-1.71927,50.98047],[-1.69142,50.95943],[-1.66829,50.95041],[-1.6526,50.95029],[-1.63536,50.96269],[-1.62397,50.95903],[-1.6089,50.97686],[-1.62172,50.98099],[-1.63115,50.99984],[-1.60984,51.01225],[-1.60173,51.01042],[-1.60787,51.01582],[-1.6057,51.02271],[-1.63542,51.03176],[-1.63858,51.04126],[-1.63107,51.07819],[-1.64025,51.09201],[-1.6306,51.10359],[-1.63408,51.11099],[-1.63067,51.11652],[-1.64109,51.12237],[-1.66525,51.12546],[-1.65724,51.15539],[-1.67474,51.177],[-1.67213,51.18708],[-1.69679,51.20233],[-1.69247,51.21617],[-1.65288,51.22301],[-1.63564,51.22019],[-1.62395,51.24136],[-1.61402,51.24467],[-1.60741,51.25513],[-1.57717,51.25863],[-1.54443,51.24826],[-1.5384,51.25085],[-1.53436,51.25919],[-1.54345,51.25957],[-1.54007,51.27602],[-1.54596,51.28095],[-1.53591,51.28978],[-1.52595,51.28975],[-1.53093,51.29948],[-1.53008,51.3111],[-1.53628,51.31596],[-1.52986,51.34057],[-1.51552,51.34219],[-1.49498,51.33228],[-1.43599,51.33861],[-1.44759,51.3464],[-1.4463,51.35699],[-1.43056,51.35941],[-1.41608,51.37517],[-1.34899,51.37045],[-1.31472,51.37627],[-1.27555,51.3707],[-1.25116,51.37511],[-1.24118,51.36938],[-1.22209,51.37271],[-1.17602,51.36102],[-1.14321,51.36028],[-1.11875,51.36156],[-1.12096,51.36859],[-1.11678,51.3767],[-1.08363,51.38712],[-1.04754,51.36122],[-0.9904,51.36619],[-0.97264,51.36297],[-0.92376,51.36937],[-0.87681,51.3555],[-0.86549,51.35947],[-0.82728,51.35574],[-0.81122,51.34418],[-0.78322,51.34084],[-0.76325,51.32721],[-0.76005,51.32013],[-0.74183,51.31112],[-0.72842,51.28238],[-0.72631,51.25653],[-0.73713,51.23126],[-0.74898,51.2277],[-0.77712,51.23901],[-0.80193,51.23628],[-0.80611,51.24056],[-0.82491,51.23137],[-0.82701,51.22315],[-0.84493,51.20998],[-0.82268,51.18268],[-0.83042,51.15022],[-0.81952,51.15047],[-0.80504,51.15847],[-0.79382,51.15491],[-0.78879,51.14141],[-0.77846,51.13664],[-0.77813,51.13063],[-0.76654,51.11946],[-0.74365,51.11491],[-0.74715,51.10131],[-0.75411,51.10116],[-0.75122,51.09547],[-0.75506,51.08987],[-0.75076,51.0852],[-0.7785,51.07715],[-0.78645,51.06467],[-0.79954,51.06078],[-0.82645,51.05881],[-0.83646,51.0664],[-0.84519,51.06052],[-0.8499,51.0436],[-0.89485,51.01978],[-0.89065,51.00194],[-0.90461,50.99327],[-0.91461,50.97806],[-0.91278,50.9708],[-0.93246,50.94278],[-0.92119,50.9232],[-0.93793,50.91615],[-0.95132,50.89178],[-0.92368,50.86513],[-0.92976,50.85365],[-0.92903,50.84245],[-0.94342,50.82191],[-0.9299,50.78445],[-0.93275,50.77435],[-0.95347,50.73682],[-1.31567,50.77809]]]},{id:"helsingborg-orto",name:"Helsingborg Orthophoto",type:"tms",template:"http://mapproxy.openstreetmap.se/tiles/1.0.0/hborg2016_EPSG3857/{zoom}/{x}/{y}.jpeg",zoomExtent:[5,20],polygon:[[[12.74345,55.94997],[12.93777,55.90804],[13.00369,55.96842],[12.79083,56.25022],[12.56698,56.1356],[12.74345,55.94997]]],terms_url:"https://helsingborg.opendatasoft.com/",terms_text:"© Helsingborg municipality",best:true,description:"Orthophotos from the municipality of Helsingborg 2016, public domain",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/1/18/Helsingborg_vapen.svg/198px-Helsingborg_vapen.svg.png"},{id:"hri-orto",name:"Helsinki region orthophoto",type:"wms",template:"https://kartta.hsy.fi/geoserver/ows?SERVICE=WMS&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=taustakartat_ja_aluejaot:Ortoilmakuva_2017&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[24.26948,59.8593],[24.26674,60.22549],[24.55307,60.36703],[24.50363,60.49038],[24.76387,60.60079],[25.00625,60.54175],[24.90051,60.38197],[24.9884,60.35073],[25.06943,60.44096],[25.17517,60.45248],[25.18066,60.34122],[25.27954,60.2943],[25.19577,60.08813],[24.26948,59.8593]]],terms_url:"https://hri.fi/data/en_GB/dataset/paakaupunkiseudun-ortokuva-2017",terms_text:"© Espoon, Helsingin ja Vantaan kaupungit, Kirkkonummen ja Nurmijärven kunnat sekä HSL ja HSY",best:true,description:"Ortophotos from the municipalities of Espoo, Helsinki, Vantaa, Kirkkonummi and Nurmijärvi + HSL and HSY",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/fi/hri_logo.png"},{id:"hu-hillshade",name:"Hillshade Hungary",type:"tms",template:"https://{switch:a,b,c}.map.turistautak.hu/tiles/shading/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[15,45],[24,45],[24,49],[15,49],[15,45]]],terms_text:"SRTM",overlay:true},{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",zoomExtent:[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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,14],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-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.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-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.14559,4.48016],[-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.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-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.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-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.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-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.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-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.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-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.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[0,19],polygon:[[[-69.94793,-4.23168],[-69.45659,-1.49119],[-69.3973,-1.36508],[-69.42989,-1.22173],[-69.39523,-1.12555],[-69.44292,-1.03351],[-69.41861,-0.99827],[-69.528,-0.92514],[-69.52577,-0.86807],[-69.62491,-0.74667],[-69.56179,-0.63692],[-69.60783,-0.5008],[-69.8446,-0.33732],[-69.92054,-0.32573],[-70.04323,-0.18998],[-70.04302,0.56359],[-69.80272,0.57162],[-69.6711,0.66759],[-69.60529,0.61328],[-69.59701,0.6542],[-69.48002,0.73577],[-69.35277,0.61416],[-69.28914,0.64997],[-69.29484,0.60389],[-69.19975,0.60591],[-69.19425,0.64982],[-69.11563,0.64484],[-69.19001,0.74056],[-69.14881,0.76751],[-69.13576,0.87204],[-69.18846,0.91324],[-69.1646,0.94156],[-69.21679,0.97245],[-69.19773,0.99974],[-69.24494,1.05655],[-69.37641,1.08794],[-69.42312,1.04265],[-69.60989,1.09826],[-69.67718,1.06994],[-69.70963,1.11817],[-69.84266,1.07272],[-69.83972,1.71893],[-69.78236,1.69244],[-69.53464,1.77691],[-69.39109,1.72935],[-68.1645,1.72945],[-68.19207,1.7797],[-68.23954,1.77044],[-68.22688,1.82918],[-68.28555,1.83084],[-68.19583,2.03479],[-68.18033,1.9767],[-68.14417,1.97854],[-68.09043,1.89774],[-67.90162,1.81165],[-67.76942,2.00924],[-67.55095,2.04769],[-67.49519,2.16312],[-67.39404,2.22894],[-67.32672,2.06387],[-67.33083,1.94158],[-67.22831,1.84127],[-67.15384,1.8315],[-67.15922,1.67504],[-67.08017,1.38546],[-67.13923,1.32002],[-67.08675,1.16704],[-66.85119,1.22896],[-66.31032,0.74494],[-66.19737,0.78161],[-66.07783,0.76174],[-66.07024,0.8123],[-65.96712,0.81511],[-65.88369,0.94159],[-65.77261,0.95859],[-65.7421,1.00125],[-65.58894,1.00471],[-65.49624,0.87415],[-65.60623,0.70748],[-65.54116,0.64881],[-65.44499,0.68921],[-65.39213,0.75692],[-65.41198,0.82415],[-65.32734,0.93596],[-65.21302,0.90282],[-65.1749,0.94131],[-65.15831,1.1246],[-65.07232,1.15303],[-65.06317,1.11205],[-65.01361,1.10905],[-64.97445,1.20288],[-64.90439,1.25153],[-64.86966,1.22713],[-64.80053,1.31527],[-64.74446,1.22569],[-64.5789,1.34041],[-64.52608,1.44322],[-64.43586,1.47006],[-64.3939,1.52901],[-64.35111,1.52921],[-64.34777,1.49508],[-64.41019,1.40301],[-64.33791,1.36134],[-64.3136,1.45617],[-64.19707,1.52071],[-64.0735,1.64902],[-64.05781,1.92899],[-63.97219,1.99194],[-63.83555,1.96644],[-63.71155,2.04645],[-63.66501,2.01861],[-63.6268,2.11222],[-63.56474,2.13571],[-63.44059,2.126],[-63.36742,2.26864],[-63.37088,2.41121],[-63.42123,2.45102],[-63.46036,2.39684],[-63.56398,2.44573],[-63.76805,2.43994],[-63.84358,2.4916],[-64.01914,2.46135],[-64.0573,2.49752],[-63.98033,2.7237],[-64.07709,2.87262],[-64.07156,2.92142],[-64.12349,2.99048],[-64.15754,2.98243],[-64.14592,3.03459],[-64.22642,3.12356],[-64.19795,3.20121],[-64.2444,3.43036],[-64.17437,3.56841],[-64.281,3.70928],[-64.54357,3.85713],[-64.72239,4.11775],[-64.80203,4.17422],[-64.81123,4.27048],[-64.69522,4.25323],[-64.623,4.135],[-64.5565,4.10529],[-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.14308,4.07768],[-62.071,4.126],[-62.076,4.154],[-61.982,4.181],[-61.93175,4.12009],[-61.92213,4.16126],[-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.14559,4.48016],[-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.73197,5.21203],[-60.434,5.182],[-60.20825,5.28346],[-60.172,5.227],[-60.135,5.249],[-60.094,5.14],[-59.96984,5.06334],[-60.02524,4.7065],[-60.0705,4.61688],[-60.15725,4.57247],[-60.16114,4.51773],[-59.79503,4.46554],[-59.66948,4.37629],[-59.7319,4.28587],[-59.73069,4.18076],[-59.61818,4.13166],[-59.65406,4.06943],[-59.58417,3.96851],[-59.5153,3.94493],[-59.59279,3.88538],[-59.59631,3.79386],[-59.66555,3.78126],[-59.66842,3.70277],[-59.86728,3.57776],[-59.80205,3.50156],[-59.8408,3.43174],[-59.80488,3.35695],[-59.907,3.212],[-59.98944,2.88185],[-59.99,2.686],[-59.895,2.482],[-59.89872,2.36245],[-59.72315,2.27614],[-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.82512,1.17127],[-58.73956,1.1999],[-58.69456,1.29732],[-58.49622,1.26796],[-58.45787,1.37145],[-58.50511,1.40317],[-58.50873,1.46295],[-58.38559,1.46999],[-58.39472,1.52651],[-58.32237,1.59702],[-58.236,1.54669],[-58.16064,1.56011],[-58.12942,1.4989],[-58.00423,1.50303],[-57.99009,1.65844],[-57.85206,1.66782],[-57.77431,1.72973],[-57.70509,1.73093],[-57.65042,1.68237],[-57.5376,1.7005],[-57.50187,1.78609],[-57.43776,1.82681],[-57.43343,1.90598],[-57.36768,1.92372],[-57.36912,1.95638],[-57.30712,1.99665],[-57.22923,1.93759],[-57.08668,2.02644],[-57.01421,1.91489],[-56.91971,1.93036],[-56.79793,1.85336],[-56.72096,1.92582],[-56.62145,1.94588],[-56.57976,1.90588],[-56.45126,1.95614],[-56.24404,1.87808],[-56.1709,1.90048],[-56.11762,1.85097],[-55.95638,1.84509],[-55.90385,1.88803],[-55.93635,1.98647],[-55.9031,2.04108],[-56.00307,2.1676],[-56.05505,2.18464],[-56.04288,2.22778],[-56.13887,2.26574],[-56.09012,2.37228],[-56.02181,2.34247],[-55.97052,2.52931],[-55.76663,2.45524],[-55.71028,2.39917],[-55.49971,2.44324],[-55.38533,2.41836],[-55.32019,2.51537],[-55.23474,2.50338],[-55.1234,2.56762],[-55.10302,2.52564],[-54.95424,2.58359],[-54.86846,2.43989],[-54.68917,2.45389],[-54.68861,2.32472],[-54.54667,2.31833],[-54.53778,2.26556],[-54.46861,2.21306],[-54.24917,2.14667],[-54.18056,2.1725],[-54.11083,2.11222],[-54.06139,2.19167],[-53.94083,2.21917],[-53.93194,2.27194],[-53.88667,2.26778],[-53.745,2.37389],[-53.73389,2.31222],[-53.52972,2.24917],[-53.45861,2.2575],[-53.32833,2.35333],[-53.21667,2.25333],[-53.27899,2.18603],[-53.11861,2.2225],[-52.99472,2.17528],[-52.90972,2.19583],[-52.84722,2.28556],[-52.67528,2.37389],[-52.59444,2.47389],[-52.54028,2.57028],[-52.56417,2.63944],[-52.43944,2.87778],[-52.39583,2.90222],[-52.33187,3.16938],[-52.21472,3.26833],[-51.97104,3.70696],[-51.92148,3.72422],[-51.922,3.7792],[-51.79731,3.88888],[-51.77783,3.97406],[-51.65867,4.05276],[-51.61325,4.17437],[-51.63716,4.50834],[-51.49427,4.67426],[-51.11466,4.42286],[-50.94232,4.20165],[-50.85475,3.92491],[-50.85507,3.45573],[-50.75331,2.94057],[-50.29908,2.33079],[-49.73896,1.79143],[-48.23746,-0.07449],[-44.84728,-1.07246],[-43.54602,-2.04705],[-43.24389,-2.12403],[-42.78189,-2.33053],[-41.78084,-2.51859],[-41.5085,-2.68486],[-40.66365,-2.63829],[-40.50396,-2.57531],[-39.8907,-2.65328],[-39.15187,-3.04444],[-38.57151,-3.48047],[-38.34306,-3.54434],[-38.21421,-3.74103],[-38.12555,-3.80544],[-37.90182,-4.07265],[-37.77934,-4.18046],[-37.63401,-4.24454],[-37.51218,-4.41535],[-37.22122,-4.51045],[-37.07874,-4.71355],[-36.91716,-4.71372],[-36.62299,-4.85815],[-36.18969,-4.88505],[-35.93627,-4.83327],[-35.56471,-4.90758],[-35.33677,-4.99239],[-35.17659,-5.12497],[-34.79469,-6.33583],[-34.71587,-6.74615],[-34.62306,-6.90323],[-34.59953,-7.11133],[-34.64374,-7.98735],[-34.81497,-8.62472],[-35.0253,-9.13761],[-35.55848,-9.81261],[-35.69663,-9.90026],[-35.96401,-10.31281],[-36.06155,-10.37447],[-36.26639,-10.64593],[-36.61764,-10.81082],[-36.78725,-10.95151],[-36.99511,-11.29602],[-37.11368,-11.41261],[-37.46002,-12.10275],[-37.89668,-12.75844],[-38.22146,-13.09717],[-38.61146,-13.26537],[-38.85337,-14.65508],[-38.74388,-15.60089],[-38.66456,-15.74741],[-38.64697,-15.88327],[-38.8013,-16.24838],[-38.92933,-16.80775],[-38.53193,-17.80026],[-38.49171,-18.0046],[-38.53661,-18.09683],[-38.67053,-18.16855],[-39.35288,-18.10892],[-39.4675,-18.30359],[-39.54529,-18.78548],[-39.49227,-19.40134],[-39.63477,-19.74403],[-39.86353,-19.88681],[-40.17827,-20.75426],[-40.81442,-21.67672],[-40.76948,-21.87786],[-40.81442,-22.09702],[-41.5086,-22.52638],[-41.59666,-22.83627],[-41.79292,-23.08823],[-41.91484,-23.18527],[-43.19603,-23.26703],[-44.07735,-23.40501],[-45.13508,-24.12014],[-46.61368,-24.67512],[-47.85376,-25.47012],[-48.2801,-26.23036],[-48.34897,-26.75081],[-48.11076,-27.28208],[-48.21148,-27.85592],[-48.40713,-28.43255],[-48.68615,-28.76016],[-48.9156,-28.86305],[-49.1579,-29.02871],[-49.52748,-29.42005],[-49.82565,-29.86559],[-50.17344,-30.64282],[-50.60441,-31.24135],[-51.18785,-31.77646],[-51.74211,-32.10539],[-51.89236,-32.29596],[-52.06117,-32.38504],[-52.27087,-32.92102],[-52.45986,-33.25369],[-52.61505,-33.42291],[-53.18109,-33.86891],[-53.43053,-33.73947],[-53.43951,-33.69347],[-53.53228,-33.6888],[-53.51819,-33.15342],[-53.44438,-33.05296],[-53.24468,-32.93489],[-53.31008,-32.91875],[-53.29454,-32.89931],[-53.18496,-32.85043],[-53.14569,-32.79202],[-53.0858,-32.78835],[-53.07558,-32.74088],[-53.24992,-32.6041],[-53.39137,-32.58573],[-53.46423,-32.48446],[-53.58321,-32.45192],[-53.74599,-32.07848],[-53.83375,-32.05524],[-53.84978,-32.00064],[-53.96073,-31.95532],[-53.96972,-31.91765],[-54.10019,-31.92825],[-54.4549,-31.65295],[-54.4528,-31.59959],[-54.58676,-31.45656],[-54.8367,-31.442],[-54.88623,-31.3773],[-54.94087,-31.38068],[-55.00723,-31.26692],[-55.07446,-31.33216],[-55.24003,-31.26062],[-55.29118,-31.14226],[-55.34037,-31.13144],[-55.34981,-31.03922],[-55.42306,-31.01823],[-55.57742,-30.83309],[-55.65834,-30.864],[-55.66621,-30.95395],[-55.723,-30.943],[-55.727,-30.979],[-55.882,-31.077],[-56.00989,-31.08267],[-56.02241,-30.78565],[-56.12508,-30.73871],[-56.17074,-30.61517],[-56.26095,-30.58509],[-56.29193,-30.51967],[-56.38177,-30.49956],[-56.46126,-30.38486],[-56.54706,-30.35946],[-56.54115,-30.31291],[-56.6187,-30.30054],[-56.64628,-30.20346],[-56.77662,-30.1633],[-56.80777,-30.10301],[-57.07113,-30.08671],[-57.22081,-30.28928],[-57.31303,-30.25785],[-57.39229,-30.30474],[-57.46574,-30.26589],[-57.52431,-30.28569],[-57.56087,-30.21134],[-57.64744,-30.19483],[-57.48047,-30.12315],[-57.33713,-29.99284],[-57.294,-29.831],[-57.121,-29.765],[-56.89888,-29.53179],[-56.81905,-29.48816],[-56.76618,-29.37768],[-56.70164,-29.35913],[-56.59315,-29.12516],[-56.418,-29.075],[-56.40775,-28.9748],[-56.29995,-28.89614],[-56.29652,-28.8027],[-56.17858,-28.75922],[-56.00984,-28.60718],[-56.01249,-28.50873],[-55.88357,-28.47923],[-55.87739,-28.36159],[-55.75157,-28.37095],[-55.69433,-28.42204],[-55.67047,-28.33218],[-55.77415,-28.27414],[-55.7757,-28.24481],[-55.63167,-28.17719],[-55.60747,-28.11604],[-55.55957,-28.16523],[-55.4952,-28.07682],[-55.44611,-28.09787],[-55.368,-28.029],[-55.38299,-27.97948],[-55.343,-27.972],[-55.32706,-27.92664],[-55.26574,-27.92969],[-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.90617,-27.63871],[-54.85,-27.624],[-54.814,-27.533],[-54.775,-27.586],[-54.67926,-27.57394],[-54.67709,-27.508],[-54.621,-27.541],[-54.574,-27.453],[-54.5246,-27.5059],[-54.444,-27.472],[-54.47081,-27.42674],[-54.41,-27.405],[-54.35466,-27.46528],[-54.34067,-27.40311],[-54.28484,-27.44819],[-54.261,-27.397],[-54.21736,-27.38603],[-54.172,-27.254],[-54.15619,-27.29619],[-54.08872,-27.30149],[-54.01026,-27.19978],[-53.96219,-27.19698],[-53.95195,-27.15169],[-53.79879,-27.14629],[-53.80233,-27.04028],[-53.76087,-27.06543],[-53.78585,-27.02674],[-53.7473,-27.03218],[-53.7092,-26.93414],[-53.67125,-26.94222],[-53.69684,-26.86015],[-53.66059,-26.85814],[-53.75814,-26.72045],[-53.7205,-26.65099],[-53.75864,-26.64113],[-53.63739,-26.24968],[-53.742,-26.108],[-53.73409,-26.04333],[-53.83619,-25.97166],[-53.82214,-25.79377],[-53.89113,-25.62286],[-53.94895,-25.6117],[-53.95638,-25.64628],[-54.01,-25.567],[-54.07592,-25.55766],[-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.38395,-25.59747],[-54.43288,-25.69756],[-54.4927,-25.6181],[-54.59354,-25.59275],[-54.61941,-25.45312],[-54.4295,-25.15915],[-54.43548,-24.94769],[-54.32437,-24.66059],[-54.32714,-24.47073],[-54.25877,-24.36377],[-54.34537,-24.14705],[-54.28223,-24.07336],[-54.43984,-23.90446],[-54.66978,-23.81262],[-54.70533,-23.86452],[-54.89,-23.898],[-54.924,-23.959],[-55.06223,-23.99335],[-55.107,-23.961],[-55.22907,-24.01383],[-55.30415,-23.96504],[-55.34542,-23.99458],[-55.41423,-23.9645],[-55.44167,-23.70084],[-55.47306,-23.64834],[-55.53989,-23.625],[-55.52356,-23.19733],[-55.54199,-23.1561],[-55.59635,-23.14993],[-55.66578,-22.85274],[-55.61432,-22.65521],[-55.72364,-22.55166],[-55.74302,-22.39266],[-55.78939,-22.3846],[-55.84304,-22.28725],[-56.20983,-22.27805],[-56.36485,-22.16949],[-56.39404,-22.07434],[-56.50711,-22.09561],[-56.63705,-22.26341],[-56.70344,-22.21693],[-56.72026,-22.26479],[-56.79344,-22.24238],[-56.84285,-22.30155],[-56.88343,-22.24755],[-56.9967,-22.22246],[-57.3744,-22.23204],[-57.5804,-22.17534],[-57.6106,-22.09462],[-57.70751,-22.09111],[-57.80183,-22.15072],[-57.99384,-22.09023],[-58.00946,-22.04038],[-57.91281,-21.88266],[-57.96603,-21.85045],[-57.90866,-21.77355],[-57.94714,-21.74413],[-57.88329,-21.68903],[-57.93436,-21.65037],[-57.91387,-21.59021],[-57.96795,-21.52432],[-57.8535,-21.33109],[-57.92019,-21.27655],[-57.85066,-21.22407],[-57.86834,-21.04417],[-57.81919,-20.94066],[-57.92836,-20.90036],[-57.8552,-20.83403],[-57.89863,-20.78872],[-57.96183,-20.7916],[-57.93478,-20.74565],[-57.86732,-20.73265],[-57.92414,-20.66392],[-57.98848,-20.69879],[-57.99847,-20.43551],[-58.09339,-20.35554],[-58.09596,-20.25445],[-58.16216,-20.25953],[-58.12152,-20.19246],[-58.16932,-20.1694],[-57.95347,-20.02094],[-57.90248,-20.04207],[-57.85796,-19.9703],[-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.72302,-17.83074],[-57.68472,-17.8306],[-57.70991,-17.72702],[-57.783,-17.639],[-57.73696,-17.5583],[-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.32227,-16.26559],[-58.388,-16.261],[-58.43059,-16.32264],[-60.17335,-16.26672],[-60.238,-15.473],[-60.57543,-15.09677],[-60.244,-15.096],[-60.272,-14.62],[-60.321,-14.608],[-60.492,-14.188],[-60.479,-14.097],[-60.38066,-13.9888],[-60.45062,-13.9364],[-60.45599,-13.85422],[-60.49068,-13.85782],[-60.46776,-13.79446],[-60.76755,-13.68329],[-60.87678,-13.62149],[-60.91857,-13.54334],[-61.0056,-13.552],[-61.0129,-13.48925],[-61.0938,-13.49081],[-61.10314,-13.53056],[-61.18155,-13.50557],[-61.19236,-13.53695],[-61.29954,-13.47718],[-61.46527,-13.55427],[-61.57927,-13.48711],[-61.852,-13.538],[-61.892,-13.431],[-61.96968,-13.40759],[-61.97592,-13.36695],[-62.11498,-13.25932],[-62.115,-13.163],[-62.15254,-13.15993],[-62.16703,-13.11346],[-62.19,-13.153],[-62.214,-13.111],[-62.27269,-13.15687],[-62.39178,-13.13471],[-62.453,-13.064],[-62.612,-13.041],[-62.65,-12.965],[-62.729,-13.02],[-62.779,-13.009],[-62.89672,-12.8539],[-63.01134,-12.83602],[-63.08186,-12.72323],[-63.06163,-12.68584],[-63.15726,-12.6138],[-63.24621,-12.66222],[-63.23713,-12.69043],[-63.30125,-12.68138],[-63.44052,-12.608],[-63.43627,-12.56526],[-63.50641,-12.56562],[-63.55295,-12.50598],[-63.7848,-12.42871],[-63.88957,-12.44745],[-63.89949,-12.50204],[-63.95144,-12.53179],[-64.13464,-12.47732],[-64.16781,-12.51503],[-64.17504,-12.46675],[-64.22945,-12.45419],[-64.29018,-12.50313],[-64.29452,-12.4582],[-64.41057,-12.44436],[-64.51217,-12.3551],[-64.51256,-12.22562],[-64.70406,-12.1827],[-64.70719,-12.08684],[-64.75486,-12.15762],[-64.7688,-12.09356],[-64.83747,-12.11786],[-64.80954,-12.05633],[-64.84077,-12.01027],[-65.03548,-11.99408],[-65.01398,-11.90303],[-65.0727,-11.86587],[-65.08672,-11.7082],[-65.18953,-11.72353],[-65.18216,-11.75609],[-65.2593,-11.71053],[-65.21178,-11.52857],[-65.3074,-11.49957],[-65.33276,-11.33986],[-65.29053,-11.32275],[-65.34347,-11.3082],[-65.35834,-11.26834],[-65.35938,-11.22067],[-65.31294,-11.19578],[-65.35387,-11.18419],[-65.36177,-11.14031],[-65.28269,-11.09009],[-65.30071,-11.03142],[-65.25053,-10.98506],[-65.27476,-10.87302],[-65.35376,-10.78881],[-65.34667,-10.68155],[-65.40569,-10.63935],[-65.43011,-10.48505],[-65.288,-10.219],[-65.333,-9.965],[-65.28588,-9.84413],[-65.39313,-9.68683],[-65.44394,-9.66957],[-65.4883,-9.71015],[-65.55611,-9.84498],[-65.627,-9.83804],[-65.66963,-9.78129],[-65.71023,-9.80857],[-65.68395,-9.74992],[-65.7432,-9.78296],[-65.77013,-9.73442],[-65.79437,-9.79295],[-65.79962,-9.75663],[-65.86532,-9.79533],[-65.87184,-9.75307],[-65.91976,-9.75314],[-65.98222,-9.81011],[-66.151,-9.785],[-66.426,-9.899],[-66.435,-9.866],[-66.61995,-9.89353],[-66.63701,-9.94983],[-66.8751,-10.08268],[-66.9528,-10.18886],[-66.99683,-10.20017],[-67.01537,-10.25919],[-67.17745,-10.33923],[-67.31545,-10.31932],[-67.31155,-10.37716],[-67.40717,-10.37386],[-67.44361,-10.45492],[-67.57925,-10.5028],[-67.64028,-10.59807],[-67.67631,-10.60484],[-67.70825,-10.71083],[-67.86386,-10.64067],[-68.03289,-10.65486],[-68.10456,-10.71426],[-68.10333,-10.77541],[-68.27819,-10.98926],[-68.71576,-11.14483],[-68.75767,-11.00079],[-68.9118,-11.02192],[-69.41453,-10.92575],[-69.73653,-10.97445],[-69.76903,-10.92972],[-69.93442,-10.9219],[-70.15869,-11.04096],[-70.30672,-11.06983],[-70.43675,-11.03923],[-70.53033,-10.93465],[-70.62103,-10.99982],[-70.62338,-9.82054],[-70.53663,-9.76584],[-70.59972,-9.56264],[-70.55282,-9.57093],[-70.56894,-9.53127],[-70.50506,-9.50557],[-70.49665,-9.42489],[-70.59581,-9.4425],[-70.6632,-9.52601],[-70.75067,-9.56043],[-70.79332,-9.63846],[-70.96337,-9.74891],[-70.99391,-9.81721],[-71.13974,-9.85702],[-71.22052,-9.96968],[-72.1804,-9.99967],[-72.15136,-9.79742],[-72.26296,-9.75085],[-72.25282,-9.61633],[-72.28821,-9.60316],[-72.2829,-9.53995],[-72.35688,-9.4946],[-72.51954,-9.49128],[-72.71676,-9.4122],[-73.2038,-9.40715],[-73.07352,-9.23461],[-73.0093,-9.22236],[-73.02612,-9.17786],[-72.9582,-9.14302],[-72.94091,-8.98494],[-72.99931,-8.91778],[-73.05901,-8.90561],[-73.14992,-8.6839],[-73.20907,-8.6857],[-73.28745,-8.61948],[-73.3055,-8.47197],[-73.38956,-8.46878],[-73.41286,-8.41099],[-73.53744,-8.34587],[-73.62739,-8.02187],[-73.73175,-7.9684],[-73.7725,-7.90237],[-73.76164,-7.85803],[-73.69706,-7.86527],[-73.6843,-7.77644],[-73.82217,-7.71788],[-73.99094,-7.53635],[-73.948,-7.52661],[-73.91981,-7.46568],[-73.96394,-7.34764],[-73.87014,-7.37882],[-73.7003,-7.30429],[-73.79842,-7.11306],[-73.71046,-6.84019],[-73.53639,-6.6834],[-73.39115,-6.64193],[-73.35281,-6.59327],[-73.22741,-6.58884],[-73.18797,-6.52302],[-73.13523,-6.51046],[-73.10473,-6.40666],[-73.24664,-6.14963],[-73.23821,-6.04399],[-73.1868,-6.00512],[-73.15207,-5.86796],[-73.05303,-5.79517],[-72.95912,-5.65689],[-72.95888,-5.46613],[-72.86052,-5.27117],[-72.88725,-5.16307],[-72.73986,-5.08859],[-72.72765,-5.05199],[-72.6212,-5.0518],[-72.598,-4.98386],[-72.38202,-4.87296],[-72.36895,-4.80387],[-72.12601,-4.73454],[-72.04335,-4.62384],[-72.00689,-4.64622],[-71.99464,-4.60996],[-71.94743,-4.60877],[-71.91909,-4.5298],[-71.88549,-4.53803],[-71.9073,-4.51644],[-71.76637,-4.50446],[-71.75109,-4.46887],[-71.70817,-4.51165],[-71.65479,-4.47246],[-71.65032,-4.50395],[-71.61548,-4.4687],[-71.6335,-4.51524],[-71.59625,-4.52928],[-71.53703,-4.46442],[-71.49428,-4.48701],[-71.50716,-4.43909],[-71.43438,-4.42882],[-71.42562,-4.47058],[-71.35026,-4.42728],[-71.30752,-4.46288],[-71.32091,-4.42009],[-71.27782,-4.44217],[-71.26975,-4.385],[-71.20263,-4.37987],[-71.19422,-4.42471],[-71.14478,-4.38158],[-71.11491,-4.41119],[-71.10616,-4.37764],[-70.99389,-4.38654],[-70.99595,-4.34632],[-70.9357,-4.38432],[-70.84483,-4.27905],[-70.86447,-4.25245],[-70.81677,-4.23005],[-70.8458,-4.21872],[-70.75901,-4.15944],[-70.68147,-4.20791],[-70.64256,-4.12805],[-70.62521,-4.19151],[-70.56118,-4.1775],[-70.57357,-4.21169],[-70.54796,-4.13671],[-70.51036,-4.14824],[-70.50417,-4.20098],[-70.48535,-4.16132],[-70.43435,-4.16266],[-70.43146,-4.13217],[-70.33892,-4.17997],[-70.32281,-4.14206],[-70.28769,-4.16555],[-70.29141,-4.28709],[-70.21457,-4.29749],[-70.19194,-4.36179],[-70.15508,-4.27308],[-70.11749,-4.28585],[-70.10881,-4.25454],[-70.04189,-4.29409],[-70.07948,-4.31428],[-70.02826,-4.3703],[-69.99182,-4.37482],[-69.94793,-4.23168]],[[-34.00035,-3.76654],[-34.01797,-3.84985],[-34.00664,-3.91809],[-33.98608,-3.95952],[-33.95923,-3.99217],[-33.8921,-4.03653],[-33.81658,-4.05077],[-33.72931,-4.03151],[-33.66638,-3.9838],[-33.62736,-3.9185],[-33.61519,-3.84985],[-33.63239,-3.76864],[-33.68693,-3.69537],[-33.74987,-3.65978],[-33.81658,-3.6489],[-33.89336,-3.66397],[-33.96007,-3.70877],[-34.00035,-3.76654]],[[-32.5538,-4.00884],[-32.59937,-3.9531],[-32.64061,-3.87309],[-32.61755,-3.73712],[-32.58338,-3.70527],[-32.54228,-3.65606],[-32.4592,-3.63029],[-32.35174,-3.63887],[-32.30049,-3.67684],[-32.24749,-3.75266],[-32.23155,-3.81889],[-32.2357,-3.90247],[-32.30194,-3.9883],[-32.42898,-4.0384],[-32.5538,-4.00884]],[[-29.50321,0.79391],[-29.54097,0.8689],[-29.54727,0.92553],[-29.52367,0.99422],[-29.48958,1.06134],[-29.43136,1.10224],[-29.35899,1.1206],[-29.29238,1.11378],[-29.22158,1.0776],[-29.16285,1.00314],[-29.14501,0.92605],[-29.14764,0.88358],[-29.17176,0.8196],[-29.24885,0.74357],[-29.29448,0.72521],[-29.36371,0.71892],[-29.43556,0.73937],[-29.50321,0.79391]],[[-29.09537,-20.42649],[-29.19756,-20.33509],[-29.3343,-20.28932],[-29.46741,-20.3288],[-29.54604,-20.42958],[-29.55396,-20.52706],[-29.51696,-20.62613],[-29.40995,-20.68955],[-29.27599,-20.72578],[-29.15968,-20.66209],[-29.07188,-20.57088],[-28.9712,-20.64769],[-28.83286,-20.69814],[-28.67968,-20.62099],[-28.63549,-20.49284],[-28.63412,-20.47146],[-28.7431,-20.30094],[-28.8683,-20.27288],[-29.0031,-20.32416],[-29.09537,-20.42649]]],terms_text:"IBGE",icon:"https://osmlab.github.io/editor-layer-index/sources/south-america/br/IBGE_Setores_Rurais.png"},{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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],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.33596],[-28.72472,2.03155],[-27.76041,-8.93703],[-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.83894],[-66.52331,-9.98587],[-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.66908],[-71.27536,-10.08971],[-72.18053,-10.09967],[-72.41623,-9.5874],[-73.29207,-9.45415],[-73.0625,-9.01727],[-73.61432,-8.40982],[-74.09056,-7.52755],[-74.03652,-7.27885],[-73.84718,-7.23829],[-73.78618,-6.77487],[-73.22362,-6.43011],[-73.33719,-6.02974],[-72.93016,-5.03871],[-71.93973,-4.42503],[-70.96802,-4.24829],[-70.79598,-4.06493],[-70.02393,-4.16735],[-69.51025,-1.13409],[-69.70776,-0.56762],[-70.13645,-0.22616],[-70.14083,0.5844],[-69.26594,0.8065],[-69.34226,0.96892],[-69.92481,1.01571],[-69.92343,1.77385],[-68.38511,1.82943],[-68.24848,2.11981],[-67.94571,1.94842],[-67.37696,2.32747],[-67.05751,1.85834],[-67.00579,1.2916],[-66.79967,1.31468],[-66.28683,0.85771],[-65.67671,1.11115],[-65.42494,0.96655],[-65.15671,1.24203],[-64.27483,1.60159],[-64.0486,2.06514],[-63.47236,2.27936],[-64.13446,2.43391],[-64.10005,2.72378],[-64.32628,3.11828],[-64.28142,3.54198],[-64.88451,4.11767],[-64.88064,4.34246],[-64.13653,4.22315],[-63.95465,4.02132],[-63.17706,4.0483],[-62.96093,3.76366],[-62.82024,4.10602],[-62.49922,4.27081],[-61.91181,4.26284],[-61.35393,4.6301],[-61.04904,4.62312],[-60.70452,4.96985],[-60.78709,5.29676],[-60.22457,5.37121],[-59.89857,5.10754],[-59.97549,4.60302],[-59.59676,4.43987],[-59.41942,3.96994],[-59.71017,3.54201],[-59.88955,2.72301],[-59.63006,2.31633],[-59.63382,1.96658],[-59.18812,1.47808],[-58.80545,1.32073],[-58.35933,1.68993],[-57.6,1.80391],[-57.39854,2.06512],[-57.12392,2.12876],[-56.02925,1.94945],[-56.23884,2.26335],[-55.98195,2.62866],[-55.64816,2.51995],[-54.93958,2.68251],[-54.24988,2.25056],[-53.73937,2.47373],[-52.98578,2.28049],[-52.65712,2.56407],[-52.41739,3.22121],[-51.73983,4.11916],[-51.7246,4.55687],[-51.0112,5.5229],[-43.48209,5.33583],[-29.3325,2.33596]]],terms_text:"IBGE",overlay:true},{id:"ign-topografico-tms",name:"IGN topographical map (TMS)",type:"tms",template:"https://ide.ign.gob.ar/geoservicios/rest/services/Mapas_IGN/mapa_topografico/MapServer/tile/{zoom}/{y}/{x}",zoomExtent:[1,20],polygon:[[[-55.5438,-35.77219],[-64.31743,-49.44788],[-61.52546,-55.68296],[-66.04226,-55.24192],[-66.6896,-55.17191],[-66.86233,-55.04496],[-67.23387,-54.9245],[-67.47633,-54.92785],[-67.71808,-54.91261],[-67.96138,-54.88571],[-68.18753,-54.89288],[-68.61804,-54.92151],[-68.66375,-52.66716],[-68.51023,-52.39432],[-70.01629,-52.05707],[-72.05562,-52.01749],[-72.09055,-51.93758],[-72.02273,-51.88832],[-72.49598,-51.597],[-72.3623,-51.25935],[-72.46252,-51.08654],[-72.31217,-50.90093],[-72.39293,-50.69005],[-72.49148,-50.66866],[-72.59646,-50.73916],[-72.76983,-50.68829],[-73.22154,-50.87193],[-73.22709,-50.66897],[-73.39438,-50.58008],[-73.57703,-50.15788],[-73.53993,-50.01443],[-73.61453,-49.91795],[-73.52684,-49.7716],[-73.02779,-49.70085],[-73.02788,-49.23743],[-73.16148,-49.13062],[-72.96385,-48.89084],[-72.80952,-48.90039],[-72.59462,-48.77255],[-72.63621,-48.45823],[-72.46698,-48.45706],[-72.42158,-48.31422],[-72.3428,-48.29046],[-72.37166,-48.15995],[-72.57678,-47.96054],[-72.5731,-47.72062],[-72.3839,-47.57888],[-72.38448,-47.41759],[-72.07162,-47.2755],[-72.04726,-47.14867],[-71.93566,-47.15037],[-72.00956,-47.08473],[-72.00759,-46.78833],[-71.71488,-46.64453],[-71.7985,-46.26925],[-71.97019,-46.14972],[-71.63332,-45.97063],[-71.66595,-45.89232],[-71.77408,-45.85187],[-71.8548,-45.61169],[-71.7885,-45.50505],[-71.58354,-45.45607],[-71.58236,-45.36316],[-71.40574,-45.27206],[-71.61593,-45.03146],[-72.07949,-44.93988],[-72.11766,-44.73884],[-71.47444,-44.68048],[-71.2897,-44.75036],[-71.28469,-44.60892],[-71.20209,-44.5359],[-71.40536,-44.44891],[-71.86374,-44.44274],[-71.9047,-44.10354],[-71.70007,-43.98287],[-71.78725,-43.80985],[-71.63263,-43.65888],[-71.87866,-43.56195],[-71.95542,-43.44292],[-71.91512,-43.319],[-71.80268,-43.29535],[-71.73869,-43.19234],[-71.94149,-43.11061],[-72.18001,-42.8948],[-72.18733,-42.66619],[-72.06314,-42.53751],[-72.0441,-42.41231],[-72.14365,-42.40333],[-72.20024,-42.17229],[-72.17802,-42.13207],[-72.06032,-42.10593],[-71.78041,-42.12128],[-71.83133,-41.78089],[-71.94135,-41.60926],[-71.9023,-41.06778],[-72.02097,-40.73647],[-71.91507,-40.61832],[-71.87117,-40.38959],[-71.76665,-40.35676],[-71.87961,-40.24227],[-71.8856,-40.10093],[-71.67779,-39.92156],[-71.74365,-39.86164],[-71.77001,-39.61946],[-71.68665,-39.50983],[-71.58545,-39.55159],[-71.45202,-39.31025],[-71.47673,-38.89162],[-71.25594,-38.74909],[-70.95844,-38.70272],[-70.89411,-38.57644],[-71.03346,-38.45451],[-71.08724,-38.09054],[-71.23505,-37.86541],[-71.26668,-37.68295],[-71.18031,-37.4828],[-71.27241,-37.28686],[-71.17697,-37.1077],[-71.27586,-36.9637],[-71.20495,-36.91075],[-71.2345,-36.83303],[-71.07654,-36.43571],[-70.96469,-36.43366],[-70.90086,-36.34336],[-70.77062,-36.35412],[-70.59553,-36.12118],[-70.44219,-36.14876],[-70.42788,-35.73781],[-70.50607,-35.38014],[-70.59764,-35.34459],[-70.63128,-35.23712],[-70.42629,-35.12462],[-70.32933,-34.83081],[-70.35687,-34.72532],[-70.07752,-34.38253],[-70.06901,-34.24694],[-69.87771,-34.20233],[-69.95948,-33.77235],[-69.83371,-33.34911],[-70.02502,-33.37388],[-70.14906,-33.04145],[-70.06223,-33.01233],[-70.00981,-32.90747],[-70.19517,-32.75732],[-70.19589,-32.50891],[-70.28486,-32.45564],[-70.44343,-32.05325],[-70.41077,-31.9809],[-70.29402,-31.95849],[-70.5117,-31.85844],[-70.62295,-31.59949],[-70.59941,-31.29869],[-70.5377,-31.08557],[-70.35748,-31.0002],[-70.20264,-30.32249],[-69.97775,-30.32288],[-69.847,-30.16294],[-70.01824,-30.10003],[-69.95038,-29.73744],[-70.03755,-29.35428],[-69.97565,-29.18743],[-69.85112,-29.06923],[-69.70118,-28.37779],[-69.20484,-27.90816],[-68.84844,-27.13115],[-68.76133,-27.08588],[-68.60693,-27.09636],[-68.3489,-26.92771],[-68.64137,-26.50722],[-68.60352,-26.25391],[-68.45177,-26.1377],[-68.63052,-25.43524],[-68.55582,-25.14476],[-68.44595,-25.0658],[-68.62011,-24.81717],[-68.55162,-24.58836],[-68.28078,-24.34935],[-67.32648,-24.02538],[-66.99882,-23.00044],[-67.18775,-22.81375],[-67.08088,-22.62433],[-67.03366,-22.53815],[-66.84345,-22.39746],[-66.73734,-22.22282],[-66.38248,-22.07602],[-66.28978,-21.76554],[-66.21845,-21.72575],[-65.89675,-21.88263],[-65.71368,-22.09054],[-65.61493,-22.09152],[-65.60973,-22.09505],[-65.60607,-22.09358],[-65.60256,-22.09658],[-65.60015,-22.09543],[-65.59229,-22.09511],[-65.59015,-22.09735],[-65.58691,-22.09645],[-65.58512,-22.08432],[-65.57523,-22.07312],[-65.47487,-22.08487],[-64.99026,-22.06739],[-64.59768,-22.19269],[-64.52643,-22.29504],[-64.33114,-22.68517],[-64.10381,-22.34114],[-64.10712,-22.32023],[-64.06522,-22.23093],[-64.04702,-22.23757],[-64.03654,-22.19469],[-64.0029,-22.10735],[-63.99022,-22.07925],[-63.97147,-22.07619],[-63.94118,-21.99823],[-63.70932,-21.99896],[-63.68839,-22.01037],[-63.68079,-22.03116],[-63.68507,-22.04019],[-63.68156,-22.05185],[-63.67659,-22.03287],[-63.67201,-22.02293],[-63.66821,-22.01634],[-63.67191,-22.01399],[-63.66566,-21.99839],[-62.79606,-21.98778],[-62.74618,-22.10033],[-62.18511,-22.50843],[-61.93761,-22.97376],[-61.45605,-23.36182],[-61.05842,-23.56621],[-60.95137,-23.75997],[-60.28746,-24.01906],[-60.03728,-24.00408],[-59.46607,-24.33428],[-59.12256,-24.59772],[-58.46645,-24.84584],[-58.332,-24.98132],[-58.2349,-24.91756],[-57.8565,-25.08005],[-57.76981,-25.15013],[-57.75374,-25.17277],[-57.71597,-25.26456],[-57.71837,-25.27146],[-57.71111,-25.27265],[-57.71008,-25.28146],[-57.70692,-25.2845],[-57.70438,-25.28159],[-57.70273,-25.28239],[-57.70175,-25.28459],[-57.69741,-25.28283],[-57.69281,-25.28588],[-57.69733,-25.29337],[-57.70246,-25.29847],[-57.69612,-25.30832],[-57.69763,-25.3199],[-57.69143,-25.32127],[-57.67993,-25.33318],[-57.64822,-25.3679],[-57.63902,-25.38287],[-57.61504,-25.38841],[-57.59954,-25.39704],[-57.57673,-25.42029],[-57.56698,-25.43147],[-57.55477,-25.43999],[-57.55285,-25.44705],[-57.55811,-25.45717],[-57.55763,-25.46897],[-57.56523,-25.48014],[-57.56806,-25.49501],[-57.57722,-25.50575],[-57.57566,-25.52264],[-57.5661,-25.54112],[-57.56809,-25.55797],[-57.58142,-25.57145],[-57.59952,-25.57438],[-57.60444,-25.59855],[-57.6122,-25.61963],[-57.6367,-25.61807],[-57.66569,-25.60273],[-57.67006,-25.65579],[-57.67513,-25.66052],[-57.68626,-25.66287],[-57.69808,-25.65933],[-57.71855,-25.64914],[-57.72537,-25.71924],[-57.77786,-25.77559],[-57.84986,-26.01142],[-58.08597,-26.14202],[-58.13896,-26.66834],[-58.28224,-26.80127],[-58.32056,-26.82169],[-58.3167,-26.86081],[-58.32384,-26.87074],[-58.56858,-27.20629],[-57.90834,-27.24265],[-56.99114,-27.41858],[-56.60886,-27.36586],[-56.40607,-27.52701],[-56.32355,-27.36897],[-56.09353,-27.25219],[-55.76168,-27.38106],[-55.65541,-27.30153],[-55.67524,-27.17004],[-55.59643,-27.06538],[-55.40826,-26.91763],[-55.20788,-26.89214],[-54.97304,-26.63717],[-54.8532,-26.59894],[-54.72264,-26.31238],[-54.73235,-25.98554],[-54.65309,-25.84138],[-54.71357,-25.66721],[-54.62995,-25.55106],[-54.44288,-25.5795],[-54.11451,-25.4396],[-53.80059,-25.65093],[-53.766,-25.94301],[-53.59024,-26.19274],[-53.67264,-26.61495],[-53.61669,-26.95395],[-53.76351,-27.18917],[-54.15393,-27.36033],[-54.26461,-27.49923],[-54.79439,-27.6397],[-55.0044,-27.90341],[-55.19076,-27.92946],[-55.41589,-28.14304],[-55.66542,-28.26547],[-55.61633,-28.32205],[-55.65957,-28.46539],[-55.83413,-28.42136],[-55.87339,-28.49468],[-56.13558,-28.7265],[-56.37343,-29.10817],[-56.569,-29.13892],[-56.76306,-29.48638],[-57.05958,-29.72263],[-57.24463,-29.86452],[-57.3045,-30.03966],[-57.61942,-30.20517],[-57.60863,-30.32424],[-57.82983,-30.53118],[-57.75241,-30.68756],[-57.75273,-30.91942],[-57.93419,-31.27388],[-57.99,-31.36053],[-57.98302,-31.3734],[-57.97736,-31.38022],[-57.97778,-31.38599],[-57.98203,-31.39213],[-58.00944,-31.41341],[-58.06637,-31.47395],[-57.92613,-31.57745],[-57.98622,-31.77449],[-58.12179,-31.89772],[-58.11905,-32.14059],[-58.04227,-32.29153],[-58.14327,-32.45845],[-58.0758,-33.00587],[-58.18964,-33.09402],[-58.2723,-33.1061],[-58.31012,-33.1048],[-58.35418,-33.1221],[-58.37567,-33.17644],[-58.44465,-33.5853],[-58.43016,-33.71813],[-58.42434,-33.86887],[-58.41858,-33.91742],[-58.33697,-34.00477],[-58.241,-34.16246],[-57.84696,-34.50017],[-55.5438,-35.77219]]],terms_url:"http://www.ign.gob.ar/",terms_text:"Instituto Geográfico Nacional de la República Argentina",icon:"http://www.ign.gob.ar/sites/default/files/favicon.png"},{id:"Haiti-Drone",name:"Imagerie Drone (Haiti)",type:"tms",template:"http://wms.openstreetmap.fr/tms/1.0.0/iomhaiti/{zoom}/{x}/{y}",zoomExtent:[0,21],polygon:[[[-72.15474,19.6879],[-72.15458,19.6878],[-72.15485,19.68776],[-72.15472,19.68685],[-72.15431,19.68707],[-72.15463,19.68544],[-72.15301,19.68499],[-72.15086,19.68435],[-72.15045,19.68479],[-72.15078,19.68315],[-72.15223,19.6833],[-72.15282,19.68066],[-72.15186,19.68051],[-72.15191,19.68034],[-72.15227,19.68035],[-72.15238,19.67972],[-72.15328,19.67965],[-72.15333,19.67698],[-72.15308,19.67694],[-72.15348,19.67638],[-72.14878,19.67107],[-72.13664,19.67081],[-72.13557,19.67408],[-72.13573,19.68351],[-72.13679,19.68407],[-72.13695,19.68559],[-72.13778,19.685],[-72.13782,19.68727],[-72.13888,19.68767],[-72.13881,19.69013],[-72.13853,19.68949],[-72.13806,19.68964],[-72.13869,19.69232],[-72.13825,19.69276],[-72.13948,19.69737],[-72.14101,19.7],[-72.1437,19.70112],[-72.14851,19.70015],[-72.14772,19.70268],[-72.14874,19.7029],[-72.1616,19.70357],[-72.16578,19.698],[-72.165,19.69324],[-72.16223,19.68901],[-72.15474,19.6879]],[[-72.13106,19.67189],[-72.12598,19.67728],[-72.12554,19.67762],[-72.12169,19.67764],[-72.11497,19.6726],[-72.11527,19.66872],[-72.11982,19.66275],[-72.12278,19.66257],[-72.1249,19.6627],[-72.12858,19.66454],[-72.13081,19.66617],[-72.13167,19.66879],[-72.13156,19.671],[-72.13106,19.67189]],[[-71.84579,19.67098],[-71.84294,19.67595],[-71.841,19.67595],[-71.83802,19.67553],[-71.83787,19.6745],[-71.83905,19.67439],[-71.83901,19.67411],[-71.83984,19.67395],[-71.83891,19.67361],[-71.83802,19.67209],[-71.83801,19.67263],[-71.83767,19.67272],[-71.83763,19.67254],[-71.83544,19.67321],[-71.83533,19.673],[-71.83312,19.67346],[-71.83267,19.67168],[-71.83216,19.67209],[-71.83072,19.66949],[-71.8306,19.66976],[-71.83022,19.66989],[-71.82918,19.66721],[-71.82907,19.66721],[-71.82891,19.66679],[-71.82895,19.66662],[-71.82883,19.66635],[-71.82856,19.66648],[-71.82887,19.66725],[-71.82876,19.66741],[-71.8278,19.66782],[-71.82771,19.66786],[-71.82783,19.66796],[-71.82718,19.66812],[-71.82718,19.66809],[-71.82644,19.66839],[-71.82641,19.66832],[-71.8262,19.66843],[-71.82618,19.66836],[-71.82589,19.66842],[-71.82589,19.66866],[-71.82516,19.66875],[-71.82545,19.66916],[-71.82293,19.66957],[-71.82271,19.66967],[-71.82277,19.66976],[-71.82018,19.67099],[-71.81985,19.67045],[-71.8198,19.6706],[-71.81947,19.67076],[-71.81825,19.67134],[-71.81814,19.67114],[-71.81758,19.67143],[-71.81696,19.67077],[-71.81764,19.6719],[-71.81714,19.67204],[-71.81582,19.6718],[-71.81384,19.67119],[-71.81233,19.6707],[-71.81218,19.67043],[-71.81243,19.67015],[-71.81192,19.67001],[-71.81188,19.67058],[-71.81117,19.67035],[-71.80959,19.66985],[-71.8078,19.66928],[-71.8056,19.66861],[-71.80514,19.66689],[-71.80512,19.66523],[-71.80523,19.66198],[-71.80656,19.65239],[-71.80734,19.64829],[-71.80997,19.64683],[-71.81475,19.64545],[-71.81477,19.64556],[-71.815,19.64551],[-71.81495,19.64538],[-71.81599,19.64502],[-71.81589,19.64489],[-71.81659,19.64461],[-71.81901,19.6438],[-71.82115,19.64345],[-71.82216,19.64333],[-71.8269,19.64321],[-71.82805,19.64322],[-71.83045,19.64408],[-71.83064,19.64486],[-71.82953,19.64504],[-71.82961,19.64561],[-71.82994,19.64557],[-71.83037,19.64517],[-71.83047,19.64535],[-71.83081,19.6452],[-71.83102,19.64511],[-71.83125,19.64585],[-71.83111,19.64582],[-71.83137,19.64659],[-71.83289,19.64619],[-71.83446,19.64571],[-71.83447,19.64631],[-71.83422,19.64619],[-71.8342,19.64655],[-71.83467,19.6463],[-71.83491,19.64639],[-71.8348,19.64622],[-71.83544,19.64585],[-71.8355,19.6458],[-71.83647,19.64613],[-71.83764,19.64727],[-71.83791,19.64789],[-71.83905,19.6508],[-71.84569,19.66962],[-71.84579,19.67098]],[[-72.09888,18.54843],[-72.09907,18.54838],[-72.09991,18.54809],[-72.10234,18.54813],[-72.10252,18.54814],[-72.10229,18.54826],[-72.10229,18.54828],[-72.10256,18.54815],[-72.10272,18.54814],[-72.10343,18.54871],[-72.10354,18.5489],[-72.10352,18.54974],[-72.10349,18.54974],[-72.10351,18.55003],[-72.10285,18.55018],[-72.1029,18.55025],[-72.10287,18.55031],[-72.10352,18.55024],[-72.1035,18.55152],[-72.10338,18.55152],[-72.10308,18.55161],[-72.10348,18.55162],[-72.10342,18.55435],[-72.10243,18.5555],[-72.10149,18.55562],[-72.10062,18.55559],[-72.0979,18.55521],[-72.09688,18.55466],[-72.09652,18.55421],[-72.09661,18.55417],[-72.09651,18.55417],[-72.09654,18.55398],[-72.09644,18.55355],[-72.09628,18.55357],[-72.09621,18.5532],[-72.09599,18.55337],[-72.09564,18.55267],[-72.09556,18.55185],[-72.09685,18.55035],[-72.09729,18.55032],[-72.09699,18.5502],[-72.09888,18.54843]],[[-72.25425,18.56826],[-72.25603,18.57178],[-72.25579,18.5748],[-72.2535,18.57555],[-72.25228,18.57555],[-72.24999,18.57409],[-72.24739,18.56983],[-72.24601,18.56673],[-72.24585,18.56295],[-72.24794,18.56254],[-72.25015,18.5628],[-72.25192,18.56508],[-72.25425,18.56826]],[[-72.30315,18.53327],[-72.30313,18.53318],[-72.30483,18.53111],[-72.30974,18.53111],[-72.31643,18.53243],[-72.32341,18.53661],[-72.32614,18.53878],[-72.32619,18.54264],[-72.31705,18.55406],[-72.31309,18.55406],[-72.29875,18.54533],[-72.29886,18.54073],[-72.2963,18.54047],[-72.29546,18.53952],[-72.29619,18.53386],[-72.29719,18.53322],[-72.3007,18.53328],[-72.30227,18.53423],[-72.30285,18.53352],[-72.3031,18.53334],[-72.30318,18.5334],[-72.30358,18.53356],[-72.30308,18.53465],[-72.30371,18.53399],[-72.30453,18.53441],[-72.3044,18.53451],[-72.30627,18.53526],[-72.30631,18.53527],[-72.30612,18.53576],[-72.30612,18.53582],[-72.30637,18.53589],[-72.30627,18.53549],[-72.30667,18.53509],[-72.3062,18.53497],[-72.30589,18.53494],[-72.30554,18.53468],[-72.30549,18.53461],[-72.30556,18.53451],[-72.30467,18.53423],[-72.30476,18.53388],[-72.30433,18.53375],[-72.30426,18.53363],[-72.30315,18.53327]],[[-72.29814,18.4775],[-72.29357,18.49486],[-72.29222,18.49643],[-72.29317,18.49725],[-72.28923,18.50571],[-72.28781,18.5081],[-72.28505,18.51199],[-72.28402,18.51132],[-72.28086,18.51588],[-72.27732,18.5176],[-72.27235,18.51752],[-72.26627,18.51446],[-72.26659,18.50668],[-72.26926,18.50462],[-72.2662,18.50298],[-72.26882,18.49652],[-72.26915,18.49594],[-72.27027,18.49615],[-72.27027,18.4956],[-72.26907,18.49557],[-72.26929,18.49377],[-72.2737,18.486],[-72.27467,18.48504],[-72.27518,18.4834],[-72.27654,18.48134],[-72.27735,18.4815],[-72.2783,18.48097],[-72.27785,18.4807],[-72.2771,18.48012],[-72.279,18.47758],[-72.27972,18.47729],[-72.28064,18.47764],[-72.28137,18.47716],[-72.28084,18.47698],[-72.28128,18.47584],[-72.28232,18.47518],[-72.28516,18.4751],[-72.28499,18.47637],[-72.28544,18.47698],[-72.28628,18.47563],[-72.28693,18.47547],[-72.2866,18.47519],[-72.2866,18.475],[-72.29098,18.47473],[-72.29466,18.47494],[-72.29739,18.47684],[-72.29814,18.4775]],[[-72.34667,18.52224],[-72.34683,18.52443],[-72.34753,18.52776],[-72.34555,18.52911],[-72.34031,18.52922],[-72.33833,18.52803],[-72.3369,18.53012],[-72.33381,18.52967],[-72.32893,18.52708],[-72.32865,18.52533],[-72.32921,18.52327],[-72.33041,18.52205],[-72.33216,18.52218],[-72.33225,18.5192],[-72.33692,18.51836],[-72.3382,18.51847],[-72.33815,18.51818],[-72.3412,18.51779],[-72.34549,18.5172],[-72.34926,18.51728],[-72.35043,18.51889],[-72.35035,18.52061],[-72.34968,18.52204],[-72.34667,18.52224]],[[-72.33031,18.54865],[-72.34297,18.55081],[-72.34332,18.55306],[-72.34131,18.56143],[-72.33906,18.56136],[-72.33847,18.56383],[-72.33753,18.56543],[-72.33484,18.56506],[-72.33118,18.56383],[-72.33121,18.56162],[-72.32321,18.56069],[-72.32124,18.5596],[-72.3208,18.5587],[-72.32088,18.55788],[-72.32595,18.55803],[-72.32662,18.5582],[-72.32592,18.55775],[-72.3251,18.55738],[-72.32338,18.55226],[-72.3246,18.54785],[-72.3289,18.54837],[-72.32998,18.54895],[-72.33031,18.54865]],[[-72.32314,18.52698],[-72.32234,18.52807],[-72.32096,18.52797],[-72.32078,18.52713],[-72.32085,18.52537],[-72.32146,18.52496],[-72.32257,18.52489],[-72.32285,18.52533],[-72.32324,18.52648],[-72.32314,18.52698]],[[-72.21608,18.64578],[-72.21596,18.65538],[-72.20303,18.65583],[-72.19471,18.65534],[-72.19222,18.65456],[-72.19206,18.65213],[-72.19348,18.64776],[-72.20125,18.63852],[-72.20693,18.63882],[-72.2121,18.64241],[-72.21181,18.64306],[-72.21217,18.64269],[-72.2128,18.64276],[-72.21347,18.64313],[-72.21356,18.64375],[-72.21542,18.64439],[-72.21589,18.64503],[-72.21608,18.64578]],[[-72.28677,18.6482],[-72.2901,18.65274],[-72.28981,18.65365],[-72.29007,18.65427],[-72.29072,18.65377],[-72.29103,18.65447],[-72.29125,18.65422],[-72.29168,18.65589],[-72.29122,18.65661],[-72.29227,18.65597],[-72.29269,18.65675],[-72.29307,18.65673],[-72.29413,18.65818],[-72.29602,18.66084],[-72.29597,18.66191],[-72.29329,18.66457],[-72.29067,18.666],[-72.28959,18.66613],[-72.28959,18.66657],[-72.2877,18.66647],[-72.28758,18.66766],[-72.28312,18.66972],[-72.27965,18.66965],[-72.27843,18.66908],[-72.2784,18.66877],[-72.27774,18.66917],[-72.27744,18.66914],[-72.27701,18.66832],[-72.27656,18.66811],[-72.27654,18.66806],[-72.27523,18.66852],[-72.27493,18.66746],[-72.27464,18.66743],[-72.27347,18.66821],[-72.27323,18.66827],[-72.27268,18.66716],[-72.27191,18.66743],[-72.27188,18.66734],[-72.26881,18.66819],[-72.26883,18.66718],[-72.26908,18.66682],[-72.26881,18.66679],[-72.26811,18.66707],[-72.26763,18.66738],[-72.26756,18.66669],[-72.26686,18.66695],[-72.26559,18.66736],[-72.26545,18.66701],[-72.26475,18.66741],[-72.26299,18.66819],[-72.26285,18.66818],[-72.26265,18.66761],[-72.2623,18.66771],[-72.26248,18.66792],[-72.26248,18.66823],[-72.26231,18.66826],[-72.2621,18.66797],[-72.26228,18.66892],[-72.26015,18.6689],[-72.25427,18.66879],[-72.25054,18.66835],[-72.25044,18.66954],[-72.24779,18.66989],[-72.24152,18.66979],[-72.24142,18.67419],[-72.23892,18.67398],[-72.23872,18.67346],[-72.23837,18.67331],[-72.2387,18.67395],[-72.23755,18.6739],[-72.23742,18.67351],[-72.23774,18.67334],[-72.23751,18.67326],[-72.23684,18.67349],[-72.23644,18.67241],[-72.23551,18.6726],[-72.2354,18.67242],[-72.2353,18.6729],[-72.23455,18.67269],[-72.23431,18.67246],[-72.23424,18.67347],[-72.23341,18.67346],[-72.23329,18.6733],[-72.23274,18.67329],[-72.23271,18.6735],[-72.2277,18.67253],[-72.22653,18.67165],[-72.2268,18.67157],[-72.2275,18.67159],[-72.22749,18.67145],[-72.22729,18.67146],[-72.22728,18.6713],[-72.22721,18.67136],[-72.22618,18.67137],[-72.2256,18.67088],[-72.22551,18.66945],[-72.22611,18.66969],[-72.22618,18.66959],[-72.22598,18.66955],[-72.22578,18.66914],[-72.22533,18.66946],[-72.22497,18.66947],[-72.22458,18.66788],[-72.22355,18.6677],[-72.22359,18.66759],[-72.22246,18.66763],[-72.22237,18.66702],[-72.22233,18.66709],[-72.22192,18.66703],[-72.22081,18.6669],[-72.22081,18.66653],[-72.22087,18.66636],[-72.2206,18.66681],[-72.22039,18.66664],[-72.21843,18.66505],[-72.21829,18.6641],[-72.21835,18.66084],[-72.21872,18.66065],[-72.21869,18.6606],[-72.21873,18.66045],[-72.21898,18.66032],[-72.21878,18.6602],[-72.2187,18.66024],[-72.21858,18.66004],[-72.21861,18.66],[-72.21878,18.66013],[-72.219,18.66002],[-72.21891,18.65991],[-72.21897,18.65979],[-72.21838,18.65958],[-72.21847,18.65397],[-72.2201,18.65116],[-72.2258,18.64695],[-72.2283,18.64573],[-72.23793,18.64586],[-72.23776,18.6447],[-72.24004,18.64325],[-72.2456,18.64335],[-72.24827,18.64504],[-72.24875,18.64367],[-72.25111,18.64298],[-72.25124,18.64334],[-72.25126,18.64316],[-72.25148,18.64314],[-72.25133,18.64297],[-72.25336,18.64235],[-72.25352,18.64268],[-72.25395,18.64254],[-72.25415,18.64293],[-72.25439,18.64287],[-72.25438,18.64275],[-72.25642,18.64232],[-72.25669,18.64314],[-72.25688,18.64286],[-72.25682,18.64253],[-72.25884,18.6421],[-72.25889,18.64225],[-72.25926,18.64223],[-72.25965,18.64241],[-72.25922,18.64069],[-72.25995,18.64048],[-72.26012,18.64063],[-72.26012,18.63994],[-72.26153,18.63947],[-72.26261,18.6391],[-72.26545,18.63873],[-72.27194,18.63868],[-72.2722,18.63886],[-72.27303,18.63942],[-72.27317,18.64126],[-72.27387,18.64103],[-72.27422,18.64161],[-72.27522,18.6417],[-72.27545,18.64157],[-72.27555,18.64169],[-72.27554,18.64175],[-72.27647,18.64186],[-72.27675,18.6419],[-72.2763,18.6426],[-72.27742,18.643],[-72.27798,18.64272],[-72.27858,18.64313],[-72.27857,18.64323],[-72.2789,18.64335],[-72.27985,18.64397],[-72.28587,18.64697],[-72.28677,18.6482]],[[-72.55572,18.53059],[-72.55559,18.5367],[-72.555,18.53797],[-72.5488,18.53792],[-72.54866,18.53728],[-72.54884,18.53063],[-72.54937,18.5301],[-72.55513,18.53012],[-72.55572,18.53059]],[[-72.62353,18.50799],[-72.62344,18.50952],[-72.62261,18.51043],[-72.62049,18.51185],[-72.61834,18.51075],[-72.61622,18.50832],[-72.61626,18.50647],[-72.61866,18.50444],[-72.6204,18.5045],[-72.62283,18.507],[-72.62353,18.50799]]]},{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",zoomExtent:[0,14],polygon:[[[79.01779,8.82757],[79.01402,9.64678],[80.17642,9.65042],[80.17728,8.8313],[79.01779,8.82757]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,12],polygon:[[[-152.70873,62.30357],[-152.70839,62.58153],[-152.00835,63.54646],[-148.99432,63.5333],[-148.99432,62.30357],[-152.70873,62.30357]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[114.36,2.02846],[113.53448,2.03],[113.53619,3.07077],[114.76512,3.06751],[114.76254,2.08816],[114.36,2.02846]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[104.00155,-0.00008],[104.00137,1.45099],[104.91015,1.45116],[104.91015,-0.00008],[104.00155,-0.00008]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing Islands in OSM (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[3.24653,-54.47047],[3.24653,-54.37539],[3.46385,-54.37539],[3.46385,-54.47047],[3.24653,-54.47047]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[10.55906,45.95485],[7.47396,45.95533],[7.55585,46.2708],[8.0547,47.66469],[11.75245,47.66481],[11.75245,46.81334],[11.38424,45.95509],[10.55906,45.95485]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[-34.17701,-55.29693],[-35.19599,-55.28285],[-35.16664,-54.72097],[-34.12517,-54.73465],[-34.1401,-55.29693],[-34.17701,-55.29693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[-72.75945,-15.68684],[-72.75945,-15.4957],[-72.74434,-15.4263],[-72.41286,-15.4263],[-72.41286,-15.65296],[-72.42411,-15.68667],[-72.75945,-15.68684]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[1.83975,6.2578],[1.83975,7.11427],[2.5494,7.11427],[2.5494,6.48905],[2.49781,6.25806],[1.83975,6.2578]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[-92.05216,1.3213],[-92.05216,1.72181],[-91.74849,1.72181],[-91.74849,1.3213],[-92.05216,1.3213]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,11],polygon:[[[-84.34799,74.38946],[-84.34799,75.8903],[-79.14871,75.8903],[-79.14871,74.38946],[-84.34799,74.38946]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastline mostly mapped meanwhile (false color IR)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,12],polygon:[[[-13.04701,64.21109],[-15.16496,64.22408],[-15.16805,64.81573],[-13.04357,64.8036],[-13.04701,64.21109]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing islets and inaccurate coast (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[-78.532,-1.80509],[-78.532,-1.60811],[-78.33562,-1.60811],[-78.33562,-1.80509],[-78.532,-1.80509]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[-56.13476,-61.63472],[-56.13476,-61.19936],[-55.83264,-60.84015],[-53.72343,-60.83982],[-53.72343,-61.63472],[-56.13476,-61.63472]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[-24.75878,14.74814],[-24.75878,15.09249],[-24.26706,15.09249],[-24.26706,14.74814],[-24.75878,14.74814]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[73.06897,-53.27059],[73.06897,-52.87549],[73.67338,-52.87673],[74.08863,-52.9495],[74.08863,-53.27059],[73.06897,-53.27059]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,12],polygon:[[[-69.8568,-55.55949],[-72.26521,-55.14943],[-72.26521,-54.51089],[-72.08531,-54.17909],[-69.49116,-54.17889],[-69.4915,-55.28379],[-69.62231,-55.5591],[-69.8568,-55.55949]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[35.93259,44.96237],[35.93259,45.55926],[37.36991,45.55926],[37.36991,44.96237],[35.93259,44.96237]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2A_R021_N44_20180429T082601",name:"imagico.de: Kerch Strait 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2A_R021_N44_20180429T082601&z={zoom}&x={x}&y={-y}",endDate:"2018-04-29T00:00:00.000Z",startDate:"2018-04-29T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[35.8787,45.0348],[35.8787,45.6095],[36.9208,45.6095],[36.9208,45.0348],[35.8787,45.0348]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Bridge and surrounding after completion in April 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,10],polygon:[[[-79.05175,81.91484],[-79.05175,83.43339],[-73.6039,83.80225],[-26.42449,83.80225],[-21.493,83.50352],[-16.88835,83.15095],[-16.88835,81.91484],[-79.05175,81.91484]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[-28.21075,-56.72108],[-28.21075,-56.62498],[-27.96956,-56.62498],[-27.96956,-56.72108],[-28.21075,-56.72108]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[-27.99293,-56.73479],[-28.22776,-56.73262],[-28.22416,-56.60075],[-27.96975,-56.60283],[-27.97319,-56.73479],[-27.99293,-56.73479]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-S2B_R005_S69_20180222T061749",name:"imagico.de: Lützow-Holm Bay",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=S2B_R005_S69_20180222T061749&z={zoom}&x={x}&y={-y}",endDate:"2018-02-22T00:00:00.000Z",startDate:"2018-02-22T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[35.124,-70.3693],[35.1241,-69.2795],[36.3864,-68.4765],[42.2208,-68.4762],[42.2208,-70.3651],[35.124,-70.3693]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Up-to-date late season image or an area poorly mapped in OSM at the moment - lots of sea ice, be careful with distinguishing sea ice from ice shelves and floating glacier tongues. (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,10],polygon:[[[-85.76109,81.39333],[-89.83016,82.14952],[-89.83153,82.24405],[-84.99342,82.73099],[-79.95207,83.13108],[-74.55641,83.46267],[-69.35851,83.70451],[-28.20784,83.70451],[-23.06624,83.46532],[-17.96584,83.15518],[-17.96721,82.72386],[-22.78197,81.4419],[-85.76109,81.39333]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[37.20666,-0.26685],[37.20666,-0.01193],[37.56552,-0.01193],[37.56552,-0.26685],[37.20666,-0.26685]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[37.24769,-3.22921],[37.24769,-2.96816],[37.61581,-2.96816],[37.61581,-3.22921],[37.24769,-3.22921]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[150.38853,-2.80053],[150.38853,-2.3834],[150.83348,-2.3834],[150.83348,-2.80053],[150.38853,-2.80053]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-northsea_s2_2018",name:"imagico.de: North Sea Coast spring 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=northsea_s2_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-08T00:00:00.000Z",startDate:"2018-05-08T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[5.3179,53.0918],[5.322,53.4418],[6.7023,56.3572],[9.8813,56.3578],[9.8813,53.2819],[9.7758,53.0921],[5.3179,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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{id:"osmim-imagicode-caspian_2018",name:"imagico.de: Northeast Caspian Sea 2018",type:"tms",template:"http://imagico.de/map/osmim_tiles.php?layer=caspian_2018&z={zoom}&x={x}&y={-y}",endDate:"2018-05-16T00:00:00.000Z",startDate:"2018-05-16T00:00:00.000Z",zoomExtent:[0,14],polygon:[[[51.0243,45.0729],[51.0243,46.569],[52.4259,46.5687],[53.6471,46.3177],[53.6474,45.0729],[51.0243,45.0729]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Coastal contruction and Kashagan oil field in Kazakhstan in May 2018 (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[59.19898,64.89205],[59.19898,66.91656],[60.73329,68.44289],[67.73295,68.44327],[67.73295,67.74883],[64.21647,64.91957],[59.19898,64.89205]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,10],polygon:[[[-81.62923,82.4597],[-83.03136,82.47986],[-83.03136,83.05876],[-72.80309,83.09567],[-65.65786,83.03232],[-65.81167,82.4597],[-81.62923,82.4597]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,10],polygon:[[[-78.89729,82.17577],[-82.64501,82.19426],[-82.64501,83.08067],[-66.58986,83.08497],[-63.78011,82.98908],[-63.78011,82.72198],[-65.0092,82.17577],[-78.89729,82.17577]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.6677],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,12],polygon:[[[7.63568,53.28027],[7.63568,53.66811],[8.49433,55.50246],[9.20775,55.48106],[9.20775,53.28027],[7.63568,53.28027]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,10],polygon:[[[-52.49222,82.48972],[-52.49222,82.94295],[-49.28696,83.47312],[-44.5285,83.73214],[-29.5253,83.73214],[-25.26398,83.58271],[-21.18393,83.39776],[-21.18393,82.74312],[-23.40454,82.48972],[-52.49222,82.48972]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[73.2279,-53.20333],[73.2279,-53.01073],[73.25949,-52.94944],[73.78992,-52.94944],[73.78992,-53.06048],[73.71783,-53.20333],[73.2279,-53.20333]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[-80.01654,8.84898],[-80.01654,9.41481],[-79.46859,9.41481],[-79.46859,8.84898],[-80.01654,8.84898]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[-79.62539,8.77083],[-79.68684,8.82197],[-79.68667,8.93705],[-79.65363,9.09294],[-79.26816,9.09294],[-79.32833,8.77083],[-79.62539,8.77083]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,10],polygon:[[[-53.20922,-84.12525],[-60.61538,-83.78609],[-60.61538,-82.29969],[-48.72405,-82.29987],[-44.52178,-82.43683],[-44.51354,-84.12525],[-53.20922,-84.12525]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[19.11233,42.15316],[19.08426,43.08074],[20.63299,43.09603],[20.63788,42.16779],[19.11233,42.15316]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,15],polygon:[[[-51.23857,68.79972],[-51.24334,68.85303],[-51.15167,68.85303],[-51.14038,68.80116],[-51.23857,68.79972]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,12],polygon:[[[67.9684,22.36265],[67.86231,22.38392],[67.86231,24.88693],[71.48986,24.88693],[71.48986,22.36265],[67.9684,22.36265]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[23.80811,41.58488],[22.99238,41.60195],[23.01186,42.29984],[23.99402,42.28339],[23.96561,41.58488],[23.80811,41.58488]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[29.7663,0.20689],[29.7663,0.50918],[30.0346,0.50918],[30.0346,0.20689],[29.7663,0.20689]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[29.80514,0.23586],[29.80514,0.46709],[30.02503,0.46709],[30.02503,0.23586],[29.80514,0.23586]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[-180,-67.42635],[-180,-67.32544],[-179.82473,-67.32538],[-179.82473,-67.42635],[-180,-67.42635]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[-42.12875,-53.7205],[-42.14626,-53.45782],[-41.67573,-53.44586],[-41.65582,-53.70872],[-42.12875,-53.7205]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Missing in other image sources (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[120.84382,-3.59545],[120.84382,-3.15985],[120.98184,-2.51468],[122.62618,-2.51468],[122.62618,-3.00215],[122.5007,-3.59545],[120.84382,-3.59545]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,10],polygon:[[[156.96951,-84.50098],[154.50858,-84.46255],[154.50858,-82.60681],[175.46774,-82.58505],[177.00583,-83.52807],[177.00583,-84.19262],[171.93839,-84.34633],[166.83798,-84.4437],[161.67029,-84.50045],[156.96951,-84.50098]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,15],polygon:[[[-68.93977,76.51133],[-68.93977,76.5499],[-68.76635,76.55176],[-68.50993,76.55176],[-68.50744,76.51612],[-68.67897,76.51194],[-68.93977,76.51133]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Icebridge DMS image - alignment might be poor",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,17],polygon:[[[-68.74292,76.52636],[-68.74446,76.5284],[-68.74807,76.54939],[-68.74615,76.56017],[-68.72276,76.56022],[-68.72017,76.55775],[-68.71853,76.52921],[-68.71978,76.52637],[-68.74292,76.52636]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,16],polygon:[[[-68.81924,76.5251],[-68.82651,76.54177],[-68.77345,76.5439],[-68.7021,76.54545],[-68.59177,76.5456],[-68.59183,76.52793],[-68.6597,76.5251],[-68.81924,76.5251]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,16],polygon:[[[-68.77771,76.50688],[-68.77662,76.57064],[-68.68115,76.57065],[-68.6763,76.55384],[-68.6762,76.53074],[-68.68523,76.50688],[-68.77771,76.50688]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,12],polygon:[[[78.45886,80.72643],[78.45886,80.9099],[80.48892,80.9099],[80.48892,80.72643],[78.45886,80.72643]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[153.06138,-11.78923],[153.06138,-11.28869],[153.10927,-11.07229],[154.41201,-11.07229],[154.41201,-11.78923],[153.06138,-11.78923]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[-72.86696,-41.51741],[-72.86696,-41.04527],[-72.23181,-41.04527],[-71.8751,-41.10829],[-72.00007,-41.51741],[-72.86696,-41.51741]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[126.36143,51.37553],[126.34804,52.33932],[128.60762,52.3409],[128.61174,51.37553],[126.36143,51.37553]]],terms_url:"http://maps.imagico.de/#osmim",terms_text:"imagico.de OSM images for mapping",description:"Recent image showing newest features (true color)",icon:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,13],polygon:[[[75.98364,34.97851],[73.96164,35.36957],[74.44281,37.09391],[76.50601,36.70267],[75.98364,34.97851]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[0,14],polygon:[[[-71.18071,-14.49785],[-71.17976,-13.71029],[-70.55637,-13.71263],[-70.55637,-14.49785],[-71.18071,-14.49785]]],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:"https://osmlab.github.io/editor-layer-index/sources/misc/osmim-imagicode-LC81800982013291LGN00.png"},{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",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{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",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"GSGS3906",name:"Ireland British War Office 1:25k GSGS 3906",type:"tms",template:"https://mapwarper.net/layers/tile/101/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[-9.31139,51.43828],[-7.36131,51.99302],[-7.33934,52.13149],[-6.9658,52.06231],[-6.23796,52.1534],[-6.21049,52.52928],[-5.98253,52.80079],[-5.96056,53.67037],[-6.20775,53.67851],[-6.22423,53.95255],[-5.86442,54.12513],[-5.85893,54.20392],[-5.53483,54.23122],[-5.39476,54.44739],[-5.50188,54.70052],[-6.21873,55.38194],[-6.86418,55.2162],[-7.25145,55.46455],[-7.53435,55.30853],[-8.25395,55.26787],[-8.61101,54.97259],[-8.49016,54.89369],[-8.83897,54.68306],[-8.42699,54.52397],[-8.75108,54.31302],[-9.29765,54.38985],[-10.05296,54.37866],[-10.30015,54.05747],[-10.02275,53.79386],[-10.30565,53.55142],[-9.99803,53.24354],[-9.09166,53.19256],[-9.81676,53.1102],[-9.48167,52.96984],[-9.70415,52.68107],[-10.00627,52.63608],[-9.78929,52.52426],[-9.99803,52.32663],[-10.64348,52.1753],[-10.39629,51.9761],[-10.16832,51.64668],[-10.28642,51.57334],[-9.88542,51.57163],[-9.79204,51.44684],[-9.31139,51.43828]]],terms_url:"https://wiki.openstreetmap.org/wiki/Ireland/Background_Imagery#Trinity_College_Dublin",terms_text:"Glucksman Map Library, Trinity College Dublin",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ie/IrelandBritishWarOffice-GSGS3906.png"},{id:"Israel_Hiking",name:"Israel Hiking",type:"tms",template:"https://israelhiking.osm.org.il/Tiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel Hiking map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{id:"Israel_MTB",name:"Israel MTB",type:"tms",template:"https://israelhiking.osm.org.il/MTBTiles/{zoom}/{x}/{y}.png",zoomExtent:[7,16],polygon:[[[34.64563,32.92073],[34.98374,33.13352],[35.15662,33.09994],[35.31781,33.11463],[35.36541,33.06285],[35.46229,33.09994],[35.51741,33.12652],[35.5266,33.21531],[35.53893,33.25442],[35.56446,33.2969],[35.61264,33.27918],[35.67429,33.30627],[35.70785,33.34269],[35.75363,33.35091],[35.81509,33.3392],[35.91531,32.9406],[35.80834,32.772],[35.77835,32.72446],[35.59491,32.62828],[35.5729,32.36541],[35.59461,32.21856],[35.55452,32.02901],[35.57225,31.75415],[35.48771,31.41951],[35.4209,31.25116],[35.47936,31.1783],[35.42771,30.95172],[35.3321,30.77107],[35.20709,30.53307],[35.17202,30.11204],[35.07514,29.83713],[35.02336,29.64569],[34.93992,29.39946],[34.89517,29.37711],[34.84785,29.59084],[34.69667,30.10714],[34.52423,30.40912],[34.48879,30.64515],[34.07929,31.52265],[34.64563,32.92073]]],terms_url:"https://israelhiking.osm.org.il/",terms_text:"Tiles © IsraelHiking, CC BY-SA-NC 3.0. Data by OpenStreetMap under ODbL.",description:"Israel MTB map",icon:"https://israelhiking.osm.org.il/content/favicons/favicon.ico"},{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.9358,41.43834],[-1.89601,41.43869],[-1.89536,41.39687],[-1.9767,41.39616],[-1.97639,41.37623],[-2.06201,41.37548],[-2.06262,41.41471],[-2.10458,41.41434],[-2.10363,41.35367],[-2.14448,41.35331],[-2.1419,41.18683],[-2.06204,41.18753],[-2.06171,41.16624],[-2.02046,41.16661],[-2.01887,41.06334],[-2.10083,41.06262],[-2.10114,41.08296],[-2.22733,41.08185],[-2.22704,41.0635],[-2.26912,41.06313],[-2.2688,41.04257],[-2.35325,41.04182],[-2.35356,41.06148],[-2.39487,41.06112],[-2.39457,41.04206],[-2.43722,41.04168],[-2.43756,41.06315],[-2.47928,41.06278],[-2.47991,41.10369],[-2.52078,41.10333],[-2.5211,41.12429],[-2.60415,41.12357],[-2.60481,41.16628],[-2.6471,41.16591],[-2.64808,41.22931],[-2.72874,41.2286],[-2.72907,41.24974],[-2.89552,41.24828],[-2.89649,41.31063],[-2.9363,41.31028],[-2.93571,41.27231],[-3.14692,41.27046],[-3.14723,41.29045],[-3.22828,41.28974],[-3.22767,41.25008],[-3.39581,41.2486],[-3.39518,41.20808],[-3.43492,41.20773],[-3.43429,41.16696],[-3.47877,41.16657],[-3.47844,41.14556],[-3.60336,41.14446],[-3.6027,41.10169],[-3.64539,41.10131],[-3.64508,41.08159],[-3.68735,41.08122],[-3.68673,41.04104],[-3.72866,41.04067],[-3.72803,40.9998],[-3.76896,40.99944],[-3.76864,40.97886],[-3.85473,40.97811],[-3.8544,40.95653],[-3.89857,40.95615],[-3.89764,40.89575],[-3.93906,40.89539],[-3.93716,40.77204],[-4.06198,40.77093],[-4.06133,40.72926],[-4.10372,40.72888],[-4.10311,40.68918],[-4.14628,40.6888],[-4.14498,40.60421],[-4.19025,40.60381],[-4.18994,40.58362],[-4.22946,40.58327],[-4.22979,40.60487],[-4.27054,40.60451],[-4.26958,40.54211],[-4.31384,40.54171],[-4.31163,40.39758],[-4.39376,40.39685],[-4.39345,40.37677],[-4.43723,40.37638],[-4.43623,40.31123],[-4.52192,40.31046],[-4.52037,40.20897],[-4.56131,40.2086],[-4.56099,40.18763],[-4.68895,40.18649],[-4.68933,40.21101],[-4.73192,40.21063],[-4.73252,40.24966],[-4.76838,40.24934],[-4.76809,40.23035],[-4.81104,40.22996],[-4.81147,40.20726],[-4.8542,40.18414],[-4.85264,40.12563],[-4.93699,40.12488],[-4.93638,40.08529],[-5.35538,40.08155],[-5.35606,40.12562],[-5.44027,40.12487],[-5.44091,40.16673],[-5.60382,40.16527],[-5.60448,40.20881],[-5.68646,40.20808],[-5.68712,40.25131],[-6.02166,40.24834],[-6.02295,40.33257],[-6.10433,40.33184],[-6.1056,40.41451],[-6.18951,40.41376],[-6.19018,40.45745],[-6.26971,40.45675],[-6.26909,40.41653],[-6.35192,40.41579],[-6.35128,40.37422],[-6.43325,40.37349],[-6.43264,40.33361],[-6.52245,40.33281],[-6.52116,40.24849],[-6.59942,40.24779],[-6.59886,40.21128],[-6.85568,40.20899],[-6.85634,40.25257],[-6.93622,40.25186],[-6.93751,40.33657],[-6.85111,40.33734],[-6.86001,40.91672],[-6.93544,40.91605],[-6.93741,41.0435],[-6.85482,41.04423],[-6.85548,41.08706],[-6.77015,41.08781],[-6.77245,41.23623],[-6.68379,41.23701],[-6.60436,41.2377],[-6.60524,41.29474],[-6.5193,41.29549],[-6.51991,41.33479],[-6.43673,41.33552],[-6.43801,41.41814],[-6.35318,41.41888],[-6.35447,41.50141],[-6.26889,41.50216],[-6.2708,41.6245],[-6.35661,41.62375],[-6.35724,41.66401],[-6.43548,41.66333],[-6.4349,41.62651],[-6.52279,41.62575],[-6.52343,41.66635],[-6.6034,41.66565],[-6.60733,41.9166],[-7.02209,41.913],[-7.02406,42.03872],[-7.1054,42.03801],[-7.10613,42.08421],[-7.0208,42.08495],[-7.02276,42.2094],[-6.93699,42.21014],[-6.93763,42.25087],[-6.8548,42.25159],[-6.85545,42.29329],[-6.77342,42.294],[-6.77403,42.33244],[-6.85325,42.33176],[-6.85523,42.4569],[-7.10341,42.45477],[-7.10811,42.75115],[-7.02199,42.75189],[-7.02241,42.77825],[-6.93976,42.77896],[-6.94199,42.91962],[-6.77302,42.92106],[-6.77363,42.95958],[-6.52329,42.96172],[-6.52391,43.00095],[-6.43893,43.00167],[-6.44024,43.08361],[-5.93782,43.08789],[-5.93708,43.04189],[-5.85421,43.0426],[-5.85357,43.00258],[-5.77236,43.00327],[-5.77363,43.08308],[-5.6027,43.08453],[-5.60202,43.04222],[-5.52161,43.04291],[-5.52226,43.08409],[-5.4376,43.08481],[-5.43827,43.12651],[-5.10444,43.12935],[-5.10573,43.2099],[-5.02386,43.2106],[-5.02451,43.25117],[-4.90017,43.25222],[-4.89941,43.20501],[-4.81126,43.20576],[-4.80966,43.10538],[-4.76975,43.10571],[-4.76937,43.08168],[-4.72945,43.08202],[-4.72881,43.04219],[-4.56322,43.0436],[-4.56353,43.06296],[-4.39599,43.06438],[-4.39566,43.04336],[-4.3537,43.04371],[-4.35266,42.97836],[-4.23013,42.9794],[-4.22913,42.91625],[-4.18774,42.9166],[-4.18706,42.87407],[-4.10552,42.87476],[-4.10486,42.83348],[-3.97801,42.83457],[-3.97733,42.79214],[-3.9375,42.79248],[-3.93781,42.81183],[-3.85397,42.81254],[-3.85427,42.83193],[-3.89573,42.83158],[-3.89607,42.85343],[-3.93821,42.85307],[-3.93889,42.89577],[-3.9806,42.89542],[-3.98093,42.91627],[-4.0222,42.91591],[-4.0229,42.96014],[-3.97851,42.96052],[-3.97946,43.01999],[-3.93883,43.02034],[-3.93918,43.04239],[-3.89704,43.04275],[-3.89738,43.06414],[-3.85424,43.06451],[-3.8549,43.10583],[-3.77086,43.10654],[-3.77116,43.12515],[-3.72819,43.12551],[-3.72853,43.14656],[-3.68713,43.14691],[-3.68778,43.18786],[-3.60365,43.18858],[-3.60331,43.16747],[-3.52278,43.16815],[-3.52243,43.14619],[-3.39669,43.14726],[-3.39699,43.16601],[-3.35444,43.16637],[-3.35479,43.18837],[-3.31268,43.18873],[-3.31299,43.20828],[-3.22993,43.20899],[-3.22959,43.18768],[-3.10343,43.18875],[-3.10274,43.14562],[-3.14546,43.14526],[-3.14516,43.1271],[-3.10617,43.12743],[-3.10445,43.01915],[-3.02075,43.01987],[-3.0201,42.97903],[-2.9811,42.97936],[-2.97977,42.8958],[-3.10476,42.89473],[-3.10276,42.76928],[-3.02199,42.76997],[-3.02168,42.74983],[-2.98024,42.75019],[-2.97988,42.7275],[-2.89613,42.72822],[-2.89679,42.76967],[-2.8534,42.77004],[-2.85405,42.81087],[-2.68577,42.81231],[-2.68544,42.79159],[-2.64523,42.79194],[-2.64489,42.77024],[-2.52005,42.7713],[-2.51936,42.72827],[-2.5607,42.72791],[-2.56038,42.7076],[-2.51944,42.70795],[-2.5181,42.62357],[-2.60404,42.62283],[-2.60439,42.64497],[-2.77154,42.64353],[-2.77188,42.66544],[-2.81176,42.6651],[-2.8121,42.68624],[-2.85469,42.68588],[-2.85337,42.60302],[-2.89413,42.60267],[-2.89379,42.58159],[-3.0619,42.58015],[-3.06031,42.47952],[-3.02191,42.47985],[-3.0199,42.3525],[-3.06255,42.35213],[-3.06029,42.20906],[-3.1012,42.20871],[-3.10086,42.18682],[-3.06175,42.18716],[-3.0611,42.14559],[-3.02029,42.14594],[-3.01963,42.10375],[-2.89602,42.10482],[-2.89501,42.04071],[-2.81222,42.04143],[-2.81353,42.1246],[-2.76871,42.12499],[-2.76905,42.14674],[-2.72695,42.14711],[-2.7266,42.12485],[-2.68706,42.12519],[-2.68605,42.06109],[-2.72804,42.06073],[-2.72739,42.0193],[-2.60343,42.02037],[-2.60376,42.04135],[-2.561,42.04173],[-2.56198,42.10411],[-2.52266,42.10445],[-2.52299,42.12577],[-2.47933,42.12615],[-2.47963,42.145],[-2.35517,42.14608],[-2.3555,42.16747],[-2.31184,42.16785],[-2.3115,42.14605],[-2.2699,42.14641],[-2.26924,42.1048],[-2.2295,42.10515],[-2.22981,42.12514],[-2.14467,42.12587],[-2.14432,42.10386],[-2.10385,42.10421],[-2.10156,41.95811],[-1.97689,41.95919],[-1.97655,41.93765],[-1.93473,41.93801],[-1.93504,41.95776],[-1.89453,41.95811],[-1.89483,41.97715],[-1.854,41.97751],[-1.85304,41.91638],[-1.81381,41.91672],[-1.81151,41.76984],[-1.7706,41.77019],[-1.76866,41.64582],[-1.85335,41.64508],[-1.85305,41.62567],[-1.89471,41.6253],[-1.89403,41.58215],[-1.97716,41.58142],[-1.97683,41.56021],[-1.9377,41.56055],[-1.9358,41.43834]]],terms_text:"ITACyL"},{id:"finds.jp_KBN_2500",name:"Japan GSI KIBAN 2500",type:"tms",template:"http://www.finds.jp/ws/tmc/1.0.0/KBN2500FN-900913-L/{zoom}/{x}/{y}.png",zoomExtent:[15,20],polygon:[[[140.88867,45.67548],[140.71289,45.41388],[141.04248,43.80282],[139.96582,43.35714],[138.99902,42.01665],[139.04297,41.26129],[137.5708,38.58253],[132.69287,36.86204],[130.84717,34.93999],[129.74854,34.994],[129.02344,34.56086],[128.36426,33.21112],[127.90283,31.87756],[128.4082,29.89781],[125.8374,26.78485],[123.33252,25.0657],[122.58545,24.42715],[123.53027,23.44309],[125.88135,24.10665],[129.96826,26.31311],[132.1875,30.20211],[134.42871,32.43561],[136.82373,33.28462],[137.85645,34.21634],[138.64746,33.24788],[138.58154,32.00808],[139.6582,28.67131],[141.65771,29.66896],[142.0752,32.06396],[141.21826,33.37641],[141.56982,35.44277],[141.43799,36.52729],[142.82227,39.16414],[143.04199,40.89691],[145.92041,42.40723],[146.18408,43.03678],[145.74463,43.54855],[145.32715,43.67582],[145.30518,43.91372],[145.61279,44.2452],[145.41504,44.62175],[144.38232,44.52784],[142.31689,45.53714],[141.3501,45.70618],[140.88867,45.67548]]],terms_url:"http://www.finds.jp/siteinfo/c_tou.html.ja",terms_text:"GSI KIBAN 2500",description:"GSI Kiban 2500 via finds.jp. Good for tracing, but a bit older."},{id:"gsi.go.jp",name:"Japan GSI ortho Imagery",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/ort/{zoom}/{x}/{y}.jpg",zoomExtent:[5,19],polygon:[[[130.35021,31.45741],[130.26851,31.45817],[130.20875,31.44939],[130.1002,31.44996],[130.09237,31.3919],[130.13355,31.37528],[130.35043,31.37528],[130.35021,31.45741]],[[130.4193,31.41715],[130.417,31.41672],[130.41677,31.47525],[130.34179,31.47506],[130.34179,31.48374],[130.33362,31.48374],[130.33329,31.50044],[130.36675,31.49997],[130.36664,31.52458],[130.35019,31.52544],[130.35041,31.54986],[130.32523,31.55024],[130.32501,31.60029],[130.31661,31.63336],[130.31634,31.65084],[130.3752,31.65084],[130.31164,31.67599],[130.29194,31.69179],[130.29105,31.73235],[130.2521,31.73387],[130.24986,31.71693],[130.24427,31.71712],[130.21629,31.75804],[130.17533,31.75919],[130.17422,31.78259],[130.18384,31.79096],[130.23644,31.79096],[130.26911,31.77003],[130.36334,31.75785],[130.42668,31.70893],[130.62409,31.7076],[130.62588,31.68627],[130.61088,31.62245],[130.55582,31.50249],[130.54239,31.41715],[130.42158,31.41715],[130.4193,31.41715]],[[130.52516,31.24184],[130.54441,31.24107],[130.56858,31.21715],[130.59924,31.21657],[130.59924,31.26633],[130.57641,31.26633],[130.57351,31.31625],[130.6308,31.28393],[130.68989,31.27666],[130.66706,31.26059],[130.66594,31.21925],[130.64401,31.18135],[130.59007,31.14688],[130.54239,31.17503],[130.54239,31.1913],[130.50009,31.19207],[130.50009,31.21581],[130.52494,31.21715],[130.52516,31.24184]],[[130.74987,31.16622],[130.74965,31.24107],[130.77449,31.25887],[130.77718,31.33307],[130.75122,31.37455],[130.74898,31.41658],[130.67557,31.46852],[130.67489,31.50077],[131.40006,31.5002],[131.40834,31.45916],[131.36694,31.40932],[131.3656,31.35142],[131.31703,31.34206],[131.29957,31.36595],[131.24317,31.36633],[131.19952,31.43358],[131.14782,31.45019],[131.13394,31.45],[131.1326,31.42899],[131.10059,31.42536],[131.05091,31.41639],[131.04912,31.39155],[131.08403,31.35085],[131.11626,31.35085],[131.11783,31.33422],[130.99943,31.33365],[130.99965,31.25102],[130.87521,31.25064],[130.87454,31.16679],[130.74987,31.16622]],[[130.86625,30.47468],[130.86602,30.49937],[130.93362,30.57493],[130.93227,30.61597],[131.00636,30.61655],[131.04933,30.59112],[131.04933,30.54275],[130.99203,30.50843],[130.99114,30.47526],[130.86625,30.47468]],[[137.87486,36.37519],[138.00005,36.37494],[138.00005,36.30839],[138.04159,36.30827],[138.04191,36.29175],[138.08306,36.29162],[138.08353,36.2499],[138.13307,36.24996],[138.13354,36.16677],[138.16654,36.1667],[138.16694,36.12485],[138.04167,36.12491],[138.04144,36.04158],[137.87479,36.04152],[137.87486,36.37519]],[[138.37446,35.83393],[138.4998,35.83285],[138.4998,35.75042],[138.74936,35.7506],[138.7507,35.58332],[138.62447,35.58386],[138.62536,35.49991],[138.37491,35.49972],[138.37446,35.83393]],[[135.79179,35.64165],[135.8006,35.64923],[135.834,35.65052],[135.8916,35.62003],[135.89271,35.6091],[135.95776,35.60858],[135.9834,35.6172],[135.98435,35.641],[135.95095,35.6419],[135.95048,35.68305],[135.94225,35.69204],[135.94178,35.73239],[136.00809,35.77516],[136.03167,35.77503],[136.05018,35.75012],[136.05003,35.66646],[136.0084,35.65836],[136.00856,35.61694],[136.03404,35.60022],[136.06664,35.59996],[136.06617,35.61656],[136.1002,35.62492],[136.1002,35.69127],[136.07598,35.69166],[136.07503,35.74922],[136.08342,35.76694],[136.12441,35.76605],[136.15021,35.7004],[136.15875,35.64216],[136.17442,35.62492],[136.17553,35.58342],[136.1749,35.55813],[136.15859,35.55832],[136.15875,35.56701],[136.1165,35.56675],[136.11626,35.52555],[136.04045,35.5247],[136.01684,35.50311],[136.01661,35.48334],[135.97543,35.48334],[135.94141,35.50885],[135.94186,35.56641],[135.93358,35.57487],[135.90873,35.57514],[135.90851,35.59953],[135.83185,35.59972],[135.7928,35.62519],[135.79179,35.64165]],[[135.80916,35.47505],[135.77044,35.53345],[135.7579,35.53326],[135.74168,35.51641],[135.70072,35.51705],[135.67464,35.53363],[135.67543,35.56659],[135.6996,35.58333],[135.81654,35.58343],[135.81654,35.56804],[135.85817,35.54956],[135.85851,35.52543],[135.8509,35.5247],[135.85012,35.47514],[135.80916,35.47505]],[[135.58333,35.44132],[135.61656,35.44989],[135.64163,35.47496],[135.71639,35.47478],[135.71728,35.46703],[135.81442,35.46539],[135.86668,35.44187],[135.86679,35.40868],[135.81722,35.40822],[135.81677,35.38496],[135.77548,35.3835],[135.75835,35.40804],[135.59183,35.4084],[135.58322,35.42536],[135.58333,35.44132]],[[135.40011,35.43312],[135.42496,35.44189],[135.45803,35.45008],[135.45899,35.49164],[135.46642,35.49184],[135.46619,35.50807],[135.44181,35.51709],[135.43968,35.53293],[135.45843,35.55804],[135.52324,35.55811],[135.52498,35.5091],[135.54152,35.50008],[135.54152,35.4834],[135.57515,35.48366],[135.57491,35.49164],[135.60878,35.49171],[135.60894,35.46684],[135.59208,35.45826],[135.53305,35.45826],[135.50029,35.45008],[135.50045,35.4415],[135.50789,35.42506],[135.53337,35.42513],[135.53297,35.38346],[135.5416,35.38333],[135.54176,35.36688],[135.5086,35.35836],[135.50892,35.34216],[135.50013,35.34164],[135.50013,35.41662],[135.39987,35.41655],[135.40011,35.43312]],[[133.70822,35.45816],[133.70822,35.33319],[133.12484,35.33328],[133.12495,35.3749],[132.95877,35.37508],[132.95821,35.4578],[132.87506,35.45853],[132.87461,35.52504],[132.95015,35.52522],[132.9497,35.55819],[133.01674,35.55855],[133.01685,35.56675],[133.03352,35.56693],[133.03308,35.59205],[133.06687,35.59187],[133.06654,35.6168],[133.14135,35.61671],[133.14151,35.59181],[133.36667,35.59186],[133.36689,35.57484],[133.34216,35.57447],[133.34194,35.558],[133.33321,35.55026],[133.28363,35.55017],[133.28341,35.49178],[133.33354,35.4916],[133.33354,35.47529],[133.41714,35.47492],[133.41714,35.37516],[133.49995,35.37534],[133.49973,35.45806],[133.45854,35.45806],[133.45854,35.51629],[133.49212,35.5335],[133.54136,35.54161],[133.58343,35.54197],[133.58355,35.45843],[133.70822,35.45816]],[[133.84174,35.46646],[133.84158,35.58367],[133.975,35.58329],[133.97532,35.5086],[134.00823,35.50834],[134.0334,35.49971],[134.0421,35.47497],[134.04432,35.45834],[134.08357,35.4586],[134.08309,35.53359],[134.13326,35.54969],[134.23328,35.55999],[134.27491,35.58342],[134.33299,35.58367],[134.33521,35.49172],[134.36654,35.49224],[134.36654,35.49997],[134.41718,35.49971],[134.41592,35.5417],[134.6253,35.54157],[134.62514,35.37554],[134.70839,35.37463],[134.70823,35.33398],[134.41655,35.33359],[134.41592,35.37528],[134.39218,35.37541],[134.39155,35.35011],[134.37477,35.33346],[134.20005,35.33359],[134.19939,35.35874],[134.24997,35.39971],[134.27515,35.39962],[134.27504,35.39205],[134.35819,35.39314],[134.35852,35.3999],[134.3752,35.39999],[134.37441,35.42489],[134.33256,35.42507],[134.33278,35.41659],[134.04954,35.41659],[134.05077,35.39178],[134.0661,35.39187],[134.06711,35.39999],[134.14187,35.40017],[134.14164,35.36678],[134.18339,35.35847],[134.18372,35.33337],[133.78309,35.33364],[133.78331,35.34159],[133.82472,35.3592],[133.82505,35.38311],[133.84173,35.40838],[133.89981,35.40893],[133.89981,35.41677],[133.85829,35.41659],[133.8574,35.46646],[133.84174,35.46646]],[[133.24987,33.66667],[133.41786,33.66674],[133.52485,33.66674],[133.52493,33.79178],[133.64157,33.79185],[133.64188,33.66681],[133.75006,33.66687],[133.75029,33.62517],[133.79152,33.62498],[133.79168,33.5084],[133.73336,33.5084],[133.73328,33.51658],[133.64196,33.51671],[133.60833,33.48346],[133.52493,33.46682],[133.47492,33.41935],[133.43313,33.38321],[133.37497,33.38334],[133.37497,33.49157],[133.20817,33.49191],[133.20824,33.55827],[133.24947,33.55833],[133.24987,33.66667]],[[134.3501,33.73355],[134.4832,33.73368],[134.48336,33.66732],[134.43366,33.65033],[134.43287,33.63412],[134.35279,33.63347],[134.3501,33.73355]],[[140.31656,36.21656],[140.31671,36.44984],[140.34973,36.44994],[140.35012,36.51668],[140.47467,36.51671],[140.47483,36.59159],[140.62489,36.59204],[140.62467,36.63354],[140.64974,36.6348],[140.65041,36.71684],[140.69912,36.81554],[140.71006,36.91306],[140.70838,36.95687],[140.74956,36.95866],[140.75323,37.06176],[140.75001,37.16671],[141.00832,37.16666],[141.00837,37.0917],[140.98331,37.05828],[140.98333,36.95834],[140.90834,36.90002],[140.81672,36.89999],[140.80828,36.87498],[140.80833,36.85],[140.81655,36.85004],[140.81669,36.8415],[140.81669,36.81816],[140.79988,36.80832],[140.7834,36.79992],[140.775,36.79523],[140.77498,36.78339],[140.75836,36.775],[140.75825,36.75837],[140.75002,36.75831],[140.74689,36.71939],[140.73336,36.65048],[140.69167,36.58337],[140.65003,36.51336],[140.64998,36.38351],[140.59986,36.27483],[140.57499,36.24796],[140.57463,36.21729],[140.31656,36.21656]],[[141.2166,41.24992],[141.41662,41.24971],[141.39858,41.17052],[141.40426,41.0968],[141.39503,41.04046],[141.39858,40.97185],[141.40625,40.91003],[141.41136,40.83011],[141.41307,40.80204],[141.42245,40.74987],[141.34161,40.75084],[141.3149,40.74556],[141.29203,40.74169],[141.23322,40.7419],[141.23307,40.85837],[141.25026,40.85858],[141.24941,40.91647],[141.17412,40.9169],[141.22498,40.9948],[141.23819,41.0696],[141.2497,41.1258],[141.27143,41.15875],[141.23336,41.22995],[141.2166,41.24992]],[[141.25854,41.3166],[141.15015,41.31672],[141.1499,41.39163],[141.18877,41.39205],[141.21625,41.37916],[141.25849,41.36012],[141.25854,41.3166]],[[141.05841,45.2584],[141.03453,45.25833],[141.00874,45.25815],[141.0083,45.27495],[140.99994,45.27495],[141.00002,45.30371],[140.99999,45.30828],[140.99196,45.30846],[140.99171,45.34162],[140.98351,45.34172],[140.98336,45.34998],[140.97477,45.35008],[140.97502,45.3667],[140.96664,45.36675],[140.96685,45.39818],[140.9665,45.42499],[140.9584,45.42484],[140.95816,45.43314],[140.95012,45.4335],[140.94967,45.51651],[140.97443,45.51672],[140.97448,45.50014],[140.98307,45.50042],[140.98332,45.46697],[140.99045,45.46704],[140.99135,45.45876],[141.00019,45.45813],[141.00035,45.45002],[141.01627,45.4502],[141.01637,45.47496],[141.04992,45.47532],[141.04992,45.46676],[141.06614,45.46679],[141.0665,45.4502],[141.07463,45.44999],[141.07498,45.34178],[141.0666,45.34168],[141.06418,45.30611],[141.06644,45.30565],[141.06629,45.28484],[141.05906,45.28357],[141.05841,45.2584]],[[144.27488,42.96671],[144.27502,42.99155],[144.25861,42.99145],[144.25805,42.98314],[144.20818,42.98319],[144.20854,42.97472],[144.16684,42.97503],[144.16684,43.00496],[144.16642,43.04178],[144.07486,43.04188],[144.07493,43.10025],[144.24988,43.1],[144.24988,43.1168],[144.29179,43.11675],[144.292,43.0919],[144.4168,43.09185],[144.4168,43.1168],[144.56654,43.1168],[144.56675,42.99171],[144.50005,42.9915],[144.5002,42.92481],[144.46653,42.92501],[144.31739,42.96675],[144.27488,42.96671]],[[140.69973,42.57513],[140.70015,42.61647],[140.84451,42.61673],[140.99961,42.61669],[141.00006,42.54168],[141.24984,42.54168],[141.24994,42.58336],[141.29163,42.58332],[141.29158,42.6251],[141.37501,42.62498],[141.37501,42.66662],[141.49992,42.66666],[141.49992,42.8165],[141.47496,42.8165],[141.47511,42.83341],[141.81236,42.83357],[141.95752,42.83328],[141.94355,42.77977],[141.95762,42.77896],[141.95832,42.7502],[141.99991,42.75086],[141.9992,42.71493],[142.00031,42.67632],[142.01799,42.65076],[142.09082,42.65002],[142.09122,42.5251],[142.02472,42.5251],[141.96033,42.52495],[141.8665,42.52518],[141.8656,42.57713],[141.83577,42.58519],[141.80482,42.57417],[141.74646,42.57705],[141.73069,42.61477],[141.61707,42.61055],[141.52134,42.60331],[141.45615,42.57587],[141.3562,42.52866],[141.27523,42.48822],[141.19507,42.43791],[141.10476,42.3914],[141.05393,42.33165],[141.0254,42.29161],[140.95187,42.29146],[140.9147,42.32682],[140.89451,42.37174],[140.88426,42.42723],[140.85041,42.46096],[140.76643,42.49978],[140.76663,42.52821],[140.69973,42.57513]],[[140.75005,43.23374],[140.82762,43.2135],[140.88245,43.22531],[140.97338,43.24601],[141.02139,43.24311],[141.04213,43.20211],[141.08346,43.18205],[141.17267,43.16382],[141.25678,43.19366],[141.37528,43.33327],[141.62491,43.33335],[141.62451,43.4168],[141.79146,43.4168],[141.79197,43.83339],[142.12487,43.83332],[142.12487,43.75022],[142.16656,43.74993],[142.16656,43.83317],[142.24954,43.83325],[142.24984,43.8581],[142.27465,43.8581],[142.27465,43.87425],[142.26671,43.8749],[142.26651,43.91688],[142.24994,43.9171],[142.25001,44.5],[142.49997,44.50013],[142.49977,43.88366],[142.51674,43.88344],[142.51644,43.83346],[142.62473,43.83346],[142.62473,43.58331],[142.54176,43.58403],[142.54196,43.50008],[142.50057,43.50022],[142.50037,43.25006],[142.25054,43.25014],[142.25004,43.45838],[142.00031,43.45816],[142.00001,43.41724],[141.91703,43.41688],[141.91703,43.33342],[141.87494,43.33327],[141.87454,43.17487],[141.93351,43.17473],[141.93391,43.15868],[141.99137,43.15802],[141.99207,43.1334],[141.87524,43.13332],[141.87484,43.00012],[141.49984,43.00027],[141.50015,42.91683],[141.25021,42.91631],[141.25001,42.9999],[141.12505,43.00005],[141.12525,43.08323],[140.99988,43.0836],[141.00008,43.16638],[140.75086,43.1666],[140.75005,43.23374]],[[140.59121,41.78353],[140.58382,41.8334],[140.58453,41.87732],[140.59092,41.91613],[140.60797,41.94403],[140.57544,41.95914],[140.58439,41.99979],[140.7104,42.00011],[140.86894,42.00011],[140.91724,42.00053],[140.99041,41.91909],[141.04737,41.90693],[141.12722,41.88398],[141.17552,41.83732],[141.20194,41.81488],[141.18418,41.78321],[141.11301,41.76711],[141.05689,41.71559],[140.99382,41.69968],[140.94267,41.70414],[140.89238,41.73563],[140.84806,41.74326],[140.80018,41.75672],[140.73299,41.74634],[140.69705,41.73234],[140.6881,41.76986],[140.59121,41.78353]],[[140.2418,42.2338],[140.24159,42.25827],[140.21005,42.25797],[140.20804,42.27485],[140.26611,42.27514],[140.2651,42.29179],[140.29001,42.2912],[140.29182,42.26779],[140.33914,42.24139],[140.34145,42.21662],[140.29323,42.21662],[140.2418,42.2338]],[[140.55007,42.08447],[140.54977,42.11387],[140.58066,42.11193],[140.62636,42.12069],[140.63365,42.12136],[140.6336,42.10061],[140.60853,42.09964],[140.60848,42.08327],[140.54972,42.08312],[140.55007,42.08447]],[[140.6583,41.06668],[140.67117,40.91974],[140.84492,40.91652],[140.91726,40.91688],[140.91712,40.87597],[140.9846,40.87533],[140.98503,40.79278],[141.13391,40.79192],[141.13972,40.68034],[141.17424,40.68174],[141.18504,40.60057],[141.43351,40.60078],[141.43308,40.51757],[141.18305,40.51649],[141.18362,40.58223],[141.16714,40.59172],[141.04397,40.59237],[141.04283,40.65825],[140.98402,40.65836],[140.72646,40.65857],[140.72589,40.57521],[140.66849,40.57467],[140.60883,40.57489],[140.60925,40.48311],[140.55058,40.483],[140.54888,40.51757],[140.40028,40.51692],[140.40013,40.5832],[140.25665,40.58233],[140.24898,40.63292],[140.33251,40.63292],[140.33251,40.66687],[140.41676,40.66698],[140.41704,40.73311],[140.33194,40.73375],[140.33351,40.75851],[140.28421,40.75818],[140.28037,40.85679],[140.30254,40.98507],[140.31845,41.00019],[140.42443,41.0004],[140.42443,40.90029],[140.55044,40.89975],[140.54994,41.06668],[140.6583,41.06668]],[[140.01669,40.33381],[140.25252,40.33381],[140.25006,39.33298],[139.98341,39.3332],[140.05622,39.72433],[140.00614,39.77043],[139.94073,39.88023],[139.94158,40.01081],[139.94055,40.08509],[139.94116,40.10876],[140.01669,40.33381]],[[139.85814,39.04176],[139.87552,39.04137],[139.87703,39.00009],[139.91671,39.00001],[139.9167,38.79173],[139.75493,38.79165],[139.7502,38.79386],[139.79376,38.89687],[139.79014,38.9254],[139.83615,38.99102],[139.85814,39.04176]],[[139.37551,38.1174],[139.38053,37.95893],[139.417,37.95845],[139.417,37.87413],[139.37571,37.8746],[139.37611,37.83296],[139.29234,37.83145],[139.30007,37.78074],[139.29173,37.68357],[139.29193,37.66473],[139.22935,37.6594],[139.18113,37.61024],[139.14537,37.60769],[139.12367,37.62671],[139.09816,37.65018],[139.08831,37.6664],[138.99951,37.66656],[138.99942,37.79171],[138.81261,37.79199],[138.86834,37.84689],[138.9915,37.91333],[139.08231,37.9775],[139.27679,38.03417],[139.37551,38.1174]],[[139.96008,38.49993],[140.50033,38.50009],[140.50023,38.16654],[140.37496,38.16654],[140.37536,38.08348],[140.2504,38.08293],[140.21705,38.07407],[140.22136,38.0422],[140.2512,38.04196],[140.2504,38.00017],[140.23372,37.99962],[140.23352,37.94197],[140.20861,37.9411],[140.20841,37.90013],[140.19253,37.89965],[140.19123,37.88372],[140.15838,37.883],[140.15828,37.85811],[140.0753,37.85945],[140.0741,37.87476],[140.05019,37.87571],[140.05019,37.89252],[140.05762,37.89355],[140.05813,37.92541],[140.0741,37.92573],[140.0742,37.94197],[140.09871,37.95369],[140.09821,37.99234],[140.10182,38.00041],[140.12282,38.00081],[140.11549,38.01806],[140.08977,38.02795],[140.0747,38.04133],[140.06727,38.03492],[140.06707,37.99186],[140.01634,37.9917],[140.01584,38.066],[139.99805,38.06656],[139.99966,38.13739],[139.99956,38.17514],[139.99795,38.3337],[139.95787,38.33378],[139.95837,38.50028],[139.96008,38.49993]],[[140.70822,38.7833],[140.70837,39.15023],[141.04194,39.14957],[141.04167,39.50008],[141.00147,39.49986],[140.99893,39.91638],[141.25077,39.91692],[141.25037,39.5007],[141.16709,39.50008],[141.16699,39.45627],[141.16669,39.40273],[141.16689,39.25073],[141.20798,39.24996],[141.20898,38.87471],[141.03399,38.8751],[141.03339,38.78354],[140.86794,38.78315],[140.70822,38.7833]],[[141.3759,38.36972],[141.37476,38.49992],[141.24904,38.50025],[141.25134,38.66886],[141.52524,38.66653],[141.54981,38.63369],[141.55052,38.55563],[141.55549,38.47938],[141.56558,38.39559],[141.54626,38.37398],[141.55919,38.32429],[141.59854,38.31226],[141.59527,38.26063],[141.50762,38.23664],[141.46983,38.24479],[141.39226,38.27725],[141.41158,38.34781],[141.3759,38.36972]],[[131.04175,33.7381],[131.0413,33.70887],[130.99956,33.70858],[131.00035,33.68392],[131.04959,33.68392],[131.05014,33.64171],[131.0751,33.64201],[131.07588,33.61683],[131.10039,33.61666],[131.10084,33.60082],[131.17448,33.60007],[131.19999,33.58422],[131.20066,33.55868],[131.2405,33.55868],[131.28258,33.54207],[131.33137,33.52528],[131.41821,33.55065],[131.51625,33.55084],[131.51692,33.5667],[131.63353,33.56688],[131.63308,33.47545],[131.7423,33.47452],[131.74946,33.45939],[131.75014,33.33289],[131.60756,33.33401],[131.60801,33.37421],[131.52565,33.37458],[131.52467,33.26691],[131.5769,33.25843],[131.64942,33.28332],[131.71634,33.28388],[131.77497,33.26687],[131.78385,33.25028],[131.83291,33.25015],[131.88403,33.2745],[131.90825,33.2749],[131.90809,33.25849],[131.87517,33.20607],[131.84985,33.18276],[131.85032,33.14964],[131.87525,33.15038],[131.90777,33.14129],[131.9171,33.13332],[131.91733,33.10858],[131.9505,33.09967],[131.95019,33.08349],[131.98279,33.08336],[131.98279,33.10007],[132.00036,33.1169],[132.0252,33.1169],[132.02473,33.0998],[132.00843,33.09172],[132.00843,33.06718],[132.01745,33.06705],[132.01715,33.04988],[131.99181,33.04211],[131.92518,33.04092],[131.9255,33.025],[131.95003,33.025],[131.95045,33.01347],[131.95034,32.97482],[131.98326,32.97536],[131.98492,32.95941],[132.0261,32.95922],[132.05828,32.95862],[132.05844,32.99142],[132.07198,32.9917],[132.08297,32.98332],[132.09168,32.92635],[132.02473,32.92542],[132.02473,32.90058],[132.03349,32.88294],[132.00795,32.88357],[131.98326,32.85871],[131.99988,32.8498],[132.01715,32.8429],[132.01603,32.82654],[131.97551,32.78396],[131.93411,32.76746],[131.8992,32.76614],[131.89179,32.71661],[131.83317,32.6507],[131.78369,32.64894],[131.78415,32.58396],[131.74185,32.58283],[131.7082,32.56669],[131.70773,32.54294],[131.74159,32.50852],[131.74141,32.45129],[131.70804,32.44216],[131.70112,32.40878],[131.65787,32.39219],[131.64226,32.33355],[131.59948,32.27572],[131.57492,32.18338],[131.54184,32.08474],[131.542,32.00009],[131.49975,32.00023],[131.50038,31.74971],[131.4586,31.75011],[131.45876,31.79182],[131.24969,31.79169],[131.24969,32.16704],[131.37488,32.16717],[131.37504,32.25046],[131.49991,32.25019],[131.49991,32.33341],[131.54137,32.33341],[131.54167,32.62506],[131.66645,32.62515],[131.66633,32.66662],[131.74993,32.66652],[131.75006,32.91664],[131.5977,32.91688],[131.25044,32.91663],[131.24902,33.00042],[131.49971,33.00002],[131.49987,33.06345],[131.50018,33.13915],[131.4804,33.16631],[131.284,33.16618],[131.26706,33.20035],[131.26627,33.25039],[131.29966,33.26985],[131.29951,33.31999],[131.24427,33.34114],[131.17511,33.34154],[131.17527,33.35806],[131.07525,33.35806],[131.07572,33.33347],[131.00055,33.33321],[131.00007,33.2496],[130.91445,33.2496],[130.7497,33.25013],[130.7497,33.08374],[130.62546,33.08321],[130.62546,33.00002],[130.72796,33.00171],[130.87492,33.00018],[130.8753,32.79131],[130.96677,32.79185],[130.96709,32.85808],[130.92531,32.85781],[130.92531,32.95029],[130.96679,32.95831],[131.00012,32.91683],[131.00017,32.50007],[130.66647,32.50046],[130.66669,32.33306],[130.62506,32.33306],[130.62461,32.24943],[130.49972,32.25037],[130.50039,32.12517],[130.33275,32.12498],[130.3437,32.16133],[130.34954,32.20815],[130.42748,32.29423],[130.46637,32.40054],[130.4939,32.40073],[130.523,32.43304],[130.54941,32.44456],[130.54986,32.4659],[130.48383,32.46647],[130.47421,32.47535],[130.4751,32.50064],[130.5089,32.54197],[130.62439,32.62571],[130.62484,32.6666],[130.52569,32.66679],[130.52524,32.68337],[130.55859,32.71671],[130.55903,32.7745],[130.57493,32.78372],[130.57493,32.82172],[130.50935,32.84185],[130.50778,32.86986],[130.44155,32.89158],[130.41624,32.94258],[130.41579,32.97488],[130.37438,33.00098],[130.37528,33.08315],[130.24927,33.08372],[130.24905,33.16076],[130.15863,33.09741],[130.17775,33.07174],[130.18369,33.06684],[130.18369,33.03401],[130.19958,33.025],[130.19977,33.00001],[130.12479,33.00001],[130.12457,32.96678],[130.0409,32.9407],[130.02501,32.94164],[130.02456,32.91647],[130.12457,32.9172],[130.12457,32.86739],[130.15031,32.86683],[130.19578,32.8661],[130.23334,32.89183],[130.29198,32.89183],[130.29243,32.84991],[130.29153,32.7916],[130.2922,32.71725],[130.18343,32.65791],[130.15034,32.65002],[130.11539,32.64962],[130.11744,32.70014],[130.15903,32.71706],[130.24856,32.75867],[130.24968,32.79085],[130.1333,32.79235],[130.12569,32.76751],[130.00147,32.74963],[129.9294,32.67317],[129.80048,32.57459],[129.80003,32.54704],[129.77425,32.54749],[129.71767,32.54987],[129.71632,32.59043],[129.7499,32.67487],[129.75012,32.72459],[129.80025,32.72553],[129.74161,32.77523],[129.62411,32.8501],[129.62646,32.91787],[129.83159,32.91738],[129.87121,32.91644],[129.89269,32.94105],[129.93343,33.00827],[129.967,33.07469],[130.05809,33.12025],[130.05876,33.21693],[130.24946,33.21674],[130.2499,33.33331],[130.21566,33.3335],[130.0422,33.33331],[129.92559,33.33294],[129.90836,33.35837],[129.90791,33.38304],[129.86695,33.38285],[129.86697,33.36012],[129.83338,33.34079],[129.80093,33.34098],[129.80003,33.31592],[129.75057,33.31686],[129.75034,33.27533],[129.72572,33.27477],[129.6917,33.30807],[129.69237,33.25025],[129.87479,33.25025],[129.8759,33.21299],[129.87521,33.11856],[129.87523,33.03323],[129.80831,33.03305],[129.7499,33.05031],[129.734,33.058],[129.72658,33.08172],[129.69842,33.09982],[129.62413,33.09928],[129.62374,33.12377],[129.62501,33.24201],[129.59255,33.24108],[129.59255,33.29928],[129.54197,33.3004],[129.50012,33.31761],[129.49989,33.41686],[129.59949,33.41593],[129.66753,33.40864],[129.66775,33.43274],[129.8336,33.56656],[129.93208,33.56787],[129.93522,33.40827],[130.04131,33.3836],[130.04108,33.48428],[130.24901,33.48465],[130.25057,33.61681],[130.28504,33.63405],[130.28303,33.69151],[130.30888,33.69151],[130.32365,33.66712],[130.39225,33.69179],[130.41777,33.72484],[130.43388,33.77546],[130.39024,33.87047],[130.39113,33.92509],[130.50774,33.92621],[130.60555,33.89166],[130.66665,33.9496],[130.74991,34.00844],[130.84973,34.00825],[130.8504,34.14155],[130.88308,34.19192],[130.85801,34.27519],[130.83228,34.36706],[130.97127,34.45052],[131.08608,34.43336],[131.19307,34.44166],[131.29356,34.44092],[131.36518,34.44591],[131.37548,34.5328],[131.44934,34.55013],[131.57445,34.69176],[131.62526,34.69158],[131.78596,34.70078],[131.86989,34.77435],[131.99545,34.88146],[132.37594,35.16739],[132.74972,35.16684],[132.75084,35.08318],[132.6255,35.08337],[132.62505,34.91671],[132.3755,34.91689],[132.37527,34.83426],[132.12482,34.83298],[132.12482,34.75008],[132.00038,34.7499],[132.00038,34.5833],[131.74989,34.58326],[131.75139,34.37954],[131.75147,34.1671],[132.12497,34.16683],[132.12481,34.2914],[132.25016,34.29193],[132.24929,34.40917],[132.25016,34.49983],[132.37249,34.49996],[132.37503,34.58339],[132.49167,34.58339],[132.49182,34.70831],[132.59177,34.70824],[132.58365,34.5417],[132.84148,34.54133],[132.84193,34.66623],[133.08343,34.66678],[133.08365,34.76631],[133.20743,34.76687],[133.20787,34.66678],[133.49973,34.66642],[133.50026,34.83314],[133.7012,34.83357],[133.69941,34.87526],[133.74984,34.87535],[133.74984,34.9999],[133.8751,35.00003],[133.87518,35.12504],[133.97425,35.12517],[133.97546,35.00097],[134.0585,34.99997],[134.05816,35.07464],[134.16654,35.0748],[134.1667,35.00016],[134.75338,35.00016],[134.83324,34.99997],[134.8333,35.04176],[135.24494,35.04176],[135.37472,35.04153],[135.37535,35.0836],[135.74948,35.08335],[135.75066,35.25004],[135.87474,35.2503],[135.87529,35.33388],[136.00001,35.33356],[136.00024,35.2587],[135.98331,35.24255],[135.93361,35.20027],[135.93306,35.1667],[135.97539,35.16664],[135.97523,35.15597],[136.04993,35.15829],[136.04993,35.21663],[136.05895,35.22484],[136.12455,35.23344],[136.12536,35.25011],[136.16667,35.24997],[136.16651,35.36441],[136.16664,35.45873],[136.33347,35.45857],[136.37478,35.33382],[136.49981,35.33356],[136.49965,35.49981],[136.74991,35.58365],[137.00003,35.58344],[136.99984,35.41254],[136.99999,35.33351],[137.24995,35.33357],[137.24998,34.91665],[137.6249,34.91658],[137.62516,35.00034],[137.69186,35.00052],[137.69182,35.06711],[137.74199,35.06668],[137.74222,35.10789],[137.77489,35.10844],[137.77474,35.15015],[138.16671,35.15021],[138.16666,35.2918],[138.38224,35.29138],[138.50029,35.29187],[138.50119,35.33333],[138.38256,35.33369],[138.38319,35.44169],[138.49985,35.44208],[138.49988,35.4584],[138.66644,35.45855],[138.66704,35.37476],[138.70818,35.37519],[138.70818,35.33348],[138.8334,35.33357],[138.83329,35.40832],[139.0082,35.40836],[139.00858,35.39192],[139.1243,35.39228],[139.12498,35.41668],[139.25001,35.41667],[139.24995,35.49996],[139.12487,35.50005],[139.12492,35.5833],[138.99999,35.58333],[138.99999,35.6667],[139.1249,35.66678],[139.12504,35.8092],[139.12474,35.91713],[139.00053,35.91713],[139.00006,36.00001],[139.12492,36.00012],[139.12547,36.11894],[139.12495,36.16664],[139,36.16668],[138.99941,36.25031],[138.95831,36.25002],[138.95822,36.29127],[138.91663,36.29166],[138.91678,36.37496],[138.95845,36.37565],[138.95836,36.45832],[139.08379,36.45868],[139.08334,36.5],[139.25009,36.50012],[139.2496,36.54136],[139.37464,36.54189],[139.37505,36.62499],[139.45022,36.62528],[139.44999,36.66667],[139.66374,36.66671],[139.75002,36.66665],[139.75005,36.75003],[140,36.75001],[139.99998,36.62209],[140.00001,36.41668],[140.25001,36.41666],[140.24999,36.04158],[140.50004,36.04158],[140.49989,35.83349],[140.41632,35.83374],[140.4168,35.7919],[140.45874,35.79113],[140.45874,35.72461],[140.51666,35.72486],[140.51691,35.7417],[140.59144,35.74174],[140.5915,35.94177],[140.65002,35.94164],[140.64994,36.00837],[140.67503,36.00834],[140.71403,35.92326],[140.77327,35.83877],[140.81532,35.78508],[140.89133,35.7501],[140.89211,35.71717],[140.86632,35.67853],[140.80694,35.70622],[140.72767,35.6761],[140.68235,35.68891],[140.60194,35.63074],[140.48545,35.54409],[140.4095,35.42897],[140.40816,35.33353],[140.30722,35.33371],[140.30767,35.41748],[140.30946,35.45851],[140.20762,35.45905],[140.20829,35.37478],[140.12503,35.37478],[140.12436,35.33408],[140.29155,35.33316],[140.29245,35.20909],[140.31707,35.20836],[140.31662,35.18422],[140.35042,35.18257],[140.3431,35.13152],[140.23201,35.10096],[140.13697,35.09271],[140.05542,35.03643],[139.98865,34.98849],[139.96379,34.91688],[139.91222,34.88262],[139.82272,34.89218],[139.78337,34.93633],[139.73961,34.95322],[139.7443,34.99303],[139.81476,35.00932],[139.7963,35.05283],[139.80169,35.09108],[139.80766,35.1529],[139.80866,35.19667],[139.85153,35.24127],[139.8325,35.29189],[139.74927,35.2961],[139.76149,35.33517],[139.79232,35.35267],[139.81035,35.49933],[140.0035,35.49988],[140.03349,35.53668],[140.06639,35.58384],[139.79714,35.58311],[139.80005,35.50079],[139.77087,35.47343],[139.70992,35.44207],[139.6987,35.40282],[139.66887,35.36715],[139.68478,35.30781],[139.73549,35.2728],[139.75069,35.25934],[139.73734,35.23092],[139.74388,35.20852],[139.69714,35.18971],[139.67426,35.1702],[139.68932,35.15394],[139.68151,35.13477],[139.62355,35.12199],[139.59783,35.1285],[139.60224,35.17253],[139.58363,35.18959],[139.59033,35.24164],[139.5496,35.28403],[139.49879,35.30084],[139.42314,35.30942],[139.29131,35.30066],[139.23074,35.27778],[139.15546,35.23542],[139.15031,35.17507],[139.16665,35.13316],[139.12502,35.13298],[139.09436,35.13335],[139.05832,35.13316],[139.05671,35.00443],[139.03348,34.98385],[138.99968,34.98367],[139.00057,34.88274],[139.14136,34.88348],[139.11002,34.84602],[139.08129,34.79529],[139.01691,34.74107],[138.9999,34.64151],[138.90044,34.6097],[138.87367,34.59159],[138.80026,34.59988],[138.75773,34.65881],[138.72528,34.67575],[138.72528,34.72506],[138.83316,34.72598],[138.83383,34.74952],[138.7419,34.75106],[138.7338,34.8136],[138.74985,34.90057],[138.76065,34.93773],[138.75028,34.98313],[138.77855,35.04352],[138.87546,35.03316],[138.87703,35.04929],[138.85845,35.04984],[138.76804,35.12107],[138.68294,35.12223],[138.61873,35.09015],[138.55409,35.05201],[138.54926,34.99442],[138.49996,34.95392],[138.39142,34.91129],[138.35562,34.86759],[138.33929,34.80042],[138.27635,34.72246],[138.24467,34.66616],[138.24396,34.58503],[138.12662,34.58573],[138.01467,34.62561],[137.88184,34.65541],[137.79532,34.63718],[137.68991,34.65307],[137.57654,34.66441],[137.38135,34.64618],[137.18402,34.58409],[137.03187,34.5662],[137.00794,34.57573],[137.0254,34.61792],[137.0599,34.66613],[137.17517,34.66686],[137.30767,34.75996],[137.29894,34.77595],[137.29088,34.79231],[137.25037,34.79213],[137.21635,34.76768],[137.15816,34.74911],[137.08318,34.75076],[137.03215,34.76345],[136.94061,34.80848],[136.93456,34.77522],[136.98335,34.72575],[137.06751,34.74212],[137.06773,34.70183],[137.02454,34.70809],[137.01581,34.64937],[136.98179,34.65029],[136.82601,34.74911],[136.84884,34.82319],[136.79266,34.82521],[136.79132,35.00048],[136.75081,35.00012],[136.74991,34.95849],[136.68277,34.96069],[136.6624,34.89701],[136.59078,34.80003],[136.53863,34.72704],[136.58294,34.62506],[136.75682,34.54181],[136.85798,34.54126],[136.93945,34.54347],[136.91675,34.49231],[136.94081,34.46687],[136.94113,34.40866],[136.92404,34.35876],[136.90742,34.30209],[136.90045,34.2666],[136.84981,34.23416],[136.81693,34.1923],[136.79948,34.19254],[136.79996,34.22906],[136.74203,34.25863],[136.73325,34.28285],[136.70896,34.28334],[136.64264,34.25902],[136.5594,34.22605],[136.53564,34.22167],[136.50068,34.20864],[136.44007,34.20053],[136.38325,34.16675],[136.3334,34.14802],[136.31583,34.08487],[136.2674,34.08316],[136.12497,34.08343],[136.12449,34.16688],[136.24968,34.16688],[136.24984,34.25012],[136.37486,34.25025],[136.37468,34.33331],[136.50021,34.33302],[136.49973,34.49192],[136.45843,34.49127],[136.45811,34.5416],[136.4168,34.54186],[136.41664,34.62516],[136.37494,34.62464],[136.37469,34.68106],[136.37485,34.74974],[136.33402,34.75026],[136.33354,34.79109],[136.37485,34.79213],[136.37533,34.95858],[136.33323,34.95858],[136.33323,34.83345],[136.29239,34.83371],[136.29208,34.792],[136.24966,34.79213],[136.24998,34.70838],[136.29192,34.70851],[136.2916,34.62475],[136.12487,34.62512],[136.12498,34.66674],[136.04161,34.66655],[136.04094,34.7499],[136.00023,34.75009],[135.99991,34.65993],[135.99975,34.58387],[136.04153,34.58374],[136.04185,34.50017],[136.04989,34.49997],[136.05005,34.42503],[135.91674,34.425],[135.91667,34.35836],[135.81665,34.35837],[135.81661,34.31668],[135.74991,34.31672],[135.75007,34.29167],[135.64152,34.29176],[135.64186,34.27512],[135.53325,34.27489],[135.53348,34.25834],[135.475,34.25834],[135.47511,34.22498],[135.37507,34.22512],[135.3749,34.20814],[135.50001,34.20837],[135.50001,33.66652],[135.87502,33.66661],[135.87558,33.74983],[136.03371,33.75021],[136.01272,33.71062],[135.99681,33.67327],[135.97948,33.63389],[135.97195,33.61271],[135.95831,33.56798],[135.85332,33.50522],[135.85353,33.48302],[135.87591,33.4814],[135.86057,33.44051],[135.77718,33.42558],[135.7418,33.42534],[135.74163,33.4665],[135.68498,33.47915],[135.59008,33.49633],[135.47373,33.52819],[135.3902,33.5752],[135.37485,33.61633],[135.37533,33.64967],[135.33371,33.6498],[135.32468,33.66653],[135.45794,33.66666],[135.45842,33.74987],[135.41727,33.75],[135.41663,33.78802],[135.41743,33.83273],[135.37517,33.83326],[135.37517,33.79171],[135.3284,33.78999],[135.28777,33.75622],[135.21503,33.7698],[135.14371,33.85113],[135.12013,33.87826],[135.05776,33.87991],[135.05947,33.96479],[135.07709,34.00837],[135.11345,34.05029],[135.06515,34.06759],[135.07041,34.121],[135.15522,34.16286],[135.1163,34.18742],[135.06316,34.25849],[135.04915,34.27082],[134.99554,34.27152],[134.9955,34.29122],[134.99945,34.29894],[135.00904,34.30357],[135.1457,34.34721],[135.20804,34.35108],[135.24174,34.39165],[135.19145,34.42482],[135.25012,34.46056],[135.29487,34.42658],[135.30902,34.44119],[135.36647,34.53277],[135.39147,34.53394],[135.38308,34.63128],[135.36409,34.66669],[135.29161,34.66695],[135.29061,34.6245],[135.08349,34.62463],[135.04725,34.61643],[134.92905,34.64799],[134.826,34.69662],[134.75874,34.74267],[134.71632,34.74982],[134.52561,34.74969],[134.41657,34.70885],[134.31671,34.66669],[134.25055,34.66656],[134.24992,34.68309],[134.15797,34.68348],[134.15781,34.70013],[134.12505,34.7],[134.12474,34.58386],[134.11666,34.55845],[134.02519,34.55024],[134.02535,34.44785],[134.02788,34.41639],[134.19168,34.41678],[134.19152,34.38401],[134.28347,34.38296],[134.28347,34.33371],[134.38082,34.29415],[134.40952,34.26539],[134.43268,34.24648],[134.56265,34.25055],[134.66663,34.24963],[134.64146,34.04963],[134.70809,33.96554],[134.74006,33.92825],[134.71221,33.86773],[134.76918,33.86691],[134.76712,33.82524],[134.66742,33.7754],[134.63102,33.77487],[134.50018,33.77493],[134.49978,33.95855],[134.4582,33.95874],[134.45816,34.00006],[134.34679,33.99889],[134.06047,33.99988],[133.74955,34.00047],[133.74998,34.33337],[133.875,34.33342],[133.87494,34.41668],[133.95888,34.41683],[133.95843,34.44157],[133.85055,34.44157],[133.84966,34.46621],[133.82537,34.46704],[133.81642,34.44222],[133.84205,34.43326],[133.84194,34.41656],[133.75822,34.41715],[133.74122,34.44175],[133.6913,34.44152],[133.69085,34.45739],[133.69097,34.46639],[133.70004,34.48346],[133.61655,34.48355],[133.61689,34.45827],[133.53351,34.45887],[133.53329,34.41752],[133.4897,34.41743],[133.46642,34.43313],[133.46631,34.44992],[133.4503,34.45002],[133.45008,34.4166],[133.41713,34.41696],[133.41668,34.35786],[133.34174,34.3583],[133.30304,34.37515],[133.2748,34.35876],[133.21655,34.35],[133.16694,34.35007],[133.16662,34.36659],[133.09184,34.36659],[133.09176,34.3417],[133.05837,34.34164],[133.05829,34.32491],[132.90003,34.32517],[132.89148,34.29164],[132.7917,34.29164],[132.79133,34.28281],[132.792,34.24212],[132.77492,34.22513],[132.71629,34.22499],[132.71652,34.21655],[132.75854,34.21636],[132.775,34.20877],[132.79218,34.20095],[132.79223,34.14177],[132.74138,34.14173],[132.70838,34.16655],[132.63354,34.16665],[132.61664,34.1917],[132.59185,34.1916],[132.5749,34.1666],[132.54155,34.16674],[132.54178,34.14196],[132.42515,34.14165],[132.42503,34.16657],[132.3749,34.16663],[132.37515,34.18348],[132.40833,34.18343],[132.3752,34.2168],[132.34991,34.23331],[132.35014,34.25834],[132.35814,34.25843],[132.35819,34.27503],[132.33922,34.25834],[132.29166,34.22494],[132.24992,34.22494],[132.25003,34.2043],[132.25809,34.18324],[132.28327,34.18352],[132.28321,34.19995],[132.29183,34.20837],[132.32501,34.20847],[132.31684,34.1753],[132.25843,34.17533],[132.25843,34.14171],[132.2502,34.11675],[132.21669,34.11684],[132.21685,34.0585],[132.22491,34.05827],[132.22502,33.99163],[132.21669,33.99177],[132.21652,33.97516],[132.25037,33.97526],[132.25014,33.91622],[131.95761,33.91733],[131.95783,33.92512],[131.91755,33.92495],[131.91586,33.95863],[131.88699,33.96671],[131.87569,33.95891],[131.84973,33.92502],[131.80049,33.92439],[131.79948,33.95046],[131.7752,33.95057],[131.75058,33.9668],[131.70828,33.97508],[131.70918,33.92551],[131.68366,33.92513],[131.68321,33.95056],[131.6916,33.96717],[131.69988,33.98323],[131.68332,33.99937],[131.68354,34.01681],[131.69999,34.017],[131.70011,34.03314],[131.68209,34.03352],[131.67515,34.02581],[131.62513,34.02488],[131.59122,33.97515],[131.38721,33.97497],[131.29981,33.91685],[131.16675,33.91667],[131.1172,33.97473],[131.06078,34.02462],[131.03349,34.02557],[131.04198,34.00848],[131.04175,33.7381]],[[135.98583,35.86595],[135.93905,35.95517],[135.95723,36.1316],[136.15271,36.29666],[136.6596,36.75695],[136.65846,37.00603],[136.66642,37.33477],[136.85167,37.42328],[137.11307,37.5288],[137.31877,37.54953],[137.39151,37.50356],[137.34765,37.35791],[137.20218,37.24762],[137.09307,37.06828],[137.0223,36.83795],[137.09532,36.80133],[137.22971,36.77368],[137.35387,36.80451],[137.39706,36.90966],[137.50588,36.95883],[137.72267,37.01579],[137.95199,37.10656],[138.053,37.16975],[138.18626,37.18254],[138.28854,37.24861],[138.43501,37.34512],[138.54909,37.41229],[138.61842,37.49225],[138.73903,37.51536],[138.78378,37.5674],[138.82185,37.62796],[138.91491,37.63009],[138.924,37.6032],[139.01321,37.59757],[139.01421,37.53507],[139.03452,37.52325],[139.03793,37.45798],[139.04887,37.42358],[139.13027,37.42312],[139.23881,37.4326],[139.26282,37.33326],[139.12289,37.32784],[139.11408,37.26354],[139.11422,37.16748],[139.05555,37.16658],[138.82825,37.17133],[138.87072,37.2338],[138.89104,37.31316],[138.72965,37.33259],[138.71403,37.29474],[138.71715,37.1642],[138.53517,37.16533],[138.39907,37.16692],[138.37478,37.13261],[138.3725,36.99907],[138.08823,36.99839],[138.08596,36.91586],[137.89233,36.91768],[137.87798,36.83517],[137.66517,36.8321],[137.52111,36.83142],[137.51216,36.74222],[137.39482,36.74427],[137.37138,36.58325],[137.29367,36.58371],[137.18016,36.55028],[137.21383,36.53133],[137.26384,36.33176],[136.63321,36.33496],[136.50436,36.29227],[136.39412,36.29444],[136.38034,36.25493],[136.37778,36.17665],[136.38218,36.09507],[136.38758,36.00065],[136.2593,35.99399],[136.25532,35.90923],[136.24992,35.83337],[136.12207,35.82876],[136.11184,35.88725],[136.05984,35.91165],[136.01793,35.86676],[135.98583,35.86595]],[[140.03281,37.29986],[140.03344,37.34643],[140.03344,37.47427],[140.03407,37.48281],[139.99973,37.48356],[140.00036,37.44198],[139.94212,37.44173],[139.94197,37.35007],[139.89116,37.35007],[139.89116,37.41698],[139.81725,37.41647],[139.81266,37.57468],[139.74192,37.57556],[139.74224,37.79174],[139.81789,37.79162],[139.98296,37.79112],[139.98359,37.58334],[140.0412,37.58334],[140.04151,37.47502],[140.1591,37.47528],[140.15815,37.63311],[140.3745,37.63399],[140.37481,37.83338],[140.5,37.83525],[140.49989,37.91662],[140.53144,37.9168],[140.62489,37.9167],[140.62489,37.84641],[140.62534,37.33359],[140.57502,37.33284],[140.57486,37.25881],[140.4579,37.25855],[140.45774,37.2084],[140.2501,37.20866],[140.24994,37.29998],[140.03281,37.29986]],[[141.00075,38.16707],[140.84264,38.16752],[140.68779,38.16405],[140.70788,38.09499],[140.70868,38.03346],[140.61627,38.03362],[140.53369,38.11364],[140.5359,38.14478],[140.61948,38.14478],[140.62471,38.2048],[140.6231,38.27376],[140.63073,38.33902],[140.81255,38.33698],[141.00362,38.33398],[141.00075,38.16707]],[[129.44454,34.73675],[129.52524,34.65452],[129.35703,34.19046],[129.23088,34.06063],[129.15132,34.11616],[129.27179,34.63488],[129.44454,34.73675]]],terms_url:"http://www.gsi.go.jp/kikakuchousei/kikakuchousei40182.html",terms_text:"GSI Japan",description:"Japan GSI ortho Imagery. Usually better than bing, but a bit older."},{id:"gsi.go.jp_std_map",name:"Japan GSI Standard Map",type:"tms",template:"https://cyberjapandata.gsi.go.jp/xyz/std/{zoom}/{x}/{y}.png",zoomExtent:[5,18],polygon:[[[141.85547,44.64912],[140.22949,43.9691],[138.95508,41.80408],[139.48242,40.17887],[138.86719,38.30718],[136.31836,37.19533],[132.14355,35.13788],[128.93555,33.35806],[129.50684,32.4727],[129.77051,31.69078],[130.20996,30.90223],[131.2207,30.78904],[131.66016,32.32428],[132.71484,32.87959],[133.76953,33.17434],[136.75781,33.87042],[139.30664,35.06597],[140.88867,35.17381],[141.15234,36.5626],[142.11914,39.94344],[141.76758,42.68243],[141.85547,44.64912]]],terms_url:"https://maps.gsi.go.jp/help/use.html",terms_text:"GSI Japan",description:"Japan GSI Standard Map. Widely covered."},{id:"kalmar-orto-2014",name:"Kalmar North Orthophoto 2014",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2014/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.28473,56.70827],[16.38856,56.70798],[16.40843,56.7615],[16.46269,56.75672],[16.47753,56.76023],[16.48815,56.77023],[16.48754,56.79231],[16.48254,56.79547],[16.47667,56.8223],[16.4687,56.82614],[16.48584,56.86271],[16.48809,56.87369],[16.45694,56.87786],[16.46288,56.88769],[16.42696,56.88757],[16.39809,56.89604],[16.36791,56.8952],[16.36717,56.85985],[16.36431,56.84636],[16.36001,56.83657],[16.34423,56.82532],[16.32675,56.79284],[16.26114,56.74422],[16.28473,56.70827]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the north coast of the municipality of Kalmar 2014",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2016",name:"Kalmar South Orthophoto 2016",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2016/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.156,56.45834],[16.11389,56.46083],[16.09246,56.46633],[16.0724,56.4662],[16.07126,56.51153],[16.08516,56.56847],[16.14417,56.63933],[16.21168,56.68491],[16.28412,56.71655],[16.25135,56.74358],[16.25045,56.75062],[16.29558,56.7512],[16.33516,56.72511],[16.38922,56.71885],[16.41137,56.67602],[16.4053,56.66294],[16.33101,56.625],[16.28048,56.613],[16.21561,56.51967],[16.156,56.45834]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for the south coast of the municipality of Kalmar 2016",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{id:"kalmar-orto-2018",name:"Kalmar Urban Orthophoto 2018",type:"wms",template:"https://kartportal.kalmar.se/arcgisserver/services/Ortofoto/Kalmar_2018/ImageServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[9,22],polygon:[[[16.3416,56.81756],[16.32773,56.7973],[16.36692,56.78706],[16.37105,56.79153],[16.36978,56.80511],[16.35645,56.8133],[16.3416,56.81756]],[[16.39207,56.79339],[16.4608,56.78944],[16.48817,56.79067],[16.4833,56.76986],[16.46612,56.76711],[16.45409,56.76774],[16.43173,56.77309],[16.43178,56.77663],[16.40554,56.77214],[16.39325,56.77349],[16.39207,56.79339]],[[16.29836,56.79102],[16.28796,56.7883],[16.27727,56.78367],[16.27623,56.77952],[16.2862,56.7761],[16.3108,56.77696],[16.3118,56.78086],[16.30364,56.78883],[16.29836,56.79102]],[[16.20686,56.63637],[16.22098,56.62389],[16.2453,56.62467],[16.26751,56.62951],[16.28724,56.63831],[16.37871,56.65462],[16.38806,56.6897],[16.38664,56.72867],[16.31586,56.72879],[16.29956,56.7219],[16.29331,56.70021],[16.26799,56.66889],[16.23945,56.66991],[16.2266,56.6624],[16.21411,56.64972],[16.20686,56.63637]],[[16.15172,56.67843],[16.15712,56.69334],[16.15268,56.70297],[16.13274,56.71254],[16.10987,56.71964],[16.08638,56.7112],[16.07969,56.70056],[16.08149,56.69566],[16.09534,56.69599],[16.12877,56.67766],[16.15172,56.67843]],[[15.97369,56.62759],[16.00164,56.63215],[16.04126,56.62999],[16.05658,56.62489],[16.06201,56.61794],[16.09186,56.60378],[16.10527,56.5926],[16.09581,56.58161],[16.03481,56.60405],[16.0305,56.61252],[16.0088,56.60223],[15.98755,56.59742],[15.98449,56.57141],[15.94887,56.57264],[15.91878,56.55184],[15.90892,56.55393],[15.89921,56.56867],[15.9188,56.57287],[15.94612,56.57491],[15.96371,56.59004],[15.9496,56.59724],[15.94308,56.60903],[15.95726,56.61598],[15.97589,56.62005],[15.97369,56.62759]]],terms_url:"http://data-kalmar.opendata.arcgis.com/",terms_text:"© Kalmar municipality",best:true,description:"Orthophotos for urban areas of the municipality of Kalmar 2018",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/67/Kalmarvapen_1a.svg/206px-Kalmarvapen_1a.svg.png"},{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",zoomExtent:[8,19],polygon:[[[8.09602,47.57882],[8.10323,47.57879],[8.10323,47.58583],[8.10591,47.58732],[8.11019,47.58878],[8.11589,47.5893],[8.12168,47.58916],[8.12546,47.58873],[8.12959,47.58888],[8.13023,47.59122],[8.132,47.59358],[8.13506,47.59546],[8.13831,47.59698],[8.14161,47.59939],[8.14534,47.60076],[8.14961,47.60144],[8.15438,47.60127],[8.15751,47.60063],[8.16119,47.59914],[8.16255,47.59976],[8.16438,47.60148],[8.16653,47.60399],[8.17087,47.60673],[8.17608,47.60838],[8.17912,47.60868],[8.18153,47.6118],[8.18304,47.61489],[8.18498,47.6176],[8.18953,47.62151],[8.19212,47.62321],[8.22261,47.623],[8.22561,47.6212],[8.22849,47.61842],[8.22959,47.61621],[8.23008,47.61501],[8.23261,47.61686],[8.23657,47.61803],[8.24,47.61835],[8.24351,47.61783],[8.24749,47.61877],[8.25066,47.61988],[8.25708,47.6208],[8.26104,47.62069],[8.26491,47.61935],[8.26732,47.61769],[8.26902,47.61531],[8.27579,47.61702],[8.28106,47.61707],[8.28772,47.61626],[8.29421,47.61442],[8.29947,47.61221],[8.30311,47.60977],[8.30287,47.59447],[8.30438,47.59227],[8.30591,47.59109],[8.30791,47.59019],[8.31236,47.58917],[8.31655,47.58713],[8.32049,47.58436],[8.32598,47.57888],[8.32864,47.57716],[8.33219,47.57604],[8.33902,47.57577],[8.34702,47.57628],[8.35962,47.57552],[8.36475,47.57436],[8.37207,47.57377],[8.38002,47.57233],[8.38194,47.57496],[8.38387,47.57686],[8.38879,47.58027],[8.39232,47.58174],[8.39611,47.58247],[8.40013,47.58255],[8.40432,47.58158],[8.41158,47.57928],[8.418,47.57602],[8.42381,47.57452],[8.43039,47.57228],[8.43275,47.57035],[8.4336,47.56849],[8.43353,47.56669],[8.4319,47.56444],[8.4286,47.56217],[8.42575,47.56121],[8.4259,47.55854],[8.42498,47.55624],[8.42353,47.55469],[8.42296,47.5537],[8.4246,47.5517],[8.42492,47.54981],[8.42434,47.54836],[8.42539,47.54679],[8.425,47.54418],[8.4233,47.5422],[8.421,47.54106],[8.41832,47.54049],[8.41551,47.54062],[8.4139,47.53924],[8.41283,47.5372],[8.41194,47.53626],[8.41241,47.53415],[8.41185,47.53237],[8.41117,47.53158],[8.40143,47.53169],[8.40124,47.52443],[8.39936,47.5222],[8.39666,47.52082],[8.39385,47.51988],[8.39085,47.51973],[8.38877,47.52014],[8.38809,47.5146],[8.38551,47.51075],[8.38366,47.50944],[8.36776,47.50953],[8.36739,47.48709],[8.3751,47.48689],[8.37889,47.4853],[8.38196,47.48188],[8.38184,47.47521],[8.38328,47.47192],[8.38244,47.46879],[8.37943,47.46643],[8.37751,47.4659],[8.37787,47.46496],[8.38238,47.46423],[8.38671,47.46097],[8.39171,47.45743],[8.39315,47.45349],[8.39514,47.45031],[8.39418,47.44722],[8.39171,47.44535],[8.3896,47.44449],[8.38996,47.44339],[8.39111,47.4416],[8.39213,47.43924],[8.39339,47.4359],[8.39249,47.43411],[8.39369,47.43143],[8.39568,47.42854],[8.39959,47.42463],[8.39953,47.41954],[8.449,47.41897],[8.45369,47.41233],[8.45369,47.40451],[8.44858,47.39649],[8.40362,47.39685],[8.40483,47.39392],[8.4029,47.38903],[8.4035,47.38553],[8.40314,47.38304],[8.40483,47.37905],[8.40844,47.37575],[8.41379,47.37338],[8.4159,47.37016],[8.41584,47.36539],[8.4144,47.36327],[8.41494,47.35912],[8.41722,47.35573],[8.41632,47.35231],[8.41355,47.34913],[8.41367,47.34688],[8.41476,47.3448],[8.41885,47.34244],[8.42264,47.34052],[8.42469,47.33718],[8.42421,47.33163],[8.42914,47.33286],[8.4351,47.33192],[8.43763,47.33281],[8.44328,47.33506],[8.44527,47.33746],[8.45213,47.3402],[8.45761,47.33975],[8.46212,47.33649],[8.46278,47.33322],[8.46043,47.32829],[8.45797,47.32457],[8.45556,47.32005],[8.44918,47.31495],[8.44713,47.31217],[8.44021,47.30948],[8.43624,47.29817],[8.43311,47.29593],[8.42806,47.29397],[8.42318,47.29001],[8.41656,47.28789],[8.41024,47.28728],[8.4035,47.28409],[8.40188,47.2805],[8.40862,47.27593],[8.41066,47.2716],[8.40892,47.26613],[8.41235,47.2618],[8.41235,47.25873],[8.41109,47.25608],[8.41698,47.25142],[8.41885,47.2475],[8.41801,47.24305],[8.4144,47.23904],[8.41373,47.23565],[8.4106,47.23226],[8.40435,47.22797],[8.40296,47.2256],[8.40398,47.22127],[8.40856,47.21718],[8.40928,47.21326],[8.40844,47.20945],[8.41012,47.20258],[8.41319,47.19678],[8.41271,47.1924],[8.4088,47.18799],[8.40814,47.18475],[8.4091,47.1812],[8.41518,47.17915],[8.41915,47.17563],[8.42294,47.16553],[8.42294,47.15747],[8.42011,47.15325],[8.42246,47.14838],[8.42276,47.14392],[8.42053,47.13954],[8.41584,47.13524],[8.40898,47.13274],[8.40386,47.13201],[8.40116,47.13258],[8.39532,47.1327],[8.38437,47.1345],[8.37895,47.13385],[8.37245,47.13442],[8.36908,47.13659],[8.368,47.13876],[8.35656,47.14228],[8.35409,47.14564],[8.35331,47.14916],[8.3506,47.15161],[8.3503,47.15419],[8.34772,47.15669],[8.34561,47.15923],[8.34086,47.16164],[8.33935,47.16512],[8.3373,47.16896],[8.33315,47.17154],[8.33261,47.17351],[8.33062,47.17792],[8.33002,47.18717],[8.32924,47.18786],[8.32936,47.19494],[8.32292,47.19514],[8.32148,47.19854],[8.32196,47.20115],[8.31835,47.21043],[8.31413,47.21178],[8.31089,47.2153],[8.31107,47.21857],[8.31221,47.2198],[8.30884,47.22433],[8.30932,47.22646],[8.30715,47.23042],[8.30727,47.2321],[8.30595,47.23582],[8.30607,47.23949],[8.30378,47.24366],[8.30144,47.24677],[8.29554,47.24836],[8.29187,47.25293],[8.28814,47.25869],[8.28766,47.26143],[8.28627,47.26519],[8.28723,47.26805],[8.28838,47.26964],[8.2823,47.27478],[8.27718,47.27576],[8.27273,47.27531],[8.26749,47.27593],[8.26533,47.27719],[8.2616,47.27695],[8.25793,47.27781],[8.25576,47.27887],[8.25317,47.27678],[8.25034,47.27548],[8.2501,47.27348],[8.24956,47.27017],[8.24559,47.26715],[8.24095,47.26678],[8.23452,47.26727],[8.23145,47.26278],[8.2309,47.25931],[8.22663,47.24942],[8.222,47.24713],[8.21526,47.24431],[8.21363,47.24203],[8.21309,47.23602],[8.21123,47.23246],[8.21285,47.22548],[8.21117,47.22266],[8.20689,47.22053],[8.19762,47.22065],[8.19149,47.21861],[8.16976,47.21865],[8.16543,47.22315],[8.16085,47.22405],[8.15351,47.2294],[8.15171,47.2332],[8.14822,47.23647],[8.14798,47.241],[8.14635,47.24203],[8.13823,47.24166],[8.13558,47.23941],[8.12673,47.23606],[8.1218,47.23631],[8.11614,47.23872],[8.10675,47.23945],[8.10266,47.24113],[8.09983,47.24436],[8.09766,47.2493],[8.09797,47.25069],[8.09339,47.25567],[8.08852,47.2569],[8.08485,47.25583],[8.08323,47.25405],[8.07995,47.25246],[8.0769,47.25054],[8.06854,47.24284],[8.06325,47.24098],[8.05134,47.23865],[8.04857,47.23886],[8.03575,47.23747],[8.0322,47.23555],[8.02714,47.23534],[8.01139,47.23967],[8.00927,47.24116],[8.00791,47.24312],[8.00783,47.24821],[8.00857,47.25042],[8.0084,47.25769],[8.00712,47.25922],[8.00299,47.26162],[8.00052,47.26486],[7.99759,47.26789],[7.99627,47.27271],[7.99474,47.27369],[7.98993,47.27121],[7.97278,47.26907],[7.96857,47.27008],[7.96737,47.27098],[7.95861,47.27112],[7.9601,47.26748],[7.96274,47.26396],[7.96576,47.26171],[7.96699,47.25879],[7.96695,47.25001],[7.95963,47.24582],[7.95112,47.23918],[7.94469,47.236],[7.93733,47.23106],[7.93405,47.23051],[7.9298,47.23077],[7.9178,47.23305],[7.90784,47.23837],[7.89793,47.2377],[7.8695,47.23207],[7.85478,47.22719],[7.85137,47.22713],[7.83958,47.22947],[7.83584,47.22976],[7.83082,47.23259],[7.82707,47.23505],[7.82431,47.23831],[7.82129,47.24042],[7.82014,47.24264],[7.81822,47.24562],[7.81771,47.24917],[7.81822,47.25082],[7.81835,47.25371],[7.81988,47.25587],[7.82116,47.2568],[7.82112,47.25778],[7.8192,47.26058],[7.81912,47.26154],[7.81686,47.26486],[7.8175,47.26731],[7.81958,47.26982],[7.82439,47.27158],[7.82805,47.2721],[7.83592,47.27837],[7.83707,47.28342],[7.84005,47.2872],[7.84201,47.29067],[7.84588,47.29427],[7.84763,47.2982],[7.85137,47.30299],[7.8529,47.30741],[7.85571,47.31032],[7.86065,47.31254],[7.86422,47.31349],[7.87018,47.31672],[7.87631,47.31736],[7.88082,47.31716],[7.88337,47.31667],[7.88588,47.31941],[7.88886,47.32131],[7.88805,47.32443],[7.88907,47.3287],[7.8915,47.33262],[7.8978,47.34014],[7.9001,47.34156],[7.90005,47.3432],[7.90222,47.34557],[7.90635,47.34704],[7.90963,47.34735],[7.91359,47.34626],[7.91618,47.34456],[7.91699,47.34303],[7.92401,47.33899],[7.93839,47.33792],[7.94929,47.33784],[7.95431,47.33596],[7.95593,47.33317],[7.95691,47.32968],[7.95571,47.32535],[7.96993,47.32797],[7.97308,47.33017],[7.98333,47.33432],[7.98563,47.33692],[7.98954,47.33818],[7.99248,47.33827],[7.99784,47.34017],[7.99635,47.34257],[7.99601,47.34588],[7.99733,47.34859],[8.00116,47.35081],[8.00137,47.3569],[8.00261,47.3577],[8.00418,47.36044],[8.00976,47.36419],[8.01125,47.36598],[8.01746,47.36926],[8.01912,47.37157],[8.0198,47.37376],[8.02023,47.37598],[8.02172,47.37837],[8.02193,47.38093],[8.02282,47.38286],[8.02078,47.38857],[8.01606,47.38929],[8.01265,47.38897],[8.00772,47.39012],[8.00367,47.39205],[8.00163,47.39479],[8.00155,47.39998],[8.00023,47.40306],[7.99801,47.40453],[7.99261,47.40551],[7.98776,47.40637],[7.98418,47.40839],[7.98027,47.4081],[7.9732,47.41127],[7.96963,47.41383],[7.95695,47.41893],[7.95529,47.4218],[7.95593,47.42402],[7.95746,47.42621],[7.96274,47.42828],[7.97746,47.43254],[7.97567,47.43732],[7.97614,47.44138],[7.97431,47.44368],[7.95129,47.45111],[7.94861,47.4539],[7.94818,47.4566],[7.94678,47.45755],[7.94039,47.45669],[7.93588,47.45738],[7.93631,47.47625],[7.9318,47.47605],[7.92469,47.47717],[7.91571,47.47743],[7.90903,47.47947],[7.90316,47.47967],[7.90295,47.48965],[7.8969,47.4898],[7.8918,47.49405],[7.89086,47.49765],[7.8878,47.49931],[7.88631,47.5023],[7.87999,47.50397],[7.87403,47.50787],[7.86994,47.50944],[7.87006,47.51239],[7.86435,47.51245],[7.85851,47.51543],[7.8558,47.51854],[7.85625,47.52147],[7.8549,47.52474],[7.85183,47.5285],[7.84647,47.52714],[7.84148,47.52777],[7.8413,47.52406],[7.84015,47.51587],[7.83943,47.51259],[7.83688,47.51256],[7.83679,47.51049],[7.83352,47.50949],[7.83156,47.50765],[7.82981,47.50552],[7.82522,47.50354],[7.82049,47.5004],[7.81475,47.49491],[7.81181,47.49261],[7.80645,47.4914],[7.80403,47.49146],[7.80049,47.49014],[7.77977,47.49028],[7.77871,47.49304],[7.7796,47.496],[7.78386,47.5004],[7.78203,47.50368],[7.78088,47.5073],[7.78109,47.51018],[7.77977,47.51265],[7.77969,47.51529],[7.77045,47.51802],[7.75905,47.52003],[7.75266,47.52009],[7.74781,47.51957],[7.73368,47.52291],[7.72781,47.52719],[7.71985,47.52978],[7.71262,47.53095],[7.70764,47.5344],[7.70551,47.53917],[7.70696,47.54279],[7.71415,47.54627],[7.72245,47.54756],[7.749,47.54977],[7.75428,47.55339],[7.76654,47.55615],[7.77168,47.55761],[7.78007,47.55836],[7.78577,47.55982],[7.7902,47.5616],[7.79398,47.56634],[7.80492,47.57237],[7.80611,47.57989],[7.81173,47.58954],[7.81577,47.59218],[7.82211,47.59352],[7.83645,47.59163],[7.83952,47.59045],[7.84305,47.58778],[7.84875,47.58899],[7.85624,47.59189],[7.86488,47.59393],[7.87126,47.5943],[7.87726,47.59367],[7.88535,47.59424],[7.89343,47.59301],[7.90109,47.58976],[7.90833,47.58514],[7.91386,47.57923],[7.91867,47.57194],[7.91956,47.56772],[7.91875,47.56433],[7.9156,47.56008],[7.91577,47.55715],[7.91841,47.55405],[7.92126,47.55261],[7.92552,47.55227],[7.93471,47.55221],[7.9405,47.55078],[7.94326,47.54968],[7.94356,47.55052],[7.94458,47.55589],[7.94841,47.55979],[7.95394,47.56229],[7.96003,47.56333],[7.96577,47.56272],[7.97203,47.5612],[7.97833,47.56057],[7.98624,47.56094],[7.99718,47.56212],[8.0045,47.56137],[8.01114,47.55974],[8.01641,47.55701],[8.02046,47.55574],[8.0262,47.55741],[8.03799,47.55876],[8.04254,47.56028],[8.0485,47.56333],[8.05454,47.56798],[8.05931,47.56921],[8.0622,47.56895],[8.06693,47.57002],[8.07242,47.56973],[8.07739,47.56795],[8.08182,47.56436],[8.08522,47.56281],[8.08791,47.56298],[8.09259,47.56559],[8.09395,47.56809],[8.09484,47.57587],[8.09602,47.57882]]],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",zoomExtent:[8,19],polygon:[[[7.70438,47.55794],[7.77076,47.55772],[7.77103,47.58025],[7.80408,47.58017],[7.80433,47.60248],[7.93713,47.60217],[7.93703,47.57962],[8.00374,47.57917],[8.00338,47.55687],[8.0364,47.55665],[8.03681,47.57928],[8.10313,47.57881],[8.10387,47.60112],[8.17011,47.60086],[8.17036,47.6235],[8.30311,47.62235],[8.30305,47.59988],[8.3362,47.59927],[8.33585,47.5771],[8.36913,47.57694],[8.36943,47.59931],[8.43564,47.59877],[8.43454,47.53133],[8.40144,47.53162],[8.40096,47.50926],[8.3678,47.50959],[8.3675,47.48698],[8.40042,47.48666],[8.39939,47.41929],[8.46558,47.4187],[8.46515,47.39647],[8.43206,47.39654],[8.43125,47.3516],[8.46434,47.35128],[8.46327,47.28387],[8.42997,47.28421],[8.42714,47.12676],[8.3293,47.12753],[8.32937,47.13007],[8.32833,47.13007],[8.3285,47.14529],[8.3294,47.19502],[8.2964,47.19526],[8.29714,47.24022],[8.2641,47.24046],[8.26446,47.26297],[8.23141,47.26316],[8.23075,47.21822],[8.09886,47.21912],[8.09874,47.24135],[8.066,47.24176],[8.06552,47.2192],[7.99993,47.21952],[8.00003,47.26433],[7.96735,47.26462],[7.96675,47.21961],[7.80153,47.22029],[7.80244,47.28791],[7.83518,47.28772],[7.83543,47.31017],[7.86837,47.31017],[7.86885,47.35542],[8.00097,47.3543],[8.00156,47.39928],[7.9353,47.39976],[7.93607,47.46716],[7.90278,47.46729],[7.90303,47.48981],[7.86987,47.48998],[7.86993,47.5125],[7.83689,47.51258],[7.83665,47.4901],[7.77027,47.49026],[7.77045,47.51274],[7.70452,47.51307],[7.70438,47.55794]]],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",zoomExtent:[18,21],polygon:[[[7.37028,47.41368],[7.35758,47.41508],[7.35792,47.41827],[7.35354,47.41961],[7.34488,47.42402],[7.33973,47.42971],[7.33269,47.43024],[7.32685,47.43192],[7.32528,47.43489],[7.3305,47.44176],[7.33899,47.44109],[7.34496,47.43608],[7.35266,47.43436],[7.3812,47.43208],[7.37599,47.41431],[7.37815,47.414],[7.38204,47.41331],[7.38839,47.41398],[7.41371,47.41093],[7.42074,47.4111],[7.42748,47.41448],[7.43811,47.41274],[7.4484,47.41507],[7.45558,47.42792],[7.45062,47.43534],[7.43784,47.44632],[7.42542,47.44328],[7.4209,47.44594],[7.42242,47.45072],[7.4288,47.45388],[7.43003,47.45949],[7.44577,47.46197],[7.44717,47.45696],[7.45651,47.44926],[7.49236,47.45897],[7.53068,47.46119],[7.52745,47.47391],[7.53633,47.48383],[7.53623,47.49105],[7.5326,47.49097],[7.53179,47.4974],[7.52004,47.49678],[7.51223,47.49892],[7.50935,47.50888],[7.49908,47.51628],[7.49787,47.52125],[7.50228,47.51491],[7.51746,47.51728],[7.5222,47.51409],[7.53096,47.52905],[7.51935,47.53472],[7.51075,47.52899],[7.5023,47.5284],[7.49804,47.53615],[7.50545,47.54438],[7.51676,47.54541],[7.52732,47.55278],[7.55466,47.56437],[7.56458,47.55704],[7.56124,47.55172],[7.55875,47.55235],[7.55588,47.54434],[7.56479,47.54569],[7.58726,47.5419],[7.58269,47.53247],[7.58948,47.52792],[7.59025,47.51979],[7.59478,47.51929],[7.61378,47.53925],[7.6223,47.53977],[7.62285,47.55004],[7.61774,47.55437],[7.61762,47.55865],[7.63273,47.56149],[7.63997,47.55816],[7.649,47.5483],[7.66131,47.54483],[7.66586,47.53746],[7.67467,47.53375],[7.69494,47.5325],[7.71347,47.53978],[7.71596,47.53582],[7.72362,47.53675],[7.72716,47.53293],[7.73322,47.53275],[7.73797,47.52732],[7.74902,47.52498],[7.75786,47.52605],[7.78763,47.52012],[7.79014,47.51864],[7.78887,47.50683],[7.7928,47.50068],[7.78663,47.49312],[7.79889,47.49565],[7.79816,47.4994],[7.7994,47.49748],[7.80742,47.49714],[7.81471,47.5048],[7.83198,47.51474],[7.83321,47.53382],[7.84653,47.53266],[7.85233,47.53524],[7.86257,47.52692],[7.86396,47.51931],[7.87666,47.52269],[7.87567,47.51319],[7.89399,47.50606],[7.90477,47.49218],[7.90482,47.48491],[7.93329,47.48141],[7.94702,47.48489],[7.94003,47.46202],[7.94885,47.46378],[7.95761,47.45881],[7.95785,47.45128],[7.94678,47.44319],[7.95003,47.43172],[7.96183,47.42183],[7.95657,47.41968],[7.95504,47.41561],[7.94839,47.41627],[7.93493,47.41177],[7.93672,47.40806],[7.93266,47.40527],[7.90974,47.39852],[7.89022,47.40714],[7.88333,47.4061],[7.88344,47.4012],[7.8777,47.40126],[7.86914,47.39551],[7.87943,47.38799],[7.87881,47.38351],[7.86265,47.38198],[7.84012,47.37476],[7.83055,47.36512],[7.80217,47.3611],[7.79637,47.35347],[7.79356,47.33905],[7.78529,47.33788],[7.76896,47.33891],[7.76642,47.34273],[7.75152,47.34433],[7.73415,47.35776],[7.72791,47.36886],[7.70195,47.37245],[7.6442,47.36721],[7.64176,47.38047],[7.63558,47.38059],[7.63332,47.38291],[7.63331,47.38534],[7.63725,47.38607],[7.63272,47.41003],[7.66405,47.41002],[7.6798,47.41751],[7.68658,47.43366],[7.68297,47.43872],[7.68485,47.44784],[7.69227,47.45421],[7.69883,47.45586],[7.69993,47.46191],[7.70988,47.46938],[7.69976,47.48063],[7.66833,47.48635],[7.66612,47.49687],[7.65217,47.49581],[7.64865,47.49183],[7.65539,47.49021],[7.65051,47.48826],[7.65593,47.48739],[7.64442,47.48564],[7.64097,47.48273],[7.6073,47.4894],[7.60885,47.48353],[7.60563,47.47936],[7.60815,47.47521],[7.60449,47.47045],[7.61887,47.46745],[7.62607,47.46291],[7.62217,47.46195],[7.61646,47.44523],[7.6158,47.43275],[7.59207,47.43271],[7.58121,47.42878],[7.57842,47.43491],[7.5689,47.4369],[7.5683,47.42233],[7.58074,47.4147],[7.52524,47.41163],[7.53117,47.40353],[7.51862,47.38822],[7.5113,47.38974],[7.50226,47.38481],[7.49233,47.38523],[7.47841,47.39056],[7.47747,47.40128],[7.46448,47.40251],[7.46092,47.40068],[7.45002,47.40393],[7.44951,47.39976],[7.4434,47.40231],[7.44131,47.40018],[7.44357,47.3889],[7.43732,47.38089],[7.41169,47.38057],[7.41628,47.38479],[7.41449,47.3943],[7.39894,47.39684],[7.39592,47.40338],[7.38869,47.40302],[7.38405,47.41236],[7.37968,47.41281],[7.37584,47.41401],[7.37028,47.41368]]],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",zoomExtent:[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",zoomExtent:[8,21],polygon:[[[7.67138,47.59522],[7.67996,47.60078],[7.68451,47.60182],[7.69438,47.60171],[7.69395,47.59667],[7.68708,47.59355],[7.67884,47.58712],[7.68571,47.58538],[7.68906,47.57612],[7.69412,47.5734],[7.6924,47.56691],[7.6847,47.5617],[7.66425,47.56164],[7.64872,47.55689],[7.63035,47.55869],[7.62357,47.55666],[7.62786,47.55145],[7.62738,47.53658],[7.61833,47.53662],[7.61335,47.53262],[7.59962,47.51911],[7.58503,47.51917],[7.58409,47.52636],[7.57713,47.53163],[7.58125,47.53986],[7.5719,47.54148],[7.55387,47.54148],[7.55379,47.55122],[7.55653,47.55828],[7.5537,47.56031],[7.55379,47.57473],[7.56434,47.58122],[7.57936,47.57988],[7.58331,47.59019],[7.58563,47.59233],[7.59207,47.59239],[7.59851,47.59071],[7.60915,47.58643],[7.60923,47.5811],[7.6191,47.58046],[7.63687,47.59314],[7.63782,47.59557],[7.64168,47.59887],[7.64528,47.60026],[7.66494,47.59618],[7.67138,47.59522]]],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",zoomExtent:[15,19],polygon:[[[7.95595,47.47162],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39022],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.94122,47.30978],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84832,47.27416],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24777],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.6499,47.22083],[7.66308,47.22073],[7.6631,47.21178],[7.66297,47.20273],[7.67617,47.2027],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53095,47.13097],[7.51767,47.13097],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47813,47.07705],[7.46493,47.07708],[7.46498,47.06807],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.3727,47.15796],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.20287],[7.33307,47.2029],[7.33307,47.22096],[7.34614,47.22096],[7.34614,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.5046,47.29288],[7.50473,47.30183],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.3988,47.36484],[7.39889,47.39182],[7.38564,47.39181],[7.38564,47.4008],[7.37234,47.4008],[7.37234,47.40978],[7.34584,47.40978],[7.34584,47.41878],[7.31925,47.41878],[7.31925,47.44578],[7.4121,47.44578],[7.4121,47.49078],[7.42535,47.49078],[7.42535,47.49981],[7.43856,47.49981],[7.43856,47.50876],[7.49177,47.50876],[7.49178,47.63468],[7.7845,47.63428],[7.78415,47.57123],[7.81074,47.57114],[7.81074,47.56216],[7.82395,47.56206],[7.82387,47.54414],[7.86368,47.54397],[7.86363,47.53498],[7.87679,47.53495],[7.87675,47.52599],[7.8901,47.52596],[7.89006,47.51695],[7.90319,47.51692],[7.9031,47.49886],[7.91649,47.49883],[7.91645,47.48976],[7.95612,47.48967],[7.95595,47.47162]]],terms_text:"Orthofoto WMS Solothurn",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{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",zoomExtent:[15,19],polygon:[[[7.57042,47.15792],[7.55736,47.15795],[7.55732,47.14888],[7.54421,47.14895],[7.54417,47.13991],[7.53098,47.13991],[7.53093,47.12196],[7.51765,47.12196],[7.51769,47.11292],[7.49131,47.11301],[7.49135,47.10403],[7.4782,47.104],[7.47816,47.09496],[7.49144,47.09499],[7.4914,47.07702],[7.47816,47.07705],[7.4782,47.06804],[7.42552,47.06801],[7.42543,47.08601],[7.37279,47.08598],[7.37288,47.10403],[7.3596,47.10403],[7.35955,47.131],[7.41228,47.131],[7.41223,47.14901],[7.42538,47.14901],[7.42552,47.15801],[7.39913,47.15804],[7.39913,47.14901],[7.3727,47.14898],[7.3727,47.18498],[7.34627,47.18492],[7.34636,47.19391],[7.33307,47.19394],[7.33307,47.22991],[7.37256,47.22991],[7.3727,47.2389],[7.399,47.23896],[7.39913,47.24792],[7.41228,47.24792],[7.41228,47.26592],[7.45186,47.26589],[7.45195,47.2749],[7.46505,47.27493],[7.4651,47.28385],[7.47829,47.28385],[7.47834,47.29293],[7.49149,47.29289],[7.49162,47.30184],[7.5312,47.30181],[7.53129,47.31979],[7.54448,47.31985],[7.54453,47.3288],[7.55768,47.32883],[7.55768,47.33786],[7.53125,47.33786],[7.53133,47.35586],[7.51801,47.35583],[7.5181,47.36483],[7.43862,47.36492],[7.43867,47.37389],[7.42538,47.37395],[7.42543,47.40081],[7.38558,47.4009],[7.38567,47.4098],[7.35915,47.4098],[7.35915,47.41878],[7.37239,47.41884],[7.37247,47.43682],[7.38571,47.43682],[7.38571,47.44104],[7.39563,47.44016],[7.3963,47.44258],[7.40761,47.4411],[7.40793,47.44225],[7.40313,47.44246],[7.39738,47.44331],[7.39832,47.44583],[7.41214,47.44583],[7.41228,47.45478],[7.43867,47.45488],[7.4388,47.47053],[7.45007,47.46941],[7.45007,47.47223],[7.44647,47.47223],[7.44647,47.47381],[7.44293,47.4739],[7.44288,47.47553],[7.43921,47.4756],[7.43921,47.4772],[7.43557,47.47729],[7.43548,47.47899],[7.4174,47.47896],[7.41744,47.48573],[7.42099,47.48573],[7.42108,47.49082],[7.42763,47.49073],[7.42852,47.49349],[7.43099,47.49643],[7.43485,47.49889],[7.4419,47.49552],[7.44665,47.49455],[7.45011,47.49176],[7.45087,47.4907],[7.46451,47.49073],[7.46456,47.48903],[7.46819,47.489],[7.46819,47.48566],[7.47187,47.48573],[7.47192,47.48233],[7.48269,47.48239],[7.48264,47.48388],[7.48623,47.48397],[7.48637,47.48566],[7.48991,47.48566],[7.49,47.4907],[7.4997,47.49073],[7.49965,47.4914],[7.49175,47.49194],[7.49175,47.49513],[7.49822,47.49479],[7.49889,47.49585],[7.49566,47.49628],[7.49171,47.49625],[7.4918,47.49973],[7.50504,47.4997],[7.50504,47.50874],[7.5448,47.50871],[7.54474,47.45482],[7.49169,47.45469],[7.49175,47.44581],[7.46529,47.44577],[7.46522,47.40983],[7.49156,47.40979],[7.49175,47.39192],[7.50489,47.39183],[7.50489,47.40068],[7.51821,47.40077],[7.51834,47.41876],[7.55794,47.41872],[7.55813,47.44581],[7.58453,47.44572],[7.58441,47.43667],[7.61094,47.43662],[7.611,47.4637],[7.59767,47.4637],[7.59793,47.49964],[7.62433,47.49969],[7.62445,47.4906],[7.63778,47.49055],[7.63784,47.4996],[7.67757,47.49947],[7.67745,47.49047],[7.70385,47.49043],[7.70391,47.48146],[7.71711,47.48129],[7.71711,47.45452],[7.70397,47.45452],[7.70385,47.44559],[7.69046,47.44551],[7.69033,47.40957],[7.67713,47.40949],[7.67713,47.40068],[7.65066,47.40068],[7.65047,47.37365],[7.67706,47.37357],[7.67706,47.38251],[7.71667,47.38251],[7.71679,47.37344],[7.74307,47.3734],[7.74307,47.35538],[7.7562,47.35534],[7.75633,47.3464],[7.78261,47.34627],[7.78292,47.36433],[7.79612,47.36428],[7.79619,47.37327],[7.82265,47.37314],[7.82271,47.38229],[7.84912,47.38212],[7.84924,47.39106],[7.86251,47.39097],[7.86263,47.40906],[7.8759,47.40897],[7.87602,47.41803],[7.90242,47.41795],[7.90242,47.40897],[7.92889,47.4088],[7.92914,47.41782],[7.94215,47.41769],[7.94266,47.46276],[7.95592,47.46259],[7.95612,47.47164],[7.98239,47.47155],[7.98239,47.45353],[7.99553,47.45353],[7.99521,47.41747],[8.0218,47.41743],[8.02155,47.39935],[8.03456,47.39926],[8.03468,47.39028],[8.04788,47.39015],[8.04769,47.37224],[8.03456,47.37232],[8.03437,47.3544],[8.02117,47.35427],[8.02072,47.32739],[7.99445,47.32747],[7.99426,47.31857],[7.96773,47.31866],[7.96767,47.30966],[7.9412,47.30992],[7.94133,47.32778],[7.91486,47.32786],[7.91467,47.30988],[7.9016,47.31005],[7.9014,47.30097],[7.87501,47.3011],[7.87501,47.29223],[7.86165,47.29212],[7.86154,47.27409],[7.84843,47.27415],[7.8483,47.26523],[7.83502,47.2652],[7.83502,47.25624],[7.79535,47.25636],[7.7953,47.24741],[7.72924,47.24756],[7.72929,47.25652],[7.71623,47.25667],[7.71618,47.26559],[7.70304,47.26559],[7.70304,47.27461],[7.68975,47.27467],[7.68989,47.28368],[7.66341,47.28371],[7.66332,47.2747],[7.61055,47.27476],[7.61041,47.24787],[7.62352,47.24765],[7.62356,47.23879],[7.64986,47.23876],[7.64999,47.22977],[7.66305,47.22971],[7.6631,47.21178],[7.67621,47.21169],[7.67623,47.19372],[7.68938,47.19369],[7.68924,47.17572],[7.70243,47.1756],[7.70248,47.16663],[7.71567,47.16663],[7.71558,47.15769],[7.70239,47.15766],[7.70234,47.14869],[7.66267,47.14881],[7.66281,47.13978],[7.63633,47.1399],[7.63647,47.14869],[7.5968,47.14893],[7.59684,47.13996],[7.57041,47.13999],[7.57042,47.15792]]],terms_text:"Orthofoto WMS Solothurn",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/ch/KantonSolothurn-SOGIS-wms.png"},{id:"KTTHURGAU2017",name:"Kanton Thurgau OF 2017",type:"tms",template:"https://mapproxy.osm.ch/tiles/KTTHURGAU2017/EPSG900913/{zoom}/{x}/{y}.png?origin=nw",zoomExtent:[8,21],polygon:[[[8.63768,47.70041],[8.78328,47.6988],[8.78304,47.68533],[8.87027,47.68427],[8.86997,47.6709],[8.89901,47.67047],[8.89867,47.65698],[8.9277,47.65661],[8.92828,47.67015],[8.95726,47.66973],[8.95774,47.68327],[9.19061,47.67994],[9.19027,47.66645],[9.21922,47.66603],[9.21899,47.65256],[9.24784,47.6521],[9.24747,47.63864],[9.3057,47.63765],[9.30526,47.6242],[9.33417,47.62371],[9.33348,47.59674],[9.39151,47.59577],[9.39114,47.58235],[9.42007,47.58176],[9.4186,47.54139],[9.44754,47.54084],[9.44717,47.5273],[9.47605,47.52681],[9.47519,47.49986],[9.50414,47.49935],[9.5031,47.47242],[9.41596,47.47392],[9.41554,47.46045],[9.3576,47.46141],[9.35818,47.47498],[9.32896,47.47534],[9.32864,47.46188],[9.18361,47.4642],[9.18411,47.47769],[9.15492,47.4781],[9.15466,47.46463],[9.06736,47.46583],[9.06718,47.45234],[9.09609,47.45193],[9.09582,47.43853],[9.06663,47.43883],[9.06642,47.42537],[9.00829,47.4262],[9.00714,47.38573],[8.97811,47.38616],[8.9774,47.35913],[8.9194,47.35989],[8.92032,47.38697],[8.89136,47.38725],[8.89286,47.44117],[8.86398,47.44149],[8.86604,47.52251],[8.80784,47.52317],[8.80894,47.56373],[8.77985,47.56403],[8.78024,47.57751],[8.72209,47.57814],[8.72337,47.63213],[8.6652,47.63273],[8.6658,47.6598],[8.63674,47.66],[8.63768,47.70041]]],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",zoomExtent:[8,21],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Kanton Zürich Orthophotos 2014/2015",best:true},{id:"Kanton-Zuerich-2015",name:"Kanton Zürich Orthophotos 2014/2015 10cm",type:"wms",template:"https://wms.zh.ch/OrthoZHWMS?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=orthophotos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[8,21],polygon:[[[8.71338,47.21388],[8.7137,47.22737],[8.8117,47.22626],[8.80337,47.23858],[8.80866,47.2431],[8.82448,47.24656],[8.82971,47.24539],[8.83652,47.24257],[8.84568,47.24253],[8.84837,47.24322],[8.85232,47.24034],[8.86206,47.23882],[8.86472,47.23966],[8.86863,47.23968],[8.87339,47.24125],[8.87882,47.24476],[8.88054,47.24791],[8.89878,47.24976],[8.90281,47.25094],[8.91025,47.25003],[8.92735,47.25406],[8.93644,47.25499],[8.94233,47.25849],[8.94423,47.26173],[8.94882,47.26536],[8.95094,47.2686],[8.95068,47.27108],[8.953,47.27285],[8.95411,47.27505],[8.95504,47.28251],[8.95171,47.28527],[8.94664,47.28647],[8.95258,47.28844],[8.95454,47.28982],[8.96141,47.30098],[8.97552,47.30245],[8.98006,47.30416],[8.99153,47.31893],[8.99069,47.32183],[8.98637,47.32542],[8.98548,47.32778],[8.98364,47.32931],[8.98592,47.33815],[8.98464,47.34061],[8.98079,47.34237],[8.98088,47.34835],[8.97785,47.35437],[8.9759,47.35606],[8.97002,47.35843],[8.96572,47.3589],[8.96238,47.36252],[8.95665,47.37432],[8.9521,47.37836],[8.94778,47.37971],[8.95023,47.38346],[8.95018,47.38596],[8.9488,47.38836],[8.9397,47.39403],[8.93637,47.39496],[8.93251,47.39871],[8.92801,47.40148],[8.92278,47.4038],[8.91388,47.40569],[8.91924,47.41213],[8.92049,47.41915],[8.91829,47.42323],[8.92094,47.42544],[8.92107,47.42828],[8.92571,47.42695],[8.93437,47.42796],[8.93877,47.43173],[8.93974,47.43411],[8.93889,47.43725],[8.93511,47.43973],[8.92349,47.43953],[8.91973,47.44081],[8.91322,47.44119],[8.91162,47.44347],[8.91527,47.44628],[8.91499,47.45004],[8.91196,47.45378],[8.90517,47.45791],[8.90183,47.46435],[8.89735,47.46898],[8.89581,47.47219],[8.89135,47.4738],[8.89143,47.47821],[8.90142,47.48133],[8.90428,47.48449],[8.90314,47.48928],[8.90001,47.49187],[8.89967,47.49885],[8.90357,47.50404],[8.90413,47.50745],[8.90322,47.51948],[8.90497,47.52447],[8.90365,47.52691],[8.89982,47.52965],[8.88423,47.53392],[8.87883,47.53277],[8.87061,47.53477],[8.8602,47.53488],[8.85674,47.53594],[8.84782,47.5358],[8.84614,47.54087],[8.8403,47.54654],[8.83728,47.55278],[8.84275,47.5537],[8.84648,47.5562],[8.85269,47.55645],[8.8562,47.55792],[8.85775,47.56141],[8.85728,47.56489],[8.85511,47.56721],[8.85079,47.56818],[8.84763,47.57023],[8.84538,47.57061],[8.8448,47.57309],[8.84211,47.57513],[8.83326,47.57769],[8.82962,47.57778],[8.82661,47.57662],[8.82137,47.57756],[8.81432,47.57598],[8.81234,47.5778],[8.81222,47.58473],[8.81067,47.58639],[8.80812,47.58738],[8.76818,47.59674],[8.7543,47.59729],[8.75529,47.60108],[8.75416,47.60273],[8.74883,47.60588],[8.74829,47.60874],[8.7507,47.60981],[8.75255,47.61292],[8.75575,47.61217],[8.76102,47.61335],[8.78169,47.60634],[8.78165,47.60345],[8.78467,47.59993],[8.80168,47.5966],[8.80512,47.59686],[8.80895,47.59938],[8.81074,47.60981],[8.81866,47.61372],[8.82001,47.61526],[8.82089,47.62058],[8.82015,47.62415],[8.82415,47.6256],[8.83079,47.63206],[8.83448,47.64099],[8.83182,47.64945],[8.82695,47.65206],[8.81168,47.65599],[8.81112,47.6621],[8.81192,47.66454],[8.81041,47.66752],[8.80881,47.66857],[8.80293,47.66978],[8.79299,47.66919],[8.78685,47.66978],[8.78453,47.66899],[8.78216,47.66659],[8.77921,47.65695],[8.77763,47.65563],[8.77398,47.65435],[8.76623,47.65438],[8.76108,47.65257],[8.75852,47.65033],[8.75464,47.64883],[8.7534,47.64733],[8.74839,47.64613],[8.74329,47.64749],[8.73882,47.64651],[8.72376,47.64753],[8.72063,47.64664],[8.71492,47.64885],[8.70826,47.64764],[8.70481,47.65039],[8.70053,47.65199],[8.69427,47.65307],[8.69242,47.65581],[8.68632,47.66094],[8.68485,47.66413],[8.68574,47.66799],[8.68326,47.67315],[8.68056,47.67561],[8.67521,47.6776],[8.67642,47.68177],[8.67561,47.68661],[8.67427,47.68799],[8.67227,47.68891],[8.66273,47.69029],[8.64644,47.69847],[8.63968,47.69877],[8.6355,47.69743],[8.62162,47.69554],[8.61818,47.69279],[8.61744,47.69087],[8.62007,47.68134],[8.61478,47.68308],[8.60917,47.68188],[8.60199,47.67451],[8.59954,47.66923],[8.60275,47.66132],[8.60979,47.6568],[8.6141,47.6564],[8.61574,47.65557],[8.62231,47.65104],[8.62227,47.65024],[8.62048,47.64758],[8.61939,47.65043],[8.61521,47.65452],[8.6093,47.65677],[8.60324,47.65654],[8.60069,47.65541],[8.59788,47.65276],[8.59645,47.64876],[8.59092,47.64623],[8.58937,47.6444],[8.58874,47.63936],[8.59116,47.62755],[8.59325,47.62233],[8.59838,47.61587],[8.59854,47.6145],[8.59114,47.60917],[8.58937,47.60682],[8.58796,47.60319],[8.58788,47.59909],[8.58203,47.59793],[8.57398,47.59329],[8.57146,47.58988],[8.57035,47.58633],[8.57203,47.57985],[8.56771,47.57799],[8.56506,47.57524],[8.56117,47.56407],[8.55707,47.55947],[8.55616,47.56336],[8.55206,47.56904],[8.55334,47.57146],[8.5526,47.57599],[8.55007,47.57806],[8.54666,47.57923],[8.5435,47.58228],[8.54319,47.5851],[8.54888,47.5879],[8.55175,47.58777],[8.55764,47.58963],[8.56114,47.59151],[8.56265,47.5946],[8.56668,47.59565],[8.56902,47.59748],[8.56953,47.60049],[8.57237,47.60386],[8.57308,47.60641],[8.57562,47.60676],[8.579,47.60845],[8.58076,47.61031],[8.58125,47.61203],[8.58025,47.61456],[8.57712,47.61636],[8.57525,47.61957],[8.57277,47.6211],[8.56785,47.62164],[8.56341,47.62697],[8.56105,47.62838],[8.54803,47.62998],[8.54558,47.63122],[8.54498,47.63297],[8.54288,47.63458],[8.53995,47.63565],[8.52769,47.63634],[8.52112,47.63887],[8.51478,47.6385],[8.50932,47.63559],[8.50829,47.62942],[8.50161,47.62597],[8.5007,47.62421],[8.50149,47.62154],[8.49253,47.61893],[8.48884,47.61953],[8.47669,47.61937],[8.47439,47.61838],[8.47154,47.61495],[8.47129,47.61307],[8.46785,47.61272],[8.46446,47.61109],[8.46173,47.60659],[8.45519,47.60676],[8.45061,47.60411],[8.4499,47.60164],[8.4507,47.59584],[8.45382,47.59343],[8.45428,47.5866],[8.4563,47.5848],[8.46014,47.58382],[8.46332,47.58044],[8.46881,47.5795],[8.46219,47.57653],[8.45419,47.57668],[8.43642,47.57154],[8.43161,47.57102],[8.42476,47.57231],[8.41477,47.56879],[8.41304,47.56745],[8.41034,47.56194],[8.41039,47.55972],[8.40789,47.55465],[8.40846,47.55018],[8.39964,47.54444],[8.39609,47.543],[8.39469,47.54094],[8.39495,47.53674],[8.39136,47.53568],[8.38835,47.53305],[8.38525,47.53316],[8.38113,47.53219],[8.3774,47.52969],[8.37518,47.52679],[8.37279,47.51651],[8.36579,47.51663],[8.35666,47.51348],[8.35439,47.51104],[8.35103,47.50314],[8.3524,47.49957],[8.35163,47.4973],[8.35274,47.49484],[8.3545,47.49355],[8.3557,47.48979],[8.35533,47.48525],[8.35698,47.47931],[8.35891,47.47743],[8.36187,47.47645],[8.36722,47.47654],[8.36702,47.47487],[8.36073,47.47222],[8.35903,47.46604],[8.35996,47.46381],[8.36326,47.46204],[8.3673,47.45653],[8.36975,47.45504],[8.37393,47.45472],[8.37754,47.45201],[8.37583,47.45068],[8.37441,47.44614],[8.37623,47.43818],[8.37168,47.43675],[8.36855,47.43406],[8.3681,47.43158],[8.36904,47.42863],[8.37222,47.42603],[8.38283,47.42346],[8.38371,47.42251],[8.38073,47.42207],[8.37555,47.4178],[8.37598,47.41378],[8.37441,47.40906],[8.36067,47.40664],[8.35789,47.40542],[8.35629,47.40377],[8.35661,47.39961],[8.36195,47.39516],[8.36577,47.39429],[8.37601,47.3947],[8.37743,47.39218],[8.38036,47.39048],[8.38761,47.39035],[8.38832,47.38012],[8.39034,47.37527],[8.39355,47.3719],[8.39387,47.36945],[8.39574,47.3671],[8.39902,47.36608],[8.39836,47.36408],[8.40012,47.36094],[8.40103,47.35433],[8.39728,47.34677],[8.39779,47.34475],[8.40186,47.3391],[8.40931,47.33409],[8.4061,47.32975],[8.40578,47.32667],[8.40689,47.32447],[8.41295,47.3205],[8.41611,47.31996],[8.42948,47.32227],[8.43556,47.32083],[8.43437,47.31954],[8.43155,47.31851],[8.42609,47.31375],[8.42276,47.30706],[8.42311,47.30368],[8.41745,47.3015],[8.41372,47.29824],[8.40012,47.29564],[8.39768,47.29392],[8.39518,47.29516],[8.39108,47.29552],[8.38602,47.29437],[8.38272,47.29225],[8.38198,47.29034],[8.38255,47.2881],[8.38508,47.28565],[8.38977,47.27507],[8.39563,47.271],[8.39407,47.26672],[8.39415,47.26361],[8.39756,47.25986],[8.39614,47.25481],[8.39742,47.25189],[8.40647,47.24452],[8.40826,47.24118],[8.40761,47.23957],[8.4096,47.23585],[8.41073,47.22799],[8.41248,47.22433],[8.41695,47.22014],[8.41959,47.21902],[8.42269,47.21886],[8.42977,47.22],[8.43936,47.21937],[8.45,47.21363],[8.4546,47.21334],[8.45625,47.21081],[8.4591,47.20934],[8.46447,47.20928],[8.46609,47.20862],[8.46868,47.20533],[8.47329,47.20398],[8.47693,47.20458],[8.48399,47.20392],[8.49489,47.20738],[8.504,47.20768],[8.51538,47.21152],[8.51753,47.21271],[8.51906,47.21495],[8.5306,47.21306],[8.53307,47.21325],[8.5415,47.21778],[8.54456,47.21707],[8.55407,47.21726],[8.55858,47.21517],[8.56984,47.2139],[8.57491,47.21255],[8.57749,47.20771],[8.58044,47.2064],[8.58408,47.20603],[8.59012,47.20714],[8.58965,47.2046],[8.59074,47.20195],[8.59358,47.1986],[8.59581,47.19753],[8.60168,47.19722],[8.60653,47.1992],[8.60725,47.19885],[8.61097,47.19387],[8.61128,47.19059],[8.61391,47.18838],[8.61522,47.18515],[8.61938,47.18045],[8.61976,47.17918],[8.61721,47.17359],[8.6196,47.1698],[8.62292,47.16821],[8.6339,47.16715],[8.63561,47.16578],[8.63965,47.16459],[8.64287,47.16443],[8.65216,47.16598],[8.65425,47.16552],[8.6549,47.15967],[8.65649,47.15783],[8.65882,47.15658],[8.66853,47.15492],[8.67847,47.15558],[8.68241,47.15759],[8.69361,47.15898],[8.69804,47.16134],[8.69886,47.16303],[8.6977,47.17033],[8.69599,47.17232],[8.68919,47.17566],[8.6872,47.17959],[8.6879,47.18229],[8.69186,47.18485],[8.69824,47.19205],[8.70323,47.19326],[8.70852,47.19602],[8.71423,47.19693],[8.71692,47.19893],[8.74212,47.2071],[8.74218,47.21355],[8.71338,47.21388]]],terms_text:"Kanton Zürich Orthophotos 2014/2015",best:true},{id:"kartverket-abas",name:"Kartverket Administrative Boundaries overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.adm_enheter?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=avtaltavgrensningslinje,territorialgrense,riksgrense,fylker,kommuner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/data/Kartdata/Grenser/",terms_text:"© Kartverket",description:"Official administrative boundaries at the national, county and municipality levels",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-luftfartshindre",name:"Kartverket Aviation Obstructions overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.nrl?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=nrl3_wms&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[7,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartverket.no/kart/Nasjonalt-register-over-luftfartshindre/",terms_text:"© Kartverket",description:"Vertical obstructions to aircrafts, above 15m in rural areas and 30m in urban areas (e.g. masts, towers, high buildings, power lines)",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-matrikkel",name:"Kartverket Cadastral overlay",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.matrikkel?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=matrikkel_WMS&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[14,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.seeiendom.no/",terms_text:"© Kartverket",description:"Real estate boundaries from the official land register (`matrikkelen´). Monthly update.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-hoydekurver",name:"Kartverket Contour Lines overlay",type:"wms",template:"https://openwms.statkart.no/skwms1/wms.topo4?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=hoydetall5linje,hoydetall5punkt,hoydepunkt,vannpunkt,hoydekurver_1m,hoydekurver_5m,N50Hoydekurver,N250Hoydekurver,N500Hoydekurver,N1000Hoydekurver,N2000Hoydekurver&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[9,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/Prosjekter/Nasjonal-detaljert-hoydemodell/",terms_text:"© Kartverket",description:"Contours for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-dom-skygge",name:"Kartverket DOM Digital Surface Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dom_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dom_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital surface model (DOM), i.e. earth surface including trees, buildings and other objects on top of it.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-dtm-skygge",name:"Kartverket DTM Digital Terrain Model",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.hoyde-dtm_somlos_skyggerelieff?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=las_dtm_skyggerelieff_somlos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://hoydedata.no/",terms_text:"© Kartverket",description:"Shaded relief representation of the Norwegian digital terrain model (DTM), i.e. earth surface without trees, buildings and other objects.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{id:"kartverket-ok-1st",name:"Kartverket Economic Maps (historic)",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.n5raster2?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=n5raster_foerstegang_metadata,n5raster_foerstegang&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[11,20],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kunnskap/historie/kartverkets-historiske-arkiv/",terms_text:"© Kartverket",description:"1st edition of historic Economic maps for Norway 1960-90s (`Økonomisk kartverk´). Available from zoom 16. Please correct local imagery offset.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{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",zoomExtent:[6,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],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-fjellskygge",name:"Kartverket Hillshade overlay",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=fjellskygge&zoom={zoom}&x={x}&y={y}",zoomExtent:[9,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kartkatalog.geonorge.no/metadata/kartverket/fjellskygge-cache/cca7c129-fe66-4c96-9091-40d92290dd81",terms_text:"© Kartverket",description:"Hillshade for Norway",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png",overlay:true},{id:"kartverket-historic",name:"Kartverket Historic maps",type:"wms",template:"https://wms.geonorge.no/skwms1/wms.historiskekart?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=amt1&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,15],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.kartverket.no/kart/historiske-kart/",terms_text:"© Kartverket",description:"Historic maps - for the time being `Amtskartserien´ 1826-1917.",icon:"https://www.kartverket.no/Content/Images/logo-graphic-512.png"},{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}",zoomExtent:[3,15],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],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-sjokart",name:"Kartverket Nautical Charts",type:"tms",template:"https://opencache{switch:,2,3}.statkart.no/gatekeeper/gk/gk.open_gmaps?layers=sjokartraster&zoom={zoom}&x={x}&y={y}",zoomExtent:[3,20],polygon:[[[-15.01273,-60.16205],[33.3326,-60.17016],[33.32144,-73.0009],[-15.0239,-72.99613],[-15.01273,-60.16205]],[[-173.00076,-70.54952],[-125.00321,-70.54878],[-125.00167,-78.99977],[-172.99922,-79.0002],[-173.00076,-70.54952]],[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"https://www.kartverket.no/Kart/Sjokart/",terms_text:"© Kartverket",description:"Norwegian nautical charts (includes Spitsbergen/Svalbard and Antarctica). Raster representation of paper charts. Updated biweekly.",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",zoomExtent:[3,24],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],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:"Katowice-buildings",name:"Katowice: Buildings",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=4,5,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{id:"Katowice-aerial_image",name:"Katowice: Orthophotomap (aerial image)",type:"wms",template:"http://mapserver.um.katowice.pl/services/ortowms/MapServer/WMSServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=2&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.90884,50.24006],[18.90851,50.23542],[18.94279,50.23515],[18.94399,50.27138],[18.95469,50.27485],[18.95571,50.2894],[18.96692,50.29364],[18.98752,50.2848],[18.99888,50.2847],[18.99907,50.29368],[18.98892,50.29377],[18.98934,50.30244],[19.0094,50.30196],[19.03401,50.28842],[19.05533,50.30139],[19.07901,50.30087],[19.07908,50.29297],[19.12296,50.27784],[19.12267,50.25523],[19.11079,50.2428],[19.1098,50.17946],[19.12065,50.17936],[19.11957,50.14359],[19.10777,50.14386],[19.0973,50.13916],[19.09656,50.12786],[19.06379,50.12786],[19.02985,50.14009],[19.03007,50.16177],[19.01909,50.16698],[19.00848,50.16707],[18.96329,50.1498],[18.92907,50.15008],[18.92915,50.15426],[18.91854,50.15419],[18.91878,50.20421],[18.90792,50.20429],[18.90808,50.21297],[18.88588,50.21314],[18.88639,50.24024],[18.90884,50.24006]]],terms_text:"Urząd Miasta Katowic"},{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",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],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",zoomExtent:[9,20],polygon:[[[-119.58673,49.79281],[-119.54657,49.79281],[-119.54657,49.80138],[-119.53434,49.80138],[-119.53434,49.80473],[-119.52962,49.80473],[-119.52962,49.81196],[-119.51045,49.81196],[-119.51157,49.87443],[-119.51089,49.87449],[-119.51141,49.88433],[-119.51141,49.92218],[-119.49386,49.92235],[-119.49405,49.9313],[-119.48039,49.93175],[-119.48046,49.94075],[-119.46667,49.94099],[-119.46928,49.99137],[-119.45513,49.99161],[-119.45567,50.01212],[-119.44167,50.01239],[-119.44173,50.01363],[-119.42215,50.01404],[-119.4221,50.01193],[-119.41213,50.01217],[-119.41261,50.02169],[-119.41234,50.02169],[-119.41248,50.02508],[-119.41209,50.02508],[-119.4122,50.02708],[-119.41261,50.02707],[-119.41283,50.03219],[-119.39363,50.03264],[-119.39353,50.03078],[-119.37957,50.03101],[-119.37954,50.02876],[-119.37358,50.02886],[-119.37154,49.97936],[-119.35735,49.97936],[-119.35484,49.92561],[-119.32681,49.92572],[-119.32566,49.88041],[-119.31389,49.88065],[-119.31371,49.87717],[-119.31322,49.87722],[-119.31315,49.87497],[-119.31245,49.87491],[-119.31223,49.87236],[-119.31176,49.87233],[-119.3116,49.86961],[-119.31122,49.86942],[-119.31092,49.86324],[-119.31037,49.86327],[-119.30951,49.85124],[-119.31064,49.85123],[-119.31039,49.84626],[-119.32453,49.846],[-119.3246,49.84507],[-119.3367,49.84488],[-119.33675,49.84351],[-119.33794,49.84347],[-119.3378,49.83821],[-119.33836,49.8381],[-119.33837,49.83512],[-119.33909,49.83511],[-119.3388,49.83212],[-119.33915,49.83206],[-119.33917,49.82933],[-119.33946,49.82933],[-119.33959,49.82679],[-119.35001,49.82658],[-119.34937,49.81806],[-119.4047,49.81638],[-119.40457,49.8099],[-119.41016,49.8099],[-119.41029,49.80728],[-119.43195,49.80691],[-119.43226,49.7908],[-119.44598,49.79055],[-119.44529,49.78202],[-119.49674,49.78116],[-119.49661,49.77849],[-119.54184,49.77751],[-119.54159,49.77183],[-119.55603,49.77149],[-119.55612,49.77184],[-119.57157,49.77151],[-119.57162,49.77173],[-119.58192,49.77149],[-119.58201,49.77177],[-119.5923,49.77152],[-119.59234,49.77181],[-119.60038,49.7716],[-119.60119,49.78391],[-119.58644,49.78439],[-119.58673,49.79281]]],overlay:true},{id:"kystverket-navigasjon",name:"Kystverket Navigational Aid overlay",type:"wms",template:"https://nfs.kystverket.no/arcgis/services/nfs/NFSSistOperativ/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=17,16,15,14,12,10,9,8,7,4&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[12,19],polygon:[[[3.24857,56.08599],[2.60924,56.59428],[1.47215,58.45924],[1.77704,61.36251],[-0.49301,63.88665],[-13.73292,69.76376],[-12.43655,72.58741],[-5.11965,74.39626],[-3.60356,79.12998],[5.85587,82.34863],[34.98861,82.3401],[37.96874,78.62784],[37.99619,75.79673],[36.95796,73.68962],[32.07458,70.27336],[30.3511,69.56882],[21.46179,69.57098],[18.3032,68.36681],[14.47997,66.2558],[11.50266,63.28307],[11.50166,58.95444],[11.08246,58.96771],[10.03051,58.25173],[8.88244,57.69534],[3.24857,56.08599]]],terms_url:"http://kystverket.no/Maritim-infrastruktur/Fyr-og-merker-/",terms_text:"© Kystverket",description:"Beacons, buoys, lights and fairways maintained by the Norwegian Coastal Administration",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/6/68/Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg/143px-Coat_of_arms_of_the_Norwegian_Coastal_Administration.svg.png",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",zoomExtent:[5,14],polygon:[[[-60.855,6.1765],[-60.47626,7.91883],[-62.16169,8.27787],[-62.53225,6.53755],[-60.855,6.1765]]],description:"Recent Landsat imagery"},{id:"osmse-ekonomiska",name:"Lantmäteriet Economic Map 1950–1980",type:"tms",template:"https://mapproxy.openstreetmap.se/tms/1.0.0/ek_EPSG3857/{zoom}/{x}/{-y}.jpeg",zoomExtent:[3,17],polygon:[[[12.71117,55.2666],[14.38109,55.29163],[19.65453,57.24934],[19.85228,59.75087],[17.77587,61.13794],[18.06151,62.27815],[20.97289,63.5779],[24.35668,65.60842],[23.96117,66.79191],[20.61034,66.45189],[17.13866,63.96632],[11.99706,61.03702],[12.29369,60.31607],[10.70067,58.81375],[12.71117,55.2666]]],terms_url:"https://www.lantmateriet.se",terms_text:"© Lantmäteriet",description:"Scan of \"Economic maps\" ca. 1950–1980",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-orto1960",name:"Lantmäteriet Historic Orthophoto 1960",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_60&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1955–1965. Older and younger pictures may occur.",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-orto1975",name:"Lantmäteriet Historic Orthophoto 1975",type:"wms",template:"https://api.lantmateriet.se/historiska-ortofoton/wms/v1/token/9b342b7d9f12d4ddb92277be9869d860/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.Histortho_75&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[17.85131,60.87407],[14.74558,60.53889],[11.60239,59.56416],[10.51799,58.66559],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Mosaic of Swedish orthophotos from the period 1970–1980. Is under construction.",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lantmateriet-topowebb",name:"Lantmäteriet Topographic Map",type:"tms",template:"https://api.lantmateriet.se/open/topowebb-ccby/v1/wmts/token/9b342b7d9f12d4ddb92277be9869d860/1.0.0/topowebb/default/3857/{zoom}/{y}/{x}.png",zoomExtent:[3,15],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://www.lantmateriet.se/",terms_text:"© Lantmäteriet, CC0",description:"Topographic map of Sweden 1:50 000",icon:"https://raw.githubusercontent.com/osmlab/editor-layer-index/gh-pages/sources/europe/se/lantmateriet_icon.png"},{id:"lu.geoportail.opendata.ortholatest",name:"Latest available ortho geoportail.lu",type:"tms",template:"https://{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",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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",zoomExtent:[5,13],polygon:[[[-121.93555,47.78206],[-121.57206,48.64101],[-121.20155,49.48462],[-121.83755,49.60232],[-122.4767,49.71617],[-123.11891,49.82688],[-123.76023,49.93358],[-124.08877,49.08705],[-124.41289,48.22526],[-123.79277,48.11973],[-123.17279,48.01096],[-122.55355,47.89823],[-121.93555,47.78206]]],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",zoomExtent:[14,20],polygon:[[[6.66668,46.49441],[6.61637,46.49406],[6.61636,46.49836],[6.60135,46.49825],[6.60131,46.50227],[6.55923,46.50194],[6.55773,46.59687],[6.72895,46.59805],[6.7304,46.49004],[6.67702,46.48978],[6.67703,46.49011],[6.67345,46.49006],[6.67347,46.49041],[6.66672,46.49036],[6.66668,46.49441]]],terms_url:"http://carto.lausanne.ch/lausanne-gc/",terms_text:"Ville de Lausanne - Orthophoto technique 2012"},{id:"linkoping-orto",name:"Linköping Orthophoto",type:"wms",template:"http://kartan.linkoping.se/wms?servicename=wms_ortofoto&FORMAT=image/jpeg&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Kommun_2010_25cm&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,20],polygon:[[[15.36884,58.6305],[15.41279,58.65623],[15.46635,58.6339],[15.54291,58.64408],[15.54119,58.60672],[15.58376,58.6414],[15.7592,58.55267],[15.76675,58.52006],[15.91438,58.51755],[16.08089,58.37148],[15.82718,58.30588],[15.84915,58.21449],[15.65861,58.15513],[15.56763,58.19134],[15.55939,58.14661],[15.50171,58.07679],[15.37777,58.05881],[15.28713,58.1031],[15.27203,58.13483],[15.35889,58.16455],[15.32387,58.38012],[15.24971,58.40027],[15.3582,58.47288],[15.36884,58.6305]]],terms_url:"https://www.linkoping.se/open/",terms_text:"© Linköping municipality",best:true,description:"Orthophotos from the municipality of Linköping 2010, open data",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/2/29/Linköping_vapen.svg/198px-Linköping_vapen.svg.png"},{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",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],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 4.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",zoomExtent:[0,21],polygon:[[[167.25037,-47.21957],[167.24487,-47.28016],[167.50305,-47.37975],[168.25012,-47.1561],[168.74451,-46.7963],[169.32678,-46.75492],[169.78271,-46.60417],[170.42542,-46.11133],[170.80444,-45.95115],[170.95276,-45.44086],[171.30981,-44.91036],[171.40869,-44.39062],[172.56226,-43.92955],[172.90283,-43.9691],[173.16101,-43.90977],[173.25989,-43.69568],[172.97424,-43.5366],[172.76001,-43.37711],[173.15002,-43.17714],[173.70483,-42.63396],[174.36401,-41.7836],[174.32007,-41.40978],[174.84741,-41.52914],[175.07263,-41.70573],[175.50659,-41.67291],[176.2262,-41.10833],[176.83044,-40.42604],[177.17102,-39.67337],[177.03918,-39.39375],[177.44568,-39.18118],[177.60498,-39.33005],[177.97852,-39.36828],[178.33557,-38.65978],[178.70911,-37.74466],[178.62671,-37.54458],[178.3136,-37.43125],[177.62146,-37.37889],[177.03918,-37.39635],[176.56128,-37.37016],[176.33606,-37.05956],[176.00647,-36.29742],[175.67688,-36.05354],[174.67163,-35.1783],[173.19397,-34.28445],[172.67761,-34.23451],[172.38647,-34.40238],[172.47986,-34.71904],[172.98523,-35.32185],[173.56201,-36.14231],[174.30908,-37.07709],[174.55627,-38.05242],[174.47937,-38.65549],[174.32556,-38.86537],[173.79822,-38.95941],[173.60596,-39.23225],[173.69934,-39.56335],[174.58923,-39.95607],[174.98474,-40.21664],[174.98474,-40.49292],[174.72107,-40.80549],[174.14978,-40.65147],[173.28186,-40.4344],[172.58972,-40.35073],[172.08435,-40.53468],[171.76575,-40.82628],[171.57349,-41.39742],[171.28235,-41.65239],[170.87585,-42.53284],[170.354,-42.87194],[168.27759,-43.92955],[167.6239,-44.47691],[166.55273,-45.38688],[166.27258,-45.91677],[166.48132,-46.22545],[167.67883,-46.47192],[167.25037,-47.21957]]],terms_url:"https://data.linz.govt.nz/layer/2343-nz-mainland-topo50-gridless-maps",terms_text:"CC BY 4.0 Land Information New Zealand"},{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",zoomExtent:[4,18],polygon:[[[26.21384,55.85075],[26.38583,55.70453],[26.63036,55.68067],[26.62053,55.56892],[26.52422,55.50992],[26.55415,55.38883],[26.43993,55.34794],[26.79197,55.3212],[26.82913,55.27635],[26.74346,55.25399],[26.67648,55.15883],[26.46112,55.12856],[26.35774,55.15054],[26.22963,55.10732],[26.27138,55.07759],[26.20851,54.99741],[26.06191,54.94161],[25.85782,54.9276],[25.74298,54.81506],[25.76261,54.5769],[25.53194,54.34182],[25.67716,54.32381],[25.78573,54.23362],[25.78588,54.15506],[25.55508,54.14619],[25.51095,54.17503],[25.58967,54.22858],[25.51362,54.30785],[25.26893,54.27447],[25.0706,54.13363],[24.95737,54.17206],[24.81338,54.14486],[24.77902,54.09991],[24.87128,54.0349],[24.81957,53.99772],[24.68459,53.96211],[24.69787,54.01714],[24.62591,54.0105],[24.43426,53.90144],[24.35206,53.89679],[24.20161,53.97001],[23.96833,53.9267],[23.91302,53.96968],[23.77812,53.89892],[23.70977,53.93945],[23.53704,53.94307],[23.48224,53.98938],[23.52734,54.04735],[23.48586,54.15323],[23.38679,54.22484],[23.04212,54.31597],[23.01021,54.3828],[22.85469,54.4104],[22.792,54.36332],[22.70234,54.4529],[22.68386,54.58597],[22.74897,54.63198],[22.74297,54.72682],[22.88668,54.8135],[22.8204,54.91198],[22.6424,54.97134],[22.58924,55.07024],[22.0806,55.02448],[22.03241,55.0841],[21.91307,55.08168],[21.64919,55.18081],[21.50151,55.18682],[21.38437,55.2937],[21.27098,55.24501],[21.09836,55.25639],[20.94217,55.28245],[21.08635,55.56183],[21.03995,55.83636],[21.06403,56.06995],[21.20478,56.08117],[21.2308,56.16233],[21.5021,56.2955],[21.72359,56.31382],[21.83566,56.37162],[21.96954,56.37665],[22.0153,56.42428],[22.43727,56.4064],[22.68,56.35159],[22.91917,56.37902],[22.94668,56.41465],[23.09325,56.30464],[23.17034,56.36677],[23.30645,56.38305],[23.55717,56.33382],[23.7648,56.37332],[23.76669,56.32381],[24.019,56.32976],[24.12146,56.2489],[24.28574,56.30064],[24.45415,56.25816],[24.57947,56.28824],[24.62841,56.37533],[24.90238,56.48053],[25.12774,56.20591],[25.57714,56.18241],[25.67312,56.14937],[26.21384,55.85075]]],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.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",zoomExtent:[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:"Lodz-buildings",name:"Łódź: Buildings",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/WMS_publikowane/LODZ/MapServer/WMSServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Budynki,Ulice,Adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2015",name:"Łódź: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis.mapa.lodz.pl/awiskts/services/Ortofotomapa/Ortofotomapa/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:4326",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{id:"Lodz-2017",name:"Łódź: Orthophotomap 2017 (aerial image)",type:"wms",template:"https://mapa.lodz.pl/3/services/OGC/Ortofotomapa/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:4326",endDate:"2017-01-01T00:00:00.000Z",startDate:"2017-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[19.55046,51.68509],[19.53843,51.68518],[19.53858,51.68067],[19.50381,51.68085],[19.50351,51.68564],[19.48084,51.68589],[19.48063,51.6815],[19.43517,51.68168],[19.43517,51.67754],[19.41155,51.67791],[19.41214,51.68703],[19.37723,51.68739],[19.37723,51.69172],[19.34216,51.692],[19.34291,51.70544],[19.33132,51.70572],[19.33176,51.71474],[19.31988,51.71493],[19.32077,51.74612],[19.33206,51.74612],[19.33251,51.75513],[19.32107,51.75532],[19.32225,51.79108],[19.31052,51.79126],[19.31141,51.81387],[19.323,51.81359],[19.32389,51.82709],[19.33488,51.82718],[19.33473,51.84481],[19.39342,51.84444],[19.39342,51.84022],[19.42789,51.83985],[19.42834,51.85738],[19.4634,51.85701],[19.4634,51.86133],[19.47499,51.86133],[19.47529,51.86601],[19.52194,51.86509],[19.52238,51.85619],[19.568,51.85582],[19.56785,51.85105],[19.57944,51.85105],[19.57825,51.82397],[19.63649,51.82342],[19.63411,51.76488],[19.65759,51.7647],[19.65714,51.74676],[19.64496,51.74695],[19.64421,51.7152],[19.63337,51.7152],[19.63322,51.70167],[19.62059,51.70167],[19.62044,51.68868],[19.55032,51.68942],[19.55046,51.68509]]],terms_text:"Urząd Miasta Łodzi",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/dOrthophotomap2017(aerialimage).png"},{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",zoomExtent:[0,19],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"Département de Loire-Atlantique"},{id:"Loire_Atlantique-Orthophotos-2016",name:"Loire-Atlantique - Orthophotos 2016 - 10 cm",type:"wms",template:"https://wms-vuduciel2.makina-corpus.net/geoserver/wms?SERVICE=WMS&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=cg44:ortho44-2016&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-1.48638,46.87691],[-1.54437,46.84873],[-1.73468,46.87246],[-1.89276,46.94234],[-1.95475,46.98084],[-2.07067,47.08521],[-2.2678,47.12656],[-2.22627,47.17124],[-2.19217,47.16914],[-2.19341,47.25546],[-2.29694,47.22769],[-2.41658,47.25336],[-2.54862,47.28575],[-2.63913,47.41678],[-2.50573,47.50812],[-2.31063,47.53021],[-2.24836,47.52384],[-2.23223,47.51499],[-2.12109,47.54674],[-2.11783,47.60126],[-2.1001,47.61123],[-2.09981,47.62005],[-2.11141,47.62873],[-2.10055,47.65141],[-2.08121,47.66578],[-1.98016,47.70751],[-1.83077,47.72419],[-1.67455,47.72544],[-1.63735,47.77463],[-1.49601,47.81752],[-1.49911,47.84166],[-1.38133,47.84415],[-1.346,47.81086],[-1.23007,47.78587],[-1.21643,47.75838],[-1.22635,47.73628],[-1.21086,47.7317],[-1.18668,47.73462],[-1.15196,47.69332],[-1.13151,47.63654],[-1.09121,47.6332],[-0.99265,47.6027],[-0.98459,47.58598],[-1.0317,47.55001],[-1.13585,47.55628],[-1.13275,47.5161],[-1.0317,47.51778],[-0.94863,47.50103],[-0.93686,47.47715],[-0.93376,47.43859],[-0.9009,47.39874],[-0.92694,47.37482],[-0.97157,47.35845],[-1.28339,47.32736],[-1.23379,47.26093],[-1.20032,47.26935],[-1.16498,47.24957],[-1.14143,47.1763],[-1.1563,47.15818],[-1.20652,47.12402],[-1.20838,47.10968],[-1.15568,47.10504],[-1.14081,47.08056],[-1.09431,47.0717],[-1.09989,47.03199],[-1.14453,47.01636],[-1.21582,47.02904],[-1.26727,47.06325],[-1.28524,47.02185],[-1.34972,47.02397],[-1.33918,46.969],[-1.3491,46.94446],[-1.45014,46.91186],[-1.47504,46.9176],[-1.48775,46.93063],[-1.49235,46.98433],[-1.48644,46.99943],[-1.49213,47.02722],[-1.52764,47.00541],[-1.52961,46.97252],[-1.50507,46.94439],[-1.50222,46.92973],[-1.51142,46.91371],[-1.48622,46.89724],[-1.48638,46.87691]]],terms_url:"http://data2.loire-atlantique.fr/licences/",terms_text:"© Loire-Atlantique ouverture des données publiques"},{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.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],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.4816,45.28938],[8.63085,45.01372],[8.78009,44.98189],[8.86775,45.02712],[9.07148,44.80063],[9.14966,44.79055],[9.19467,44.67106],[9.31549,44.65758],[9.36997,44.698],[9.37945,44.82752],[9.33207,44.91483],[9.41025,45.03716],[9.78692,45.04386],[9.78692,45.00032],[9.93853,45.002],[9.93379,45.08903],[10.00013,45.09071],[10.00013,44.99697],[10.20149,45.002],[10.20149,44.95004],[10.40523,44.9534],[10.40523,44.90476],[10.49288,44.90308],[10.49288,44.8628],[10.6516,44.85776],[10.64686,44.90308],[11.35282,44.89469],[11.35519,44.93663],[11.45706,44.93328],[11.44758,44.97351],[11.3623,45.00032],[11.35282,45.09238],[11.25806,45.09572],[11.25806,45.13752],[11.16094,45.14253],[11.16094,45.18262],[11.05196,45.19097],[11.05196,45.23436],[10.9572,45.23269],[10.9572,45.28605],[10.8577,45.28438],[10.85534,45.32271],[10.74636,45.32937],[10.75347,45.47408],[10.64686,45.48073],[10.60301,45.51074],[10.57636,45.47379],[10.53549,45.50036],[10.59116,45.53148],[10.61666,45.61304],[10.87429,45.84001],[10.82217,45.85982],[10.67529,45.85817],[10.57342,45.8103],[10.58624,46.00773],[10.5016,46.01596],[10.59325,46.11529],[10.60896,46.35583],[10.65634,46.38688],[10.64686,46.46037],[10.4147,46.57285],[10.32705,46.56797],[10.25124,46.65422],[10.07357,46.62494],[10.02382,46.53212],[10.02855,46.43588],[10.07357,46.39832],[10.12095,46.39669],[10.0783,46.32802],[10.14464,46.26582],[10.10436,46.24781],[9.97407,46.40812],[9.71111,46.3689],[9.68742,46.32312],[9.61872,46.30675],[9.55712,46.32475],[9.50264,46.39015],[9.47895,46.5256],[9.25626,46.51582],[9.22546,46.44078],[9.27284,46.34438],[9.17098,46.19044],[9.04305,46.12808],[9.062,46.09195],[8.97435,46.04593],[8.98856,46.00152],[8.93882,45.97354],[9.04068,45.8961],[9.01936,45.84827],[8.84879,46.0081],[8.89854,46.07059],[8.8251,46.11823],[8.70902,46.11659],[8.67823,46.07552],[8.7185,46.01468],[8.55504,45.90434],[8.59768,45.83836],[8.53372,45.79378],[8.6877,45.49235],[8.78009,45.41591],[8.68533,45.37931],[8.71139,45.34103],[8.69481,45.32104],[8.62848,45.37765],[8.5124,45.35768],[8.4816,45.28938]]],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",zoomExtent:[0,19],polygon:[[[-51.10903,-23.39275],[-51.11015,-23.39112],[-51.11198,-23.3896],[-51.11358,-23.38977],[-51.121,-23.38593],[-51.12225,-23.38511],[-51.12483,-23.3835],[-51.12538,-23.38187],[-51.12482,-23.3777],[-51.12446,-23.37505],[-51.12437,-23.3723],[-51.12244,-23.37033],[-51.12302,-23.36643],[-51.12856,-23.36548],[-51.12832,-23.35884],[-51.12477,-23.35476],[-51.12703,-23.35091],[-51.12412,-23.3468],[-51.12025,-23.34781],[-51.11765,-23.33969],[-51.11265,-23.34129],[-51.1094,-23.33489],[-51.10756,-23.33409],[-51.10486,-23.33398],[-51.10253,-23.33419],[-51.09987,-23.33102],[-51.09801,-23.32936],[-51.09999,-23.32831],[-51.10323,-23.32532],[-51.10473,-23.32319],[-51.10466,-23.32129],[-51.10515,-23.31844],[-51.10636,-23.31575],[-51.10661,-23.31467],[-51.1105,-23.31167],[-51.11158,-23.30842],[-51.0995,-23.30947],[-51.0974,-23.30863],[-51.09512,-23.30745],[-51.09202,-23.30494],[-51.09036,-23.30371],[-51.09205,-23.29875],[-51.09269,-23.2975],[-51.09408,-23.29295],[-51.10074,-23.29332],[-51.10102,-23.28871],[-51.10068,-23.28837],[-51.10085,-23.28778],[-51.09938,-23.28664],[-51.09632,-23.27791],[-51.10285,-23.27302],[-51.10836,-23.27034],[-51.1131,-23.2684],[-51.1316,-23.26534],[-51.13188,-23.26201],[-51.13173,-23.25506],[-51.1329,-23.25468],[-51.13296,-23.25075],[-51.13474,-23.25127],[-51.13534,-23.25133],[-51.13517,-23.24359],[-51.13535,-23.24118],[-51.13752,-23.24219],[-51.13885,-23.2435],[-51.14109,-23.24521],[-51.14717,-23.24318],[-51.14761,-23.23828],[-51.14908,-23.23588],[-51.14977,-23.23681],[-51.15139,-23.23854],[-51.15289,-23.23884],[-51.15384,-23.23895],[-51.1582,-23.23814],[-51.16045,-23.23816],[-51.16035,-23.24658],[-51.15912,-23.24783],[-51.16131,-23.24777],[-51.16659,-23.24594],[-51.17193,-23.24582],[-51.17205,-23.24956],[-51.17424,-23.2484],[-51.17514,-23.24932],[-51.17686,-23.24816],[-51.17947,-23.25169],[-51.18135,-23.25381],[-51.18274,-23.25363],[-51.18379,-23.25326],[-51.18496,-23.2533],[-51.18627,-23.25215],[-51.18665,-23.24748],[-51.19118,-23.24914],[-51.19142,-23.25286],[-51.19369,-23.25278],[-51.19384,-23.26074],[-51.20097,-23.26055],[-51.20127,-23.2426],[-51.20994,-23.24278],[-51.2109,-23.26988],[-51.21969,-23.27222],[-51.22597,-23.27453],[-51.22934,-23.2786],[-51.23452,-23.2816],[-51.23498,-23.28325],[-51.23507,-23.28544],[-51.23371,-23.2859],[-51.23216,-23.28802],[-51.2287,-23.29229],[-51.2274,-23.2946],[-51.22679,-23.29548],[-51.2256,-23.29657],[-51.22393,-23.29721],[-51.22048,-23.30073],[-51.21864,-23.3013],[-51.21668,-23.30212],[-51.21424,-23.30441],[-51.21097,-23.30697],[-51.22328,-23.3183],[-51.22439,-23.31459],[-51.22521,-23.31289],[-51.22512,-23.31258],[-51.22521,-23.31251],[-51.22553,-23.31253],[-51.22595,-23.31239],[-51.22617,-23.31183],[-51.22936,-23.31489],[-51.22802,-23.31661],[-51.22789,-23.31902],[-51.22767,-23.32023],[-51.22723,-23.32151],[-51.22739,-23.32223],[-51.22725,-23.32285],[-51.23033,-23.32558],[-51.23046,-23.32671],[-51.22954,-23.32789],[-51.22916,-23.3305],[-51.22929,-23.33178],[-51.22681,-23.33447],[-51.22602,-23.33657],[-51.22473,-23.33839],[-51.2221,-23.34023],[-51.22257,-23.34196],[-51.22381,-23.34339],[-51.22384,-23.34531],[-51.22441,-23.347],[-51.22454,-23.34829],[-51.22404,-23.34968],[-51.22351,-23.35011],[-51.22382,-23.35077],[-51.22305,-23.35174],[-51.2226,-23.35296],[-51.22587,-23.35481],[-51.2265,-23.36706],[-51.22354,-23.36915],[-51.22367,-23.37968],[-51.22038,-23.38163],[-51.21647,-23.3817],[-51.21416,-23.37995],[-51.20928,-23.37395],[-51.20738,-23.36814],[-51.20629,-23.36723],[-51.20472,-23.36627],[-51.19823,-23.36668],[-51.19297,-23.36651],[-51.18986,-23.36544],[-51.18806,-23.36464],[-51.18718,-23.36453],[-51.1858,-23.36374],[-51.18304,-23.36359],[-51.18071,-23.36376],[-51.17907,-23.36158],[-51.17764,-23.35836],[-51.16684,-23.35626],[-51.16614,-23.35854],[-51.16476,-23.36039],[-51.16077,-23.35922],[-51.15983,-23.3666],[-51.16204,-23.36861],[-51.16276,-23.37416],[-51.15845,-23.3758],[-51.15505,-23.37631],[-51.15396,-23.37903],[-51.15299,-23.38105],[-51.15119,-23.38208],[-51.14917,-23.38251],[-51.14722,-23.38216],[-51.14518,-23.38259],[-51.1441,-23.38376],[-51.14512,-23.38808],[-51.1418,-23.3894],[-51.14031,-23.3888],[-51.14068,-23.39161],[-51.14127,-23.39354],[-51.14094,-23.39443],[-51.14046,-23.39536],[-51.13939,-23.3951],[-51.13739,-23.39315],[-51.13609,-23.3898],[-51.13429,-23.38976],[-51.13216,-23.39007],[-51.13172,-23.39286],[-51.12259,-23.38864],[-51.12228,-23.39166],[-51.11883,-23.39317],[-51.11568,-23.39335],[-51.10903,-23.39275]],[[-51.13829,-23.41601],[-51.13331,-23.41867],[-51.13209,-23.41644],[-51.13002,-23.41829],[-51.12869,-23.41901],[-51.12824,-23.42103],[-51.12696,-23.42186],[-51.12533,-23.42269],[-51.12445,-23.42097],[-51.12151,-23.42411],[-51.12063,-23.42327],[-51.11971,-23.42312],[-51.11977,-23.42157],[-51.1188,-23.42155],[-51.11643,-23.42084],[-51.11943,-23.41917],[-51.11787,-23.41678],[-51.11655,-23.41731],[-51.1157,-23.4157],[-51.11512,-23.41309],[-51.11908,-23.41111],[-51.1196,-23.4117],[-51.12052,-23.41489],[-51.12148,-23.41714],[-51.12309,-23.41863],[-51.12755,-23.41654],[-51.12803,-23.4174],[-51.1312,-23.41557],[-51.1308,-23.41477],[-51.13279,-23.41264],[-51.13522,-23.41106],[-51.13586,-23.41096],[-51.13682,-23.41119],[-51.13721,-23.41158],[-51.1373,-23.41324],[-51.13743,-23.41471],[-51.13829,-23.41601]],[[-51.18929,-23.61469],[-51.18869,-23.61385],[-51.18818,-23.61339],[-51.18731,-23.61302],[-51.18629,-23.61314],[-51.18402,-23.61396],[-51.18349,-23.61397],[-51.18183,-23.61284],[-51.1814,-23.61344],[-51.18063,-23.61314],[-51.18001,-23.61409],[-51.17866,-23.61329],[-51.18065,-23.6106],[-51.17972,-23.61018],[-51.18062,-23.60849],[-51.18212,-23.6085],[-51.18261,-23.60775],[-51.1832,-23.60804],[-51.18415,-23.60628],[-51.18511,-23.60666],[-51.18649,-23.6047],[-51.18902,-23.6061],[-51.18821,-23.60742],[-51.18919,-23.60802],[-51.1889,-23.60953],[-51.18962,-23.60993],[-51.19119,-23.61119],[-51.19015,-23.61245],[-51.19054,-23.61276],[-51.19029,-23.61378],[-51.18929,-23.61469]],[[-51.08006,-23.52984],[-51.07962,-23.52205],[-51.08468,-23.52194],[-51.08582,-23.52404],[-51.08589,-23.52704],[-51.08579,-23.52777],[-51.0853,-23.52806],[-51.08514,-23.52857],[-51.08512,-23.52982],[-51.08471,-23.53024],[-51.08343,-23.53024],[-51.0833,-23.52978],[-51.08006,-23.52984]]],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",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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",zoomExtent:[1,21],polygon:[[[159.00339,-31.48767],[159.03789,-31.70558],[159.31098,-31.85952],[159.37278,-31.77892],[159.17443,-31.4374],[159.00339,-31.48767]],[[140.99865,-28.99893],[148.9452,-28.99487],[149.48562,-28.5615],[150.29914,-28.53373],[151.0954,-28.71792],[151.39436,-28.97978],[151.98941,-28.73557],[151.92904,-28.49836],[152.49246,-28.2353],[153.57907,-28.14156],[153.69692,-28.64983],[153.25847,-30.97354],[152.75437,-32.50849],[151.90879,-33.05535],[151.25834,-34.38081],[151.01442,-35.11568],[150.46154,-36.1203],[150.41275,-36.61786],[149.97847,-37.507],[148.20135,-36.80566],[148.07918,-36.81716],[147.88542,-36.09019],[147.69029,-36.04418],[146.82844,-36.18868],[145.23484,-35.98499],[144.84457,-36.21492],[144.51935,-36.1296],[143.20218,-35.13174],[142.47856,-34.81194],[140.9937,-34.07017],[141.0026,-34.01974],[140.99865,-28.99893]]],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}",zoomExtent:[1,19],polygon:[[[140.99486,-28.95297],[148.96114,-28.89977],[148.98701,-28.48623],[151.01361,-28.47865],[151.10847,-28.70329],[151.87599,-28.68312],[151.93348,-28.40788],[152.25544,-28.23327],[153.06608,-28.21047],[153.14082,-28.1091],[153.47351,-28.11648],[153.35765,-27.69361],[159.49383,-27.69925],[159.4857,-37.84741],[149.52569,-37.82815],[149.91596,-37.487],[148.04859,-36.81317],[147.9681,-36.15679],[146.71477,-36.28666],[145.30046,-36.15679],[144.53007,-36.14751],[142.8398,-35.02543],[142.35686,-34.78025],[141.97741,-34.40162],[140.99503,-34.13718],[140.99486,-28.95297]]],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}",zoomExtent:[1,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]]],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",zoomExtent:[0,21],polygon:[[[140.98687,-28.98878],[148.99515,-28.97275],[148.99667,-28.49151],[151.0029,-28.49307],[151.0029,-28.72617],[151.49151,-28.73239],[151.49187,-28.71553],[151.92282,-28.71964],[151.92516,-28.48971],[151.99559,-28.48987],[151.99899,-28.11927],[152.49676,-28.12209],[152.49682,-28.11464],[153.00446,-28.11544],[153.00446,-28.1204],[153.50386,-28.11934],[153.50393,-28.12271],[153.59194,-28.12236],[153.59266,-28.17769],[153.61112,-28.17579],[153.61139,-28.18252],[153.74268,-28.21621],[153.77873,-28.71091],[152.6238,-32.58772],[152.3124,-32.63288],[151.41419,-33.57904],[150.89299,-35.26487],[150.46207,-35.77773],[150.01565,-37.51036],[149.99181,-37.51268],[149.51978,-37.51307],[149.51996,-37.52169],[149.4463,-37.53537],[149.06334,-37.5358],[148.98366,-37.52176],[148.98169,-37.5192],[148.98638,-37.2585],[148.48754,-37.26585],[148.48248,-37.00927],[147.99439,-37.01434],[147.98829,-36.53322],[147.95297,-36.52607],[147.94865,-36.0686],[147.5035,-36.07168],[147.50477,-36.2651],[146.492,-36.26613],[146.49225,-36.2565],[145.99298,-36.25343],[145.99659,-36.01881],[145.98316,-36.01871],[145.96245,-36.0219],[145.94624,-36.01209],[145.94543,-36.00603],[145.50415,-36.00136],[145.50379,-36.01091],[145.0072,-36.00362],[145.00354,-36.15204],[144.48608,-36.14231],[144.48741,-36.01375],[143.98747,-36.00241],[143.99329,-35.57238],[143.49717,-35.58371],[143.4918,-35.40656],[143.46134,-35.36749],[143.45856,-35.35559],[143.48978,-35.33965],[143.48955,-35.33221],[143.4317,-35.25706],[143.25055,-35.26066],[143.24384,-35.01327],[142.99333,-35.01772],[142.99198,-34.79619],[142.49714,-34.80323],[142.49732,-34.80076],[142.42114,-34.80176],[142.42092,-34.78383],[142.23309,-34.78592],[142.23077,-34.78075],[142.227,-34.50613],[141.99753,-34.50837],[141.9946,-34.25267],[141.49823,-34.25569],[141.49817,-34.25228],[140.99454,-34.25284],[140.98687,-28.98878]]],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}",zoomExtent:[1,16],polygon:[[[140.99884,-28.99924],[148.95024,-28.99937],[148.94988,-28.96653],[148.99983,-28.96653],[149.00009,-28.81658],[149.10007,-28.81658],[149.0997,-28.74885],[148.99985,-28.74974],[148.99982,-28.50003],[151.00005,-28.50052],[151.00059,-28.73258],[151.02395,-28.73274],[151.02413,-28.74188],[151.03293,-28.74188],[151.03383,-28.75054],[151.99998,-28.74953],[151.99998,-28.71645],[152.0334,-28.71661],[152.03322,-28.6832],[152.00007,-28.68335],[151.99988,-28.64163],[151.98299,-28.64139],[151.98317,-28.62491],[151.93313,-28.62475],[151.93341,-28.50007],[151.99989,-28.50023],[151.99986,-28.37496],[152.24997,-28.37507],[152.24994,-28.25001],[152.99972,-28.24986],[152.9999,-28.28324],[153.1165,-28.2834],[153.11659,-28.24986],[153.16663,-28.25001],[153.16672,-28.23316],[153.24999,-28.23324],[153.25003,-28.12497],[153.62496,-28.12508],[153.62484,-28.49991],[153.7498,-28.49999],[153.74959,-28.7498],[153.62481,-28.75011],[153.62497,-28.99993],[153.49977,-29.00006],[153.49984,-29.49951],[153.3748,-29.50005],[153.37541,-29.87503],[153.49991,-29.87514],[153.49991,-30.00009],[153.24989,-29.99976],[153.25002,-30.19177],[153.27482,-30.19162],[153.27482,-30.21685],[153.21661,-30.21661],[153.21661,-30.25006],[153.25002,-30.25006],[153.24975,-30.37519],[153.12436,-30.37497],[153.12465,-30.62504],[153.03317,-30.62505],[153.03339,-30.87508],[153.12492,-30.87503],[153.12493,-31.12505],[153.00824,-31.12497],[153.00829,-31.24998],[153,-31.25],[152.99994,-31.62499],[152.87494,-31.62505],[152.87496,-31.74995],[152.78329,-31.75],[152.7832,-31.87486],[152.74991,-31.87501],[152.75004,-32.00002],[152.6249,-31.99994],[152.62491,-32.5],[152.49998,-32.49996],[152.50003,-32.56664],[152.41667,-32.56634],[152.41676,-32.625],[152.34985,-32.62499],[152.34985,-32.63323],[152.28308,-32.63322],[152.28326,-32.62498],[152.24948,-32.62498],[152.24981,-32.87491],[151.87457,-32.87504],[151.87485,-33.00001],[151.74977,-33.00015],[151.75047,-33.25004],[151.62524,-33.24974],[151.62508,-33.37516],[151.49958,-33.37514],[151.50031,-33.62494],[151.37415,-33.62437],[151.37279,-34.00196],[151.24778,-34.00112],[151.24778,-34.24931],[150.99573,-34.25015],[151.00081,-34.62483],[150.87174,-34.6265],[150.87276,-35.12427],[150.76706,-35.12344],[150.76909,-35.24638],[150.62579,-35.2497],[150.62803,-35.37515],[150.49997,-35.37515],[150.49591,-35.6275],[150.37192,-35.62503],[150.37497,-35.7538],[150.26724,-35.75132],[150.2652,-35.87412],[150.24792,-35.87083],[150.24589,-36.37488],[150.12292,-36.37488],[150.12597,-36.62243],[150.02535,-36.62407],[150.0284,-36.74713],[149.99283,-36.74958],[150.00401,-37.12245],[150.05889,-37.12731],[150.05686,-37.37809],[149.99791,-37.37324],[149.99994,-37.48301],[149.98774,-37.48462],[149.98571,-37.508],[148.06846,-36.80624],[147.99306,-36.138],[147.81483,-36.00556],[147.38939,-36.01137],[147.38221,-36.13103],[146.99725,-36.12755],[146.98863,-36.25283],[146.49564,-36.24471],[146.50426,-36.12639],[145.00118,-36.00795],[145.01541,-36.25421],[144.50725,-36.24765],[144.49912,-36.0211],[143.99654,-35.98105],[143.33826,-35.23318],[142.40976,-34.76694],[142.03614,-34.37588],[140.99652,-34.13858],[140.99884,-28.99924]]],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.69049,45.54652],[4.83131,45.54652],[4.83131,45.57131],[4.88344,45.57131],[4.88344,45.59745],[5.16622,45.59745],[5.16622,45.74533],[5.10793,45.74533],[5.10793,45.88145],[4.90698,45.88145],[4.90698,45.92107],[4.84377,45.92107],[4.84377,45.94011],[4.71543,45.94011],[4.71543,45.87018],[4.67458,45.87018],[4.67458,45.7178],[4.69567,45.7178],[4.69049,45.54652]]],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.66489,45.54688],[4.88253,45.54348],[4.88435,45.59745],[5.16623,45.59242],[5.17217,45.74532],[5.10793,45.74653],[5.11305,45.88145],[4.90698,45.88508],[4.90822,45.92106],[4.84377,45.92212],[4.84497,45.9581],[4.67729,45.96069],[4.66489,45.54688]]],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",zoomExtent:[0,21],polygon:[[[129.00009,-31.68764],[128.99872,-14.58225],[127.08984,-12.29707],[124.76074,-12.98315],[121.24512,-15.70766],[119.0918,-17.60214],[115.53223,-18.85431],[112.41211,-20.46819],[111.24756,-22.83695],[111.00586,-25.62172],[111.64307,-29.66896],[111.68701,-32.3614],[112.14844,-34.47034],[113.35693,-36.10238],[116.98242,-36.70366],[119.44336,-36.94989],[122.27783,-36.61553],[125.99121,-35.40696],[127.59521,-34.57895],[128.86963,-33.59632],[129.00009,-31.68764]]],terms_url:"https://catalogue.data.wa.gov.au/dataset/clss-road-hierarchy",terms_text:"Main Roads Western Australia",overlay:true},{id:"mainzlatestaerialimagery",name:"Mainz latest aerial imagery",type:"wms",template:"https://gint.mainz.de/gint1-cgi/mapserv?map=/data/mapbender-int/umn-www/client/a62/luftbild.map&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Luftbild_f_mz_2018&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[17,22],polygon:[[[8.10355,49.865],[8.38356,49.865],[8.38356,50.0466],[8.10355,50.0466],[8.10355,49.865]]],terms_url:"https://www.mainz.de/vv/oe/100140100000035141.php#tab-infos",terms_text:"Vermessung und Geoinformation Mainz",icon:"https://www.mainz.de/configuration.inc.php.media/27432/Logo-72px.png"},{id:"major_isidoro",name:"Major Isidoro AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.94048,-9.57588],[-36.94106,-9.48536],[-37.03215,-9.48606],[-37.03164,-9.57639],[-36.94048,-9.57588]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Mapbox",name:"Mapbox Satellite",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/v4/mapbox.satellite/{zoom}/{x}/{y}@2x.jpg?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcCIsImEiOiJjaml5MjVyb3MwMWV0M3hxYmUzdGdwbzE4In0.q548FjhsSJzvXsGlPsFxAQ",tileSize:512,zoomExtent:[0,22],terms_url:"https://www.mapbox.com/about/maps",terms_text:"Terms & Feedback","default":true,description:"Satellite and aerial imagery.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/MapBoxSatellite.png"},{id:"Maps4BW-LGL_BW",name:"Maps4BW (LGL-BW, www.lgl-bw.de)",type:"wms",template:"https://owsproxy.lgl-bw.de/owsproxy/ows/WMS_Maps4BW?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=webatlasde&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[9.06954,49.57679],[9.10577,49.57952],[9.16079,49.58263],[9.24212,49.58402],[9.27192,49.63515],[9.30454,49.65561],[9.36753,49.65893],[9.38253,49.64341],[9.41191,49.66033],[9.39602,49.67143],[9.41828,49.69706],[9.40378,49.71957],[9.37769,49.70357],[9.35828,49.70334],[9.29438,49.73958],[9.31467,49.76859],[9.42435,49.79099],[9.50417,49.78962],[9.51808,49.78214],[9.65623,49.79286],[9.65317,49.73944],[9.63435,49.70076],[9.67054,49.69515],[9.67721,49.71846],[9.71079,49.72918],[9.8014,49.73429],[9.83728,49.70237],[9.87656,49.61362],[9.83362,49.55607],[9.84954,49.54793],[9.87463,49.5836],[9.91419,49.58955],[9.93066,49.56097],[9.92482,49.48951],[10.01787,49.48673],[10.03352,49.52978],[10.06372,49.55129],[10.09052,49.54218],[10.12792,49.51192],[10.11027,49.49272],[10.16753,49.38589],[10.12627,49.3809],[10.14385,49.32772],[10.16061,49.27043],[10.13569,49.26189],[10.14311,49.20387],[10.25161,49.15031],[10.26279,49.12959],[10.26869,49.05202],[10.36527,49.02557],[10.45894,48.93581],[10.46208,48.83947],[10.42886,48.74973],[10.46648,48.73627],[10.49761,48.68581],[10.45007,48.66277],[10.3553,48.65068],[10.32297,48.68241],[10.26028,48.67842],[10.32542,48.60763],[10.31448,48.52323],[10.17973,48.45977],[10.12892,48.45301],[10.10938,48.47445],[10.06355,48.45381],[10.03918,48.45125],[10.04492,48.43158],[10.0152,48.40323],[9.98709,48.38565],[9.97328,48.37944],[9.97549,48.36558],[9.99071,48.3734],[10.00265,48.3632],[9.99992,48.35572],[10.06698,48.28172],[10.08111,48.2253],[10.11306,48.12632],[10.13966,48.11307],[10.14695,48.07455],[10.13763,48.01938],[10.11725,47.9755],[10.11359,47.93422],[10.10709,47.86711],[10.14174,47.80956],[10.0732,47.78686],[10.11825,47.76126],[10.14213,47.70165],[10.13262,47.67678],[10.07445,47.63472],[10.06303,47.66923],[10.00359,47.67526],[9.95808,47.64376],[9.84481,47.67533],[9.83488,47.66042],[9.74926,47.60206],[9.70817,47.60007],[9.65788,47.60599],[9.64742,47.58931],[9.61389,47.57809],[9.56602,47.53274],[9.51199,47.53246],[9.25717,47.65752],[9.18684,47.65697],[9.17591,47.65379],[9.17028,47.65474],[9.15555,47.666],[9.1494,47.66713],[9.13947,47.66367],[9.02005,47.68616],[8.94127,47.65569],[8.89825,47.64821],[8.88263,47.65327],[8.87474,47.6545],[8.87235,47.66971],[8.84949,47.68089],[8.84993,47.70233],[8.81816,47.71242],[8.80108,47.72811],[8.77231,47.71606],[8.81295,47.6959],[8.79373,47.67216],[8.7533,47.68997],[8.72575,47.6917],[8.71002,47.68829],[8.68937,47.69318],[8.67046,47.68235],[8.65783,47.68883],[8.66161,47.71454],[8.70596,47.71584],[8.70932,47.73275],[8.73033,47.75527],[8.72003,47.76273],[8.68871,47.75314],[8.67898,47.78306],[8.64981,47.79435],[8.65592,47.76948],[8.63132,47.75749],[8.61918,47.76216],[8.61351,47.78451],[8.61686,47.79705],[8.568,47.79977],[8.57611,47.79015],[8.57847,47.78102],[8.56315,47.77654],[8.48889,47.76458],[8.45742,47.74126],[8.4623,47.72909],[8.44929,47.71663],[8.41471,47.69991],[8.4273,47.68562],[8.41061,47.6743],[8.46839,47.6568],[8.52474,47.64677],[8.5269,47.66373],[8.56441,47.67261],[8.57853,47.66373],[8.60454,47.6751],[8.63333,47.65212],[8.62386,47.63922],[8.60395,47.63193],[8.61281,47.61327],[8.57951,47.59306],[8.5602,47.59867],[8.56765,47.61442],[8.53394,47.62984],[8.51208,47.61641],[8.46581,47.60137],[8.46631,47.58666],[8.48985,47.59139],[8.5,47.58062],[8.43414,47.5629],[8.39882,47.57559],[8.38525,47.56408],[8.32701,47.56893],[8.29483,47.59077],[8.2948,47.60497],[8.26293,47.60823],[8.22435,47.60446],[8.18644,47.60508],[8.16904,47.59394],[8.13615,47.58246],[8.10503,47.56795],[8.09873,47.55933],[8.08261,47.55624],[8.07095,47.56299],[8.0274,47.54931],[7.94632,47.54209],[7.90966,47.54825],[7.90676,47.5603],[7.88681,47.58765],[7.83987,47.58122],[7.79648,47.55517],[7.69208,47.53137],[7.66583,47.53403],[7.63159,47.56044],[7.63879,47.56619],[7.68607,47.57205],[7.65278,47.59418],[7.62247,47.57767],[7.60473,47.57822],[7.58771,47.59015],[7.52156,47.65161],[7.50399,47.70235],[7.52096,47.77685],[7.55712,47.84839],[7.54946,47.8792],[7.57461,47.93028],[7.61318,47.96804],[7.6119,47.9871],[7.56124,48.03836],[7.57491,48.1258],[7.59534,48.15977],[7.63305,48.19717],[7.66275,48.22473],[7.68466,48.30305],[7.76346,48.49158],[7.80046,48.5126],[7.79958,48.5878],[7.83409,48.64439],[7.91211,48.68899],[7.96723,48.75716],[8.02069,48.78879],[8.04302,48.7956],[8.08647,48.81306],[8.13644,48.89782],[8.19706,48.96021],[8.28161,48.9949],[8.29967,49.02597],[8.31243,49.05996],[8.38654,49.23497],[8.46083,49.28407],[8.48783,49.29326],[8.47577,49.3079],[8.44839,49.31693],[8.45152,49.33135],[8.46288,49.3869],[8.49407,49.40186],[8.49762,49.41583],[8.50721,49.43414],[8.49834,49.44187],[8.47977,49.44391],[8.46414,49.44151],[8.44696,49.44516],[8.43947,49.45214],[8.44407,49.46085],[8.45992,49.46498],[8.46312,49.47135],[8.4554,49.48107],[8.44184,49.49297],[8.41194,49.55852],[8.42193,49.5843],[8.44117,49.59081],[8.45482,49.59157],[8.47738,49.5874],[8.56161,49.52237],[8.61486,49.54175],[8.59165,49.59179],[8.58706,49.61156],[8.65189,49.6209],[8.69494,49.62762],[8.70105,49.59869],[8.68726,49.57096],[8.72597,49.53085],[8.78493,49.51775],[8.81467,49.53187],[8.88863,49.51091],[8.90168,49.50363],[8.90315,49.486],[8.87995,49.46561],[8.83117,49.42147],[8.80845,49.40981],[8.82075,49.39647],[8.83009,49.41316],[8.85107,49.39663],[8.90247,49.44632],[8.93863,49.48179],[8.95154,49.50562],[8.98498,49.51153],[9.03553,49.50079],[9.05731,49.532],[9.10023,49.52728],[9.11009,49.51213],[9.12424,49.51722],[9.11286,49.53337],[9.08284,49.54211],[9.06694,49.56433],[9.06954,49.57679]]],terms_url:"https://www.lgl-bw.de/",terms_text:"Datengrundlage: LGL, www.lgl-bw.de"},{id:"mar_vermelho_al",name:"Mar Vermelho AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.34201,-9.49289],[-36.3422,-9.47533],[-36.34275,-9.4029],[-36.34473,-9.4029],[-36.34537,-9.40279],[-36.34702,-9.40293],[-36.3508,-9.40291],[-36.359,-9.40307],[-36.36109,-9.403],[-36.36289,-9.40307],[-36.3659,-9.40305],[-36.36713,-9.40301],[-36.37571,-9.40307],[-36.38049,-9.40308],[-36.38663,-9.4032],[-36.38852,-9.40312],[-36.39286,-9.40325],[-36.39656,-9.40322],[-36.40309,-9.40327],[-36.41973,-9.40338],[-36.43368,-9.4034],[-36.43355,-9.41685],[-36.43344,-9.42386],[-36.43338,-9.43753],[-36.43329,-9.45012],[-36.433,-9.49359],[-36.40839,-9.4935],[-36.40442,-9.49354],[-36.40008,-9.49351],[-36.39787,-9.49342],[-36.39168,-9.49328],[-36.38757,-9.49331],[-36.38536,-9.49341],[-36.37673,-9.49331],[-36.37427,-9.49319],[-36.36707,-9.49299],[-36.36502,-9.493],[-36.36043,-9.49299],[-36.35955,-9.49295],[-36.35895,-9.49304],[-36.35703,-9.49294],[-36.35665,-9.493],[-36.3526,-9.493],[-36.34767,-9.49297],[-36.34201,-9.49289]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"MassGIS-L3-Parcels",name:"MassGIS L3 Parcels",type:"tms",template:"https://ags-proxy.openstreetmap.us/tiles/{zoom}/{x}/{y}?url=http%3A%2F%2Fgisprpxy.itd.state.ma.us%2Farcgisserver%2Frest%2Fservices%2FAGOL%2FL3Parcels_feature_service%2FMapServer%2F&transparent=true&layers=show%3A0",zoomExtent:[15,22],polygon:[[[-72.13569,42.03025],[-72.53156,42.03458],[-72.57278,42.03022],[-72.58216,42.02474],[-72.60717,42.02515],[-72.60797,42.03108],[-72.64019,42.03205],[-72.69933,42.03696],[-72.75714,42.03635],[-72.75868,42.02439],[-72.76572,42.02276],[-72.76673,42.00327],[-72.81705,41.99769],[-72.81378,42.03674],[-73.03678,42.03929],[-73.43281,42.05059],[-73.49688,42.04968],[-73.50814,42.08626],[-73.26496,42.74594],[-72.6872,42.73348],[-71.97286,42.71307],[-71.69663,42.70572],[-71.29464,42.69704],[-71.27894,42.71136],[-71.26787,42.72603],[-71.25526,42.73659],[-71.24598,42.74231],[-71.23732,42.74491],[-71.22391,42.74643],[-71.18181,42.73732],[-71.18617,42.79088],[-71.16667,42.80891],[-71.13277,42.82145],[-71.06442,42.80626],[-71.05395,42.83337],[-71.04483,42.84869],[-71.03128,42.85924],[-70.96702,42.86887],[-70.94967,42.87588],[-70.92973,42.88504],[-70.91465,42.88661],[-70.90348,42.88671],[-70.88566,42.88288],[-70.84776,42.86088],[-70.82963,42.86875],[-70.81567,42.87204],[-70.45842,42.67694],[-70.8759,42.35302],[-69.88713,42.0519],[-69.89537,41.21643],[-70.81959,41.23192],[-71.09996,41.43386],[-71.12047,41.49717],[-71.13131,41.59231],[-71.14059,41.6051],[-71.14047,41.62389],[-71.13569,41.6284],[-71.13291,41.6601],[-71.17605,41.6681],[-71.17588,41.67154],[-71.1954,41.67514],[-71.26139,41.7523],[-71.32885,41.7811],[-71.33407,41.79455],[-71.34156,41.79817],[-71.33914,41.80842],[-71.3472,41.8231],[-71.3449,41.828],[-71.3352,41.8355],[-71.3422,41.8448],[-71.33392,41.86229],[-71.34086,41.87872],[-71.33865,41.89865],[-71.38174,41.8932],[-71.38127,42.01885],[-71.49744,42.01725],[-71.52888,42.01499],[-71.79925,42.00807],[-71.80067,42.02351],[-72.0635,42.02735],[-72.13569,42.03025]]],overlay:true},{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",zoomExtent:[0,20],polygon:[[[-76.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],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",zoomExtent:[0,20],polygon:[[[-76.46299,38.9808],[-76.46326,38.94779],[-76.49499,38.9369],[-76.51617,38.93697],[-76.54763,38.9591],[-76.54745,38.98667],[-76.51559,39.00306],[-76.4839,39.00292],[-76.46299,38.9808]],[[-76.09548,38.84133],[-76.0428,38.8409],[-76.04289,38.8298],[-76.03229,38.8297],[-76.03277,38.79667],[-76.02545,38.79664],[-76.02541,38.77462],[-76.03308,38.77472],[-76.03366,38.73073],[-76.05462,38.73094],[-76.0548,38.72005],[-76.10753,38.72043],[-76.10714,38.75338],[-76.11754,38.75346],[-76.11701,38.79731],[-76.09601,38.79715],[-76.09548,38.84133]],[[-77.23397,39.16838],[-77.25516,39.14647],[-77.25496,39.11343],[-77.18093,39.05337],[-77.14907,39.0477],[-77.12798,39.04779],[-77.10683,39.05325],[-77.10688,39.0917],[-77.11775,39.10827],[-77.16011,39.12485],[-77.15975,39.15214],[-77.17048,39.16302],[-77.21284,39.17272],[-77.23397,39.16838]]],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.23413,37.92037],[-76.59805,38.15832],[-76.94,38.27053],[-77.03819,38.41379],[-77.23526,38.33627],[-77.31216,38.41056],[-77.26273,38.56642],[-77.043,38.71338],[-77.04987,38.7937],[-76.92627,38.8925],[-77.04094,38.9845],[-77.12162,38.92523],[-77.15012,38.95514],[-77.25243,38.97543],[-77.25929,39.02425],[-77.34581,39.05492],[-77.46185,39.07038],[-77.53738,39.13965],[-77.47421,39.22481],[-77.57275,39.30428],[-77.72347,39.32899],[-77.77702,39.46323],[-77.86148,39.51622],[-77.84088,39.60886],[-77.95624,39.59299],[-78.16635,39.69556],[-78.27003,39.62156],[-78.3387,39.64007],[-78.46641,39.52364],[-78.6628,39.54006],[-78.79875,39.60622],[-78.9814,39.4468],[-79.06723,39.47649],[-79.48505,39.19954],[-79.48557,39.72158],[-75.78836,39.72181],[-75.69099,38.46058],[-75.04924,38.45816],[-75.04984,38.40222],[-75.08151,38.32321],[-75.09773,38.30907],[-75.187,38.09755],[-75.23798,38.0224],[-75.61821,37.98967],[-75.86369,37.90953],[-76.23413,37.92037]]],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:"MCGIS-County-NAIP-Imagery-2015",name:"Mesa County GIS NAIP 2015",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/MesaCounty_2015/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:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-NAIP-Imagery-2017",name:"Mesa County GIS NAIP 2017",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/NAIP_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:4326",endDate:"2017-10-24T00:00:00.000Z",startDate:"2017-08-26T00:00:00.000Z",zoomExtent:[0,13],polygon:[[[-109.06765,39.37875],[-107.37012,39.37962],[-107.36995,39.18422],[-107.49574,39.18416],[-107.49568,39.12133],[-107.62081,39.12126],[-107.62076,39.05974],[-107.68231,39.05971],[-107.68226,38.99652],[-107.81774,38.99645],[-107.81779,39.05859],[-107.86948,39.05856],[-107.86943,38.99769],[-108.05698,38.99759],[-108.05688,38.87126],[-108.18204,38.8712],[-108.18198,38.8081],[-108.37142,38.808],[-108.3711,38.43452],[-109.06685,38.43416],[-109.06765,39.37875]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"MCGIS-County-Valleywide-Imagery-2018",name:"Mesa County GIS Valleywide 2018",type:"wms",template:"https://mcgis.mesacounty.us/image/services/Mosaic_Datasets/City_Color_2018/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:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-108.93915,39.23931],[-108.86841,39.23846],[-108.86843,39.23734],[-108.81245,39.23666],[-108.81274,39.22256],[-108.79405,39.22234],[-108.79432,39.20857],[-108.70096,39.20745],[-108.70123,39.1939],[-108.60764,39.19277],[-108.60791,39.17906],[-108.58915,39.17884],[-108.58943,39.1649],[-108.53332,39.16422],[-108.53361,39.14993],[-108.51461,39.14971],[-108.51489,39.13611],[-108.44076,39.13522],[-108.44104,39.12109],[-108.42192,39.12086],[-108.42201,39.1163],[-108.3984,39.11602],[-108.39798,39.13708],[-108.32446,39.13619],[-108.32416,39.15107],[-108.30718,39.15087],[-108.3066,39.18],[-108.28866,39.17979],[-108.28807,39.20939],[-108.26868,39.20916],[-108.26957,39.16484],[-108.2864,39.16505],[-108.28699,39.13571],[-108.30312,39.13591],[-108.3038,39.10194],[-108.32335,39.10218],[-108.32328,39.10574],[-108.32914,39.10581],[-108.32943,39.09121],[-108.34736,39.09142],[-108.34764,39.07715],[-108.36637,39.07738],[-108.36666,39.06268],[-108.38569,39.06291],[-108.38599,39.04799],[-108.42216,39.04843],[-108.42245,39.03377],[-108.44051,39.03399],[-108.44137,38.99101],[-108.42193,38.99077],[-108.42252,38.96127],[-108.44162,38.9615],[-108.44133,38.97595],[-108.46034,38.97618],[-108.46006,38.99024],[-108.47877,38.99047],[-108.47848,39.00485],[-108.51515,39.0053],[-108.51519,39.00287],[-108.51825,39.00291],[-108.51821,39.00517],[-108.53414,39.00536],[-108.53397,39.0139],[-108.54342,39.01401],[-108.54336,39.01733],[-108.5455,39.01735],[-108.54548,39.01855],[-108.65864,39.01991],[-108.65778,39.06287],[-108.67867,39.06313],[-108.67837,39.07793],[-108.69699,39.07816],[-108.69671,39.09203],[-108.71557,39.09225],[-108.71529,39.10619],[-108.7388,39.10648],[-108.73853,39.12033],[-108.75744,39.12056],[-108.75686,39.14927],[-108.79422,39.14972],[-108.79393,39.16386],[-108.83224,39.16432],[-108.83196,39.17845],[-108.85061,39.17868],[-108.85033,39.19302],[-108.86938,39.19325],[-108.86906,39.20925],[-108.90237,39.20965],[-108.90208,39.22384],[-108.93946,39.22429],[-108.93915,39.23931]]],terms_url:"http://gis.mesacounty.us/",terms_text:"Mesa County GIS",icon:"https://gis.mesacounty.us/globalassets/images/county-logos/mesa-county-logo.png"},{id:"Metropole_Ruhr_RVR-DOP10",name:"Metropole Ruhr: Luftbilder (10 cm)",type:"wms",template:"https://geodaten.metropoleruhr.de/dop/dop?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=DOP&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[6.51691,51.81714],[6.52258,51.81469],[6.52281,51.81041],[6.52834,51.81053],[6.53991,51.80134],[6.5511,51.799],[6.56818,51.78992],[6.57476,51.79606],[6.58457,51.79369],[6.59102,51.8024],[6.60911,51.80019],[6.61081,51.79423],[6.63264,51.79981],[6.65946,51.7892],[6.66837,51.77738],[6.7138,51.78084],[6.70876,51.77131],[6.72131,51.76899],[6.7475,51.77035],[6.74862,51.77551],[6.75824,51.77656],[6.7698,51.76649],[6.77219,51.74596],[6.78862,51.74884],[6.79861,51.74217],[6.81927,51.74341],[6.81956,51.73741],[6.82683,51.72983],[6.8403,51.73694],[6.84995,51.73712],[6.85551,51.73636],[6.8586,51.72956],[6.9103,51.74592],[6.90861,51.75275],[6.91511,51.76144],[6.9157,51.7786],[6.93527,51.7738],[6.95606,51.77245],[6.97559,51.79936],[6.98794,51.80129],[6.99485,51.80141],[6.99497,51.79884],[7.02118,51.80014],[7.0244,51.7899],[7.03141,51.78745],[7.0316,51.78317],[7.03847,51.78414],[7.05392,51.77839],[7.06079,51.77936],[7.0609,51.77679],[7.07333,51.777],[7.07867,51.78137],[7.11433,51.78795],[7.13435,51.80542],[7.1616,51.81528],[7.16419,51.8196],[7.19177,51.82174],[7.2141,51.81694],[7.22121,51.81191],[7.23658,51.80785],[7.23668,51.80528],[7.24916,51.80461],[7.2535,51.79953],[7.26179,51.79966],[7.26485,51.79198],[7.26245,51.78252],[7.27229,51.77838],[7.26002,51.77391],[7.26012,51.77134],[7.2688,51.76118],[7.27577,51.75957],[7.27889,51.75019],[7.31079,51.74636],[7.3151,51.74214],[7.31519,51.73957],[7.31102,51.74036],[7.3125,51.73781],[7.32081,51.73707],[7.31169,51.72237],[7.29963,51.71277],[7.2985,51.70589],[7.31069,51.71207],[7.30825,51.70346],[7.32762,51.70202],[7.33057,51.69692],[7.34427,51.69969],[7.34599,51.69028],[7.33919,51.68761],[7.35589,51.68356],[7.35877,51.68017],[7.3781,51.67959],[7.39086,51.66947],[7.40617,51.6654],[7.41031,51.66545],[7.4101,51.67145],[7.43089,51.6683],[7.43892,51.67527],[7.44854,51.67625],[7.44933,51.69341],[7.44094,51.69673],[7.43792,51.7044],[7.42406,51.70593],[7.42245,51.71277],[7.43451,51.72321],[7.44825,51.72511],[7.46718,51.7365],[7.47273,51.73572],[7.4771,51.72892],[7.4826,51.72985],[7.47877,51.72037],[7.48435,51.71872],[7.48449,51.71444],[7.49119,51.72053],[7.49947,51.72063],[7.50214,51.72324],[7.51738,51.72172],[7.51788,51.70629],[7.53035,51.70473],[7.52922,51.69701],[7.53349,51.69277],[7.54458,51.6912],[7.5378,51.68768],[7.54477,51.6852],[7.5528,51.69301],[7.56651,51.69575],[7.56642,51.69832],[7.58706,51.70029],[7.59379,51.70551],[7.6048,51.7065],[7.60743,51.71082],[7.6143,51.71176],[7.61419,51.71518],[7.62663,51.71447],[7.62814,51.7102],[7.64321,51.71381],[7.6531,51.70621],[7.65428,51.71308],[7.668,51.71581],[7.66915,51.72353],[7.68832,51.72889],[7.69283,51.71608],[7.7012,51.71275],[7.71352,51.71631],[7.71481,51.71976],[7.71899,51.71809],[7.71749,51.72236],[7.72163,51.7224],[7.72555,51.73016],[7.73659,51.73028],[7.73638,51.73799],[7.75154,51.73901],[7.7699,51.72378],[7.77119,51.72722],[7.78908,51.72912],[7.79037,51.73256],[7.80282,51.73183],[7.80137,51.73439],[7.80825,51.73531],[7.81228,51.73964],[7.82058,51.73887],[7.82457,51.74491],[7.83287,51.74413],[7.83314,51.73385],[7.83739,51.72961],[7.85815,51.72724],[7.85822,51.72467],[7.86374,51.72472],[7.87187,51.7308],[7.87745,51.72828],[7.88038,51.72145],[7.88875,51.7181],[7.88912,51.70267],[7.90148,51.70536],[7.90568,51.70283],[7.91249,51.70632],[7.92768,51.7056],[7.92912,51.70305],[7.94014,51.704],[7.93746,51.70055],[7.94296,51.70146],[7.96108,51.69305],[7.97631,51.69061],[7.97779,51.68633],[7.9875,51.68385],[7.98761,51.67871],[7.99732,51.67622],[7.9974,51.67279],[7.98365,51.67096],[7.96286,51.67592],[7.95466,51.67242],[7.95366,51.65612],[7.94689,51.65092],[7.94984,51.64237],[7.94443,51.63804],[7.93477,51.6388],[7.93224,51.62935],[7.92406,51.62585],[7.92414,51.62242],[7.91195,51.61374],[7.91632,51.60349],[7.91378,51.59489],[7.87529,51.59282],[7.86837,51.59446],[7.85742,51.59179],[7.85889,51.58837],[7.82749,51.57863],[7.84327,51.55307],[7.83262,51.53925],[7.83277,51.53325],[7.84115,51.52819],[7.8345,51.51955],[7.83755,51.50758],[7.83212,51.50496],[7.83912,51.49988],[7.83923,51.4956],[7.84474,51.49479],[7.8506,51.48028],[7.83418,51.4784],[7.82198,51.47228],[7.80819,51.47471],[7.79876,51.46776],[7.78906,51.47109],[7.76169,51.46823],[7.74785,51.47237],[7.7425,51.46717],[7.73567,51.46623],[7.72864,51.47216],[7.69838,51.4744],[7.67525,51.46728],[7.65606,51.46621],[7.65347,51.46103],[7.63843,51.45914],[7.63589,51.45226],[7.62083,51.45122],[7.61407,51.44772],[7.61977,51.44092],[7.62525,51.44099],[7.62127,51.43666],[7.62825,51.43245],[7.62561,51.42899],[7.63125,51.42391],[7.61633,51.41859],[7.62183,51.4178],[7.62196,51.41352],[7.63313,51.40679],[7.61322,51.38512],[7.60485,51.39017],[7.60609,51.39447],[7.59647,51.39521],[7.58704,51.38995],[7.59,51.38313],[7.58465,51.37878],[7.58644,51.36509],[7.59234,51.35144],[7.59934,51.34638],[7.59257,51.34373],[7.59407,51.33946],[7.58186,51.33588],[7.58334,51.33247],[7.57655,51.33067],[7.57816,51.32298],[7.58373,51.31962],[7.57837,51.31612],[7.58134,51.30844],[7.58547,51.30763],[7.58305,51.29732],[7.56826,51.28942],[7.56582,51.27996],[7.55089,51.27635],[7.54977,51.26862],[7.52923,51.27008],[7.52797,51.26663],[7.51302,51.26387],[7.51049,51.25784],[7.50371,51.25604],[7.50385,51.25175],[7.49563,51.2525],[7.49438,51.24906],[7.49708,51.24995],[7.50271,51.24488],[7.50143,51.24229],[7.48262,51.23262],[7.469,51.23158],[7.46505,51.22724],[7.45129,51.23049],[7.44191,51.22522],[7.44478,51.22098],[7.43534,51.21742],[7.43816,51.21489],[7.43413,51.21312],[7.42995,51.21563],[7.42962,51.22506],[7.42408,51.22756],[7.41182,51.22653],[7.41342,51.2197],[7.39824,51.22463],[7.39521,51.23317],[7.40319,51.23928],[7.3934,51.246],[7.38793,51.24593],[7.38672,51.24162],[7.37853,51.24151],[7.37289,51.24657],[7.35526,51.2429],[7.35405,51.23859],[7.34849,51.24109],[7.339,51.23924],[7.33872,51.24695],[7.32904,51.25024],[7.3238,51.24417],[7.31284,51.24487],[7.31027,51.24054],[7.30481,51.24046],[7.29643,51.24549],[7.29764,51.24979],[7.28262,51.24957],[7.27541,51.25975],[7.2715,51.25455],[7.26734,51.25621],[7.26578,51.26133],[7.27623,51.27434],[7.26764,51.2845],[7.25531,51.28518],[7.26537,51.30847],[7.26521,51.31276],[7.25974,51.31268],[7.26511,51.31533],[7.26365,51.31788],[7.23393,51.308],[7.22973,51.31051],[7.2271,51.3079],[7.22296,51.3087],[7.22309,51.30527],[7.20682,51.30159],[7.20026,51.29463],[7.18792,51.2953],[7.18232,51.29864],[7.16869,51.29757],[7.18065,51.30633],[7.16674,51.31211],[7.16924,51.31815],[7.16503,51.32066],[7.1662,51.32582],[7.15645,51.32996],[7.15351,51.33505],[7.14807,51.33411],[7.14927,51.33842],[7.14513,51.33921],[7.15292,51.34962],[7.14882,51.34956],[7.14731,51.35296],[7.15665,51.35911],[7.15911,51.36601],[7.15189,51.37532],[7.14634,51.37695],[7.13957,51.37513],[7.13802,51.37939],[7.13262,51.37759],[7.127,51.38093],[7.12163,51.37827],[7.12153,51.38084],[7.11742,51.38078],[7.11626,51.37561],[7.11215,51.37555],[7.11205,51.37812],[7.1039,51.37627],[7.09853,51.37361],[7.10004,51.37021],[7.0919,51.36836],[7.08765,51.37172],[7.08088,51.3699],[7.07796,51.37414],[7.0552,51.36176],[7.04973,51.36167],[7.04404,51.36671],[7.03604,51.36144],[7.01944,51.36544],[7.01,51.36185],[7.00745,51.35752],[6.98689,51.35803],[6.98301,51.35282],[6.97743,51.35529],[6.97621,51.35184],[6.96545,51.34737],[6.95033,51.34882],[6.94748,51.35134],[6.9257,51.34839],[6.92422,51.35093],[6.92825,51.35272],[6.92137,51.35346],[6.92391,51.35779],[6.90565,51.36775],[6.90022,51.3668],[6.8904,51.37176],[6.87848,51.36297],[6.86745,51.36449],[6.85115,51.36162],[6.84552,51.36495],[6.84991,51.35903],[6.83385,51.35101],[6.82295,51.34995],[6.81731,51.35328],[6.81615,51.34897],[6.80939,51.34713],[6.80649,51.3505],[6.7941,51.35198],[6.79314,51.34339],[6.77673,51.34308],[6.7475,51.35281],[6.73831,51.34492],[6.72749,51.34214],[6.71287,51.33328],[6.69193,51.34144],[6.66428,51.3469],[6.65435,51.35356],[6.65789,51.36477],[6.67409,51.36938],[6.67794,51.3746],[6.67511,51.37626],[6.6684,51.37356],[6.67309,51.38908],[6.66081,51.38798],[6.65693,51.38362],[6.64602,51.38254],[6.64443,51.3868],[6.63626,51.38577],[6.63586,51.39348],[6.611,51.39726],[6.59479,51.39265],[6.57148,51.39302],[6.56618,51.38948],[6.55797,51.38931],[6.55496,51.39439],[6.54679,51.39337],[6.54505,51.40019],[6.53816,51.4009],[6.52939,51.41101],[6.52596,51.42379],[6.5149,51.42527],[6.51453,51.43213],[6.51987,51.43481],[6.52092,51.44084],[6.51119,51.4432],[6.50821,51.44743],[6.50273,51.44731],[6.50198,51.46101],[6.50709,51.46798],[6.49868,51.47123],[6.49698,51.4772],[6.49012,51.47705],[6.48714,51.48127],[6.4818,51.47859],[6.47608,51.48275],[6.47404,51.49471],[6.46699,51.49799],[6.46245,51.50561],[6.45407,51.508],[6.45497,51.51659],[6.44796,51.51901],[6.45326,51.52255],[6.44876,51.52931],[6.45562,51.52946],[6.47816,51.51966],[6.47499,51.52731],[6.48673,51.53871],[6.46262,51.55191],[6.49612,51.56806],[6.46176,51.56732],[6.42276,51.5759],[6.41912,51.56725],[6.40847,51.56101],[6.38918,51.56144],[6.37657,51.56545],[6.36951,51.56872],[6.36916,51.57471],[6.37726,51.57747],[6.37284,51.58251],[6.37372,51.59111],[6.35235,51.60349],[6.33482,51.59709],[6.32362,51.60026],[6.32067,51.60363],[6.33275,51.60905],[6.33392,51.6125],[6.30035,51.62117],[6.30143,51.62633],[6.29113,51.63725],[6.29225,51.64156],[6.29903,51.64343],[6.32563,51.63632],[6.32819,51.63981],[6.35403,51.64554],[6.35313,51.66095],[6.36553,51.66123],[6.36262,51.66374],[6.37069,51.66735],[6.38091,51.6813],[6.38062,51.68643],[6.37195,51.6931],[6.35808,51.6945],[6.35482,51.703],[6.3682,51.71016],[6.37642,51.7112],[6.38041,51.71387],[6.37731,51.7198],[6.38829,51.7209],[6.38789,51.72775],[6.40932,51.73937],[6.41055,51.74197],[6.40346,51.74524],[6.40597,51.74959],[6.40178,51.75035],[6.40287,51.75552],[6.41405,51.75319],[6.42134,51.7465],[6.42188,51.73708],[6.40877,51.72478],[6.40921,51.71708],[6.4164,51.71209],[6.44839,51.70765],[6.46246,51.70281],[6.47677,51.71855],[6.48908,51.72053],[6.48418,51.73414],[6.48942,51.7394],[6.48908,51.74539],[6.48171,51.75381],[6.53363,51.76434],[6.52478,51.77444],[6.50784,51.78094],[6.4898,51.80714],[6.48961,51.81056],[6.51162,51.81274],[6.51691,51.81714]]],terms_url:"https://www.metropoleruhr.de/regionalverband-ruhr.html",terms_text:"Datengrundlage: Regionalverband Ruhr"},{id:"miljodirektoratet-vern",name:"Miljødirektoratet Protected Areas overlay",type:"wms",template:"https://arcgisproxy.miljodirektoratet.no/arcgis/services/vern/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=naturvern_klasser_omrade,naturvern_punkt&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://kart.naturbase.no",terms_text:"© Miljødirektoratet",description:"Norwegian national parks, nature reserves and other protected areas and objects from Naturbase, including Svalbard/Spitsbergen",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"miljodirektoratet-friluftsomrader",name:"Miljødirektoratet Public Recreation Areas overlay",type:"wms",template:"https://arcgisproxy.miljodirektoratet.no/arcgis/services/friluftsliv_statlig_sikra/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=friluftsliv_statlig_sikra&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"http://www.miljostatus.no/tema/friluftsliv/statlig-sikra-friluftlivsomrader/",terms_text:"© Miljødirektoratet",description:"Public recreation areas with State ownership (\"friluftsområder\").",icon:"http://www.miljodirektoratet.no/Framework/favicon-32.png",overlay:true},{id:"minador_do_negrao",name:"Minador do Negrão",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.8196,-9.35174],[-36.82017,-9.26142],[-36.82465,-9.26133],[-36.83064,-9.26147],[-36.83673,-9.2615],[-36.84228,-9.26148],[-36.84562,-9.2616],[-36.85564,-9.2616],[-36.86214,-9.26159],[-36.8659,-9.26147],[-36.86724,-9.2615],[-36.86952,-9.26149],[-36.87127,-9.26157],[-36.87476,-9.26153],[-36.87816,-9.26163],[-36.88321,-9.2617],[-36.88565,-9.26167],[-36.88857,-9.26148],[-36.89217,-9.26151],[-36.89383,-9.26163],[-36.8974,-9.26175],[-36.91122,-9.26183],[-36.9111,-9.26651],[-36.91112,-9.28542],[-36.91121,-9.29066],[-36.91118,-9.29368],[-36.91099,-9.29929],[-36.91091,-9.30729],[-36.9109,-9.3123],[-36.91083,-9.31597],[-36.91084,-9.32013],[-36.91098,-9.32395],[-36.91099,-9.32587],[-36.91079,-9.32964],[-36.91079,-9.33523],[-36.91074,-9.33944],[-36.91092,-9.34311],[-36.91084,-9.34471],[-36.91066,-9.35229],[-36.89277,-9.35225],[-36.87735,-9.35212],[-36.86463,-9.35203],[-36.85761,-9.35194],[-36.84344,-9.35191],[-36.83115,-9.3518],[-36.8196,-9.35174]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"mml-tausta",name:"MML Background Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/taustakartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Background map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-orto",name:"MML Orthophoto",type:"tms",template:"http://tiles.kartat.kapsi.fi/ortokuva/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",best:true,description:"Ortophotos from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mml-topo",name:"MML Topographic Map",type:"tms",template:"http://tiles.kartat.kapsi.fi/peruskartta/{zoom}/{x}/{y}.jpg",zoomExtent:[2,19],polygon:[[[27.96569,70.0988],[27.57431,70.07728],[27.10876,69.93548],[26.70913,69.97549],[26.45507,69.94207],[25.87142,69.6671],[25.94833,69.61024],[25.83023,69.55323],[25.66955,69.20794],[25.73822,69.01797],[25.60089,68.90309],[25.45806,68.91199],[25.11749,68.80699],[25.07354,68.64355],[24.88128,68.62003],[23.97491,68.84568],[23.74969,68.8308],[23.63433,68.71645],[23.18939,68.68053],[22.52197,68.7553],[21.63894,69.28191],[21.26953,69.31783],[20.94131,69.21622],[21.08963,69.09307],[21.05941,69.04352],[20.72296,69.12491],[20.54443,69.0558],[20.84655,68.97416],[20.81634,68.91742],[21.38754,68.68461],[22.04734,68.47066],[22.80212,68.35464],[23.12072,68.13169],[23.5437,67.9633],[23.44757,67.8393],[23.48602,67.59352],[23.36517,67.46545],[23.71124,67.41592],[23.72772,67.32186],[23.54644,67.26885],[23.53128,67.16724],[23.89251,66.86863],[23.84582,66.57775],[23.61843,66.44562],[23.67171,66.20303],[23.87191,66.14551],[24.09988,65.87247],[24.1658,65.66959],[24.11636,65.39143],[21.37939,63.68037],[20.17639,63.29787],[19.08325,60.16064],[20.22033,59.44786],[22.29125,59.44507],[25.82336,59.933],[27.52075,60.23435],[27.83386,60.53229],[29.29641,61.26165],[31.20803,62.44759],[31.62826,62.90585],[31.2635,63.22106],[29.99605,63.75387],[30.28656,63.81704],[30.58319,64.0782],[30.5104,64.26428],[30.09979,64.39218],[30.02563,64.58736],[30.16845,64.63329],[30.09429,64.79518],[29.78393,64.79811],[29.65347,64.89733],[29.65759,65.05939],[29.91027,65.09527],[29.93225,65.20895],[29.72076,65.27853],[29.91577,65.63788],[30.1863,65.66223],[29.9913,66.09771],[29.07119,66.91983],[30.11077,67.63431],[29.3486,68.08099],[28.67568,68.20166],[28.46547,68.54039],[28.72375,68.72642],[28.82675,68.87341],[28.44985,68.90792],[28.95996,69.05089],[28.83324,69.10563],[28.87207,69.22132],[29.36096,69.46526],[29.15634,69.69667],[28.38455,69.83488],[28.35845,69.88312],[28.17169,69.92511],[28.00415,70.01495],[27.96569,70.0988]]],terms_url:"https://www.maanmittauslaitos.fi/en/",terms_text:"© Maanmittauslaitos",description:"Topographic map from the National Land Survey of Finland",icon:"https://www.maanmittauslaitos.fi/apple-touch-icon.png"},{id:"mtbmap-no",name:"MTBmap.no",type:"tms",template:"https://mtbmap.no/tiles/osm/mtbmap/{zoom}/{x}/{y}.jpg",tileSize:512,zoomExtent:[3,14],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.mtbmap.no/",terms_text:"© MTBmap.no",description:"Norwegian mountain biking map from OSM (max zoom 14-16, varies per region)",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/no/MTBmapno.png"},{id:"MunichLatestAerialImagery",name:"Munich latest aerial imagery 60cm",type:"wms",template:"https://ogc.muenchen.de/wms/opendata_luftbild?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=bgl0&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",zoomExtent:[11,22],polygon:[[[11.48878,48.053],[11.55589,48.05323],[11.55583,48.06224],[11.56915,48.06229],[11.56908,48.07128],[11.64986,48.07155],[11.64993,48.06256],[11.70326,48.06274],[11.70313,48.08074],[11.71673,48.08079],[11.71667,48.08968],[11.7299,48.08972],[11.72963,48.12566],[11.74313,48.1257],[11.74292,48.15276],[11.72943,48.15271],[11.72936,48.16152],[11.71612,48.16147],[11.71592,48.18859],[11.7027,48.18855],[11.70263,48.19752],[11.67558,48.19743],[11.67537,48.22446],[11.66176,48.22441],[11.66169,48.23355],[11.64863,48.2335],[11.64857,48.24246],[11.54064,48.2421],[11.54058,48.25093],[11.52735,48.25088],[11.52728,48.26001],[11.47335,48.25983],[11.47356,48.23291],[11.46014,48.23287],[11.46021,48.22373],[11.43336,48.22364],[11.43343,48.21439],[11.3798,48.21421],[11.37987,48.20518],[11.36607,48.20514],[11.36621,48.18741],[11.35259,48.18737],[11.35266,48.17817],[11.33946,48.17813],[11.33973,48.14216],[11.36684,48.14225],[11.36697,48.12443],[11.38083,48.12448],[11.3809,48.11558],[11.44769,48.1158],[11.44804,48.07087],[11.46186,48.07091],[11.46193,48.06193],[11.48872,48.06202],[11.48878,48.053]]],terms_url:"http://www.geodatenservice-muenchen.de/",terms_text:"Datenquelle: dl-de/by-2-0: Landeshauptstadt München – Kommunalreferat – GeodatenService – www.geodatenservice-muenchen.de",icon:"https://www.muenchen.de/media/css/images/favicon_114x114.png"},{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",zoomExtent:[0,21],polygon:[[[19.73762,41.30154],[19.88628,41.27213],[19.86877,41.38582],[19.68338,41.3732],[19.73762,41.30154]]],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",zoomExtent:[0,21],polygon:[[[19.70226,41.1404],[19.77573,41.11868],[19.86431,41.12126],[20.24986,41.3495],[20.03082,41.41184],[19.92577,41.5204],[19.88869,41.50755],[19.88937,41.42265],[19.81659,41.46177],[19.7335,41.43037],[19.74174,41.37887],[19.65797,41.37475],[19.57214,41.24322],[19.61815,41.22567],[19.67171,41.22722],[19.70226,41.1404]]],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_Latest/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:"2014-01-01T00:00:00.000Z",startDate:"2010-01-01T00:00:00.000Z",polygon:[[[-81.6792,36.5974],[-80.25359,36.54793],[-75.8409,36.5671],[-75.4323,35.6441],[-75.50475,35.18806],[-75.70525,35.17684],[-76.14745,34.94077],[-76.53472,34.55487],[-76.69676,34.66789],[-77.27904,34.53224],[-77.68828,34.26482],[-77.9435,33.8269],[-78.21288,33.89402],[-78.5301,33.8304],[-79.6693,34.7916],[-80.8122,34.8085],[-80.84685,34.96329],[-80.95122,35.05552],[-81.06383,35.01729],[-81.07482,35.13417],[-82.3632,35.1805],[-82.9989,34.9919],[-84.3333,34.9767],[-84.27184,35.28229],[-84.09056,35.27332],[-83.91478,35.53301],[-83.55498,35.5911],[-83.2556,35.73392],[-82.98644,35.81414],[-82.92327,35.96767],[-82.67882,36.0854],[-82.60192,36.08984],[-82.536,35.96989],[-82.35472,36.14752],[-82.04436,36.14309],[-81.90428,36.33803],[-81.74224,36.37342],[-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:"landsat-niger-2012_10",name:"Niger Delta Oct 2012 Landsat",type:"tms",template:"http://{switch:a,b,c,d}.imagery.paulnorman.ca/tiles/niger_oct_2012_321/{zoom}/{x}/{y}.png",endDate:"2012-10-01T00:00:00.000Z",startDate:"2012-10-01T00:00:00.000Z",zoomExtent:[1,13],polygon:[[[-6.92922,13.78574],[-5.13295,13.51884],[-5.07802,13.74039],[-3.60036,13.52418],[-3.54543,13.74039],[-2.06227,13.52685],[-1.3564,16.58454],[-3.17464,16.85285],[-3.22408,16.62665],[-4.72371,16.85022],[-4.76766,16.63455],[-6.27553,16.84759],[-6.92922,13.78574]]]},{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",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],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",zoomExtent:[0,20],polygon:[[[-74.86599,40.08543],[-74.93534,40.07256],[-75.05653,40.00868],[-75.14236,39.95791],[-75.14456,39.88322],[-75.18515,39.88042],[-75.24499,39.85486],[-75.33339,39.8495],[-75.41531,39.80156],[-75.45131,39.78304],[-75.57744,39.62346],[-75.54245,39.56827],[-75.57847,39.48183],[-74.91678,38.84647],[-74.31702,39.38739],[-74.06708,39.75155],[-73.92141,40.49222],[-74.2382,40.49378],[-74.23859,40.54916],[-74.20211,40.54924],[-74.20228,40.57648],[-74.18406,40.57609],[-74.18436,40.63146],[-74.07587,40.63078],[-74.07532,40.64457],[-74.02124,40.65811],[-74.02081,40.69919],[-74.00265,40.69929],[-74.00247,40.74037],[-73.98434,40.74026],[-73.98402,40.78145],[-73.96591,40.78158],[-73.96597,40.80868],[-73.94777,40.80861],[-73.94769,40.82232],[-73.92966,40.82225],[-73.92906,40.86355],[-73.91104,40.86329],[-73.91061,40.91838],[-73.8923,40.91831],[-73.89215,40.95961],[-73.87413,40.95942],[-73.87386,40.99251],[-74.70601,41.36513],[-74.75716,41.34769],[-74.79801,41.32268],[-74.84024,41.27864],[-74.90547,41.17038],[-74.98152,41.1126],[-75.03902,41.03819],[-75.13515,40.99441],[-75.13773,40.97309],[-75.05705,40.86757],[-75.06846,40.85037],[-75.09687,40.85096],[-75.10099,40.83927],[-75.09018,40.82238],[-75.1367,40.77729],[-75.1724,40.78067],[-75.19833,40.75389],[-75.20506,40.69131],[-75.20373,40.61832],[-75.19764,40.57367],[-75.16777,40.55907],[-75.10237,40.56702],[-75.06906,40.5365],[-75.07421,40.45505],[-75.06134,40.4165],[-75.02684,40.40252],[-74.9671,40.3952],[-74.94461,40.33817],[-74.86839,40.29157],[-74.84402,40.24796],[-74.77552,40.21428],[-74.76334,40.19172],[-74.72918,40.16392],[-74.72609,40.14949],[-74.78805,40.12468],[-74.8229,40.13033],[-74.86599,40.08543]]],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",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],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:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{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",zoomExtent:[0,20],polygon:[[[-38.48974,-12.81113],[-38.54485,-13.01392],[-38.47755,-13.03466],[-38.33473,-12.94685],[-38.30006,-12.90669],[-38.33954,-12.90435],[-38.35482,-12.83021],[-38.38091,-12.82184],[-38.40717,-12.86754],[-38.46537,-12.81599],[-38.48974,-12.81113]]],description:"Streets geometry and names of Salvador, Bahia. Source: Faces de Logradouro - IBGE.",overlay:true},{id:"kelkkareitit",name:"Nordic snowmobile overlay",type:"tms",template:"https://tiles.kelkkareitit.fi/kelkkareitit/{zoom}/{x}/{y}.png",zoomExtent:[3,18],polygon:[[[27.53173,60.21799],[31.35496,62.51233],[31.63513,62.90773],[30.09154,64.91889],[30.21239,65.87473],[29.13573,66.90422],[30.19041,67.67609],[28.70726,68.42748],[29.02587,68.9505],[31.04735,69.53452],[31.78344,70.44784],[28.32274,71.32192],[23.76342,71.29023],[17.1826,69.99806],[12.10691,68.01581],[9.97556,64.85828],[4.13084,61.95963],[4.57029,59.00664],[6.21826,57.95859],[8.14086,57.8506],[10.41502,58.75682],[12.63702,56.0383],[12.7716,55.25095],[14.2932,55.19769],[18.58886,56.84297],[20.69823,59.3444],[27.53173,60.21799]]],terms_url:"https://kelkkareitit.fi/",terms_text:"© Kelkkareitit.fi",description:"Kelkkareitit.fi snowmobile trails from OSM (Nordic coverage)",icon:"https://kelkkareitit.fi/img/favicon.png",overlay:true},{id:"geovekst-nib",name:"Norway Orthophoto",type:"tms",template:"https://waapi.webatlas.no/maptiles/tiles/webatlas-orto-newup/wa_grid/{zoom}/{x}/{y}.jpeg?api_key=b8e36d51-119a-423b-b156-d744d54123d5",zoomExtent:[0,21],polygon:[[[11.53568,58.86659],[11.66192,58.89784],[11.7935,59.09471],[11.84243,59.239],[11.82877,59.34509],[11.71279,59.60387],[11.86205,59.63771],[11.95608,59.69196],[11.93389,59.86895],[12.17881,59.8786],[12.46948,60.03124],[12.55438,60.18972],[12.51237,60.31659],[12.61793,60.40065],[12.61883,60.51512],[12.25387,61.01106],[12.69195,61.04632],[12.90756,61.34802],[12.57493,61.57623],[12.42465,61.57175],[12.15233,61.72694],[12.31212,62.26512],[12.07078,62.61109],[12.14907,62.7455],[12.08883,62.89668],[12.23464,62.99952],[11.99225,63.26684],[12.23327,63.47505],[12.17971,63.57117],[12.69313,63.96344],[13.21378,64.0839],[13.99183,64.00514],[14.17035,64.18236],[14.13253,64.47516],[13.67658,64.58356],[14.02455,64.88119],[14.33572,65.11098],[14.51699,65.30365],[14.54177,65.67762],[14.63674,65.81299],[14.53903,66.12496],[15.03881,66.14245],[15.50033,66.27956],[15.39368,66.4795],[15.63473,66.59685],[16.04695,66.90283],[16.39832,67.03827],[16.41439,67.21036],[16.10744,67.43617],[16.16455,67.5087],[16.42318,67.52589],[16.5866,67.64528],[16.7471,67.90466],[17.34741,68.09995],[17.90583,67.95885],[18.16489,68.19424],[18.13721,68.52675],[18.40761,68.57059],[18.62222,68.49607],[18.98574,68.50591],[19.92752,68.34558],[20.24505,68.49201],[19.99237,68.55586],[20.21137,68.65685],[20.34848,68.79976],[20.31623,68.93227],[20.10322,69.0359],[20.55694,69.04926],[20.7206,69.10837],[21.06178,69.02541],[21.12098,69.10587],[21.01135,69.21086],[21.2824,69.30076],[21.62645,69.26589],[22.33512,68.81965],[22.37485,68.70596],[22.5377,68.73329],[22.80161,68.67674],[23.04635,68.67833],[23.16467,68.61903],[23.68789,68.70049],[23.79776,68.81592],[23.96804,68.82287],[24.17541,68.7314],[24.76043,68.63655],[24.8544,68.55285],[24.90827,68.54387],[24.93347,68.6025],[25.12435,68.62003],[25.1667,68.79008],[25.43334,68.87886],[25.62945,68.88103],[25.79589,69.01157],[25.73272,69.19428],[26.02249,69.66758],[26.56631,69.94207],[27.10601,69.89539],[27.63679,70.05317],[27.93548,70.07401],[27.96569,70.00415],[28.40312,69.80824],[29.1014,69.69095],[29.328,69.47585],[28.82859,69.2316],[28.7931,69.0943],[29.04485,68.99986],[29.25292,69.10601],[29.32641,69.22982],[29.29229,69.27632],[29.39117,69.31298],[29.57038,69.31201],[29.85191,69.41631],[29.96795,69.39916],[30.13069,69.4667],[30.2008,69.5658],[30.13137,69.6609],[30.15678,69.66496],[30.51589,69.53787],[30.82077,69.52371],[30.95329,69.55563],[30.96221,69.67832],[30.83578,69.79192],[31.65161,70.17579],[31.78344,70.4662],[30.49255,70.86989],[28.43261,71.30079],[25.66406,71.40266],[23.81835,71.29374],[18.30322,70.40734],[14.24926,69.07641],[11.18408,67.47913],[11.74438,66.90852],[9.95361,64.88393],[4.72961,62.3649],[4.12948,61.69247],[4.08142,61.02637],[4.4577,59.19421],[5.31188,58.4276],[6.47094,57.84475],[7.56408,57.72468],[8.4375,57.91776],[10.59792,58.75006],[10.64905,58.88203],[11.09035,58.97673],[11.16173,59.06743],[11.34175,59.10293],[11.44922,58.99078],[11.45194,58.88136],[11.53568,58.86659]]],terms_url:"https://www.norgeibilder.no",terms_text:"© Geovekst",best:true,description:"Most recent Norwegian orthophotos, courtesy of Geovekst and Norkart.",icon:"https://register.geonorge.no/data/organizations/_L_norgeibilder96x96.png"},{id:"npd-offshore",name:"NPD Offshore Installations overlay",type:"wms",template:"http://gis.npd.no/ogc/factmaps/2_0?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=fclFixed,pplAll,fldByStatus&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,20],polygon:[[[8.51989,57.6454],[3.25195,56.08737],[2.61185,56.59434],[1.96321,57.90482],[1.48178,58.42936],[1.98303,60.31063],[1.78802,61.35659],[-0.49061,63.88725],[1.36226,67.01603],[14.99771,74.50082],[36.99371,74.50155],[36.99989,73.68633],[32.06909,70.27429],[23.97215,70.47356],[16.25974,68.58447],[12.12888,64.81157],[5.38328,61.92862],[5.7678,58.85355],[8.51989,57.6454]]],terms_url:"http://www.npd.no/no/Kart/Faktakart/",terms_text:"© Oljedirektoratet",description:"Production platforms and oil/natural gas fields on the Norwegian continental shelf",icon:"https://register.geonorge.no/data/organizations/870917732_od_liten.png",overlay:true},{id:"nve-snoskred",name:"NVE Avalanche Danger Areas overlay",type:"wms",template:"https://gis3.nve.no/map/services/SkredSnoAktR/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Snoskred-Aktsomhetsomrader&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,13],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/flaum-og-skred/kartlegging/aktsemdkart/aktsomhetskart-for-snoskred/",terms_text:"© NVE",description:"Potential snowslide areas, computed from theoretical height model. Valid for drops higher than 20-50 meters. Dark red=trigger area.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-nettanlegg",name:"NVE Electricity Network overlay",type:"wms",template:"https://gis3.nve.no/map/services/Nettanlegg1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Sentralnett,Regionalnett,Distribusjonsnett,Sjokabler,Master og stolper,Transformatorstasjoner&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Power lines (high voltage network) including transformers, submarine cables and pylons. Local distribution network is not included.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vannkraft",name:"NVE Hydropower Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vannkraft1/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vannkraftverk,Vannvei,Dam&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Hydropower plants including waterways (tunnel, canal, pipeline) and dams",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"nve-vindkraft",name:"NVE Wind Power Plants overlay",type:"wms",template:"https://gis3.nve.no/map/services/Vindkraft/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vindkraft_utbygd,Vindkraft_under_bygging,Vindkraftomrade_konsesjonsbehandling,Vindturbin_konsesjonsbehandling&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[6,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.nve.no/karttjenester/",terms_text:"© NVE",description:"Wind power turbines, farms and concession areas. Red colour = concession denied.",icon:"https://www.nve.no/Content/Images/nve-logo.png",overlay:true},{id:"orthos.dhses.ny.gov_latest",name:"NYS Orthos Online",type:"wms",template:"https://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",zoomExtent:[0,19],polygon:[[[-74.91231,45.03606],[-73.47788,45.02996],[-73.33846,45.03098],[-73.31978,45.00558],[-73.32265,44.98525],[-73.34852,44.9283],[-73.36721,44.8397],[-73.34277,44.81727],[-73.34565,44.77647],[-73.37296,44.73463],[-73.37008,44.67946],[-73.39739,44.64471],[-73.39308,44.60276],[-73.39739,44.54543],[-73.34996,44.51264],[-73.34565,44.49521],[-73.37871,44.4706],[-73.30828,44.43572],[-73.30397,44.41827],[-73.33271,44.33917],[-73.30828,44.27128],[-73.30828,44.25172],[-73.38014,44.14868],[-73.40458,44.04133],[-73.3399,43.79596],[-73.28097,43.64222],[-73.2091,43.54957],[-73.21342,43.51206],[-73.24647,42.67557],[-73.45919,42.14284],[-73.47069,42.03938],[-73.48794,41.73764],[-73.49944,41.64319],[-73.47788,41.62708],[-73.43189,41.57979],[-73.42614,41.56366],[-73.42685,41.45926],[-73.43979,41.40322],[-73.44985,41.38328],[-73.43835,41.37033],[-73.42757,41.35901],[-73.41751,41.3439],[-73.41895,41.27642],[-73.43045,41.24455],[-73.46566,41.19752],[-73.52962,41.14505],[-73.55477,41.13368],[-73.61586,41.13531],[-73.62664,41.10878],[-73.62736,41.05407],[-73.63958,40.99118],[-73.61873,40.98195],[-73.59933,40.96568],[-73.59933,40.93474],[-73.63455,40.91682],[-73.68054,40.89183],[-73.69851,40.87988],[-73.68629,40.87064],[-73.66257,40.87934],[-73.63814,40.90541],[-73.59789,40.91193],[-73.57562,40.9179],[-73.52675,40.92388],[-73.50159,40.94288],[-73.4901,40.95374],[-73.41751,40.96079],[-73.38374,40.96133],[-73.33702,40.95591],[-73.30828,40.93637],[-73.27091,40.92659],[-73.2091,40.91953],[-73.18682,40.92714],[-73.16814,40.93148],[-73.16598,40.95971],[-73.16886,40.97002],[-73.12933,40.98195],[-73.10777,40.98195],[-73.06681,40.9749],[-72.8584,40.97436],[-72.71826,40.98195],[-72.65574,41.00528],[-72.64424,41.00473],[-72.62628,40.99226],[-72.54148,41.03889],[-72.4768,41.06328],[-72.45811,41.08928],[-72.41859,41.09308],[-72.36612,41.13856],[-72.36037,41.1418],[-72.32229,41.15479],[-72.29067,41.16399],[-72.21449,41.18238],[-72.20083,41.19157],[-72.04848,41.25914],[-72.02548,41.2937],[-71.93924,41.30774],[-71.92343,41.30666],[-71.90259,41.2991],[-71.90187,41.28939],[-71.99458,41.24509],[-72.10453,41.19806],[-72.18287,41.16723],[-72.18934,41.16237],[-72.25186,41.12232],[-72.30432,41.10445],[-72.31582,41.09524],[-72.27917,41.08441],[-72.2727,41.08062],[-72.26839,41.04973],[-72.21736,41.04811],[-72.19652,41.04215],[-72.18646,41.05298],[-72.17137,41.0584],[-72.14981,41.05895],[-72.15628,41.09633],[-72.15268,41.1077],[-72.14909,41.14667],[-72.134,41.14505],[-72.07076,41.10553],[-72.07435,41.05678],[-72.08657,41.03185],[-72.10957,41.0069],[-72.08729,41.01287],[-72.06213,41.02534],[-72.04561,41.03239],[-72.01902,41.03293],[-72.00895,41.04215],[-72.00177,41.05136],[-71.96368,41.07737],[-71.922,41.08874],[-71.88966,41.08766],[-71.85588,41.08062],[-71.84582,41.07466],[-71.85588,41.05298],[-71.89038,41.03727],[-71.91625,41.03022],[-71.99099,41.00365],[-72.07938,40.97273],[-72.31941,40.88205],[-72.4423,40.8402],[-72.62771,40.7869],[-72.76569,40.75043],[-72.88499,40.71286],[-72.95973,40.68671],[-73.03735,40.66],[-73.08118,40.64855],[-73.22994,40.61637],[-73.32193,40.6131],[-73.35211,40.61855],[-73.55477,40.56944],[-73.75959,40.57708],[-73.88248,40.54815],[-73.9335,40.53449],[-73.945,40.53395],[-73.94572,40.56289],[-74.08227,40.56234],[-74.08011,40.54924],[-74.12251,40.52084],[-74.15772,40.51373],[-74.18719,40.50117],[-74.22887,40.48696],[-74.26121,40.48532],[-74.2763,40.4957],[-74.27918,40.54378],[-74.26983,40.56671],[-74.25834,40.57217],[-74.22528,40.57217],[-74.226,40.58309],[-74.25115,40.59564],[-74.25259,40.62237],[-74.24324,40.64091],[-74.2339,40.64909],[-74.20228,40.654],[-74.12538,40.65673],[-74.11532,40.69107],[-74.09951,40.68998],[-74.07795,40.71068],[-74.06286,40.7183],[-74.05208,40.7439],[-74.02549,40.79288],[-73.98094,40.86901],[-73.96225,40.92551],[-73.94931,40.96459],[-73.94644,40.99877],[-73.98165,41.01612],[-74.04561,41.04323],[-74.18072,41.09524],[-74.30792,41.14938],[-74.44087,41.21537],[-74.52783,41.25914],[-74.61335,41.30234],[-74.65791,41.31098],[-74.70246,41.33581],[-74.76714,41.38975],[-74.79661,41.41023],[-74.85338,41.42263],[-74.90728,41.43179],[-74.99783,41.47111],[-75.04167,41.52708],[-75.08479,41.59323],[-75.08407,41.61848],[-75.07329,41.66467],[-75.08766,41.70278],[-75.08766,41.71351],[-75.12144,41.76177],[-75.11928,41.79232],[-75.13078,41.81696],[-75.18755,41.83838],[-75.25295,41.84962],[-75.28745,41.85497],[-75.29823,41.88227],[-75.30613,41.9304],[-75.34063,41.94003],[-75.3665,41.9566],[-75.37225,41.97744],[-75.58066,41.97957],[-75.58137,41.92399],[-75.78906,41.92666],[-75.78691,41.98278],[-79.77687,41.98118],[-79.7819,42.20994],[-79.77184,42.28017],[-79.72153,42.29824],[-79.57349,42.36731],[-79.42976,42.46599],[-79.3737,42.49991],[-79.25728,42.54546],[-79.18973,42.5624],[-79.16529,42.56981],[-79.12074,42.62483],[-79.0963,42.64598],[-79.06899,42.6967],[-79.03162,42.71043],[-78.98851,42.72311],[-78.88358,42.77693],[-78.88646,42.8149],[-78.93964,42.88655],[-78.93964,42.93603],[-79.04887,42.96969],[-79.04743,43.05167],[-79.09343,43.05272],[-79.09199,43.09262],[-79.08624,43.26556],[-79.06468,43.27602],[-78.84909,43.33041],[-78.72979,43.35237],[-78.63924,43.37013],[-78.54869,43.37953],[-78.47826,43.38789],[-77.95508,43.38476],[-77.73158,43.34714],[-77.71146,43.34034],[-77.66259,43.31159],[-77.61516,43.28387],[-77.55336,43.253],[-77.5282,43.25509],[-77.45634,43.27864],[-77.42256,43.28492],[-77.16385,43.29433],[-77.0503,43.29381],[-76.94178,43.29329],[-76.91447,43.30793],[-76.85051,43.3163],[-76.80236,43.32832],[-76.75996,43.35184],[-76.64785,43.42809],[-76.54509,43.48026],[-76.51993,43.49486],[-76.44304,43.52717],[-76.4222,43.53811],[-76.28206,43.53863],[-76.23822,43.55686],[-76.24038,43.74147],[-76.30649,43.82915],[-76.31152,43.8675],[-76.34602,43.8618],[-76.40064,43.86128],[-76.47178,43.88408],[-76.46675,43.90893],[-76.4186,43.93119],[-76.37189,43.93223],[-76.36974,43.90272],[-76.33308,43.92964],[-76.27847,43.92964],[-76.27847,43.90427],[-76.26697,43.89599],[-76.23607,43.91204],[-76.19295,43.93326],[-76.19007,43.95086],[-76.21523,43.96017],[-76.25044,43.94982],[-76.31224,43.94775],[-76.30578,43.9762],[-76.33093,44.00464],[-76.39561,44.0248],[-76.39848,44.06251],[-76.37548,44.06457],[-76.3762,44.0909],[-76.47107,44.09297],[-76.46604,44.10948],[-76.44232,44.1296],[-76.39848,44.13218],[-76.39776,44.20435],[-76.3762,44.21671],[-76.23966,44.21929],[-76.23966,44.22804],[-76.21738,44.22856],[-76.21523,44.3479],[-76.11893,44.37103],[-76.04634,44.39157],[-75.93423,44.43418],[-75.83721,44.50341],[-75.76822,44.55823],[-75.69923,44.60379],[-75.63168,44.64829],[-75.56772,44.70501],[-75.50448,44.74586],[-75.45274,44.78157],[-75.31763,44.8723],[-75.15378,44.93745],[-75.09054,44.97305],[-74.97411,45.02793],[-74.91985,45.03682],[-74.91231,45.03606]]],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:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/ny/NYS_Orthos_Online.png"},{id:"olho_dagua_do_casado",name:"Olho d'Agua do Casado AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.7822,-9.54444],[-37.7826,-9.45388],[-37.81147,-9.45412],[-37.81735,-9.45451],[-37.82057,-9.45416],[-37.87394,-9.45428],[-37.87358,-9.54475],[-37.7822,-9.54444]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"osmbe-nl",name:"OpenStreetMap (Belgian Style - Dutch)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-nl/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osmbe-fr",name:"OpenStreetMap (Belgian Style - French)",type:"tms",template:"https://tile.openstreetmap.be/osmbe-fr/{zoom}/{x}/{y}.png",zoomExtent:[0,18],polygon:[[[5.47007,49.49196],[5.44409,49.51409],[5.46213,49.53677],[5.43766,49.54766],[5.42566,49.59145],[5.40775,49.60448],[5.35207,49.62396],[5.34232,49.61192],[5.30544,49.60645],[5.3026,49.63608],[5.32535,49.6575],[5.27025,49.68827],[5.24458,49.67985],[5.16215,49.6918],[5.16164,49.71172],[5.12622,49.70442],[5.09058,49.75946],[5.06262,49.75724],[5.01261,49.77534],[4.9921,49.79533],[4.95485,49.79586],[4.94404,49.78583],[4.90589,49.78055],[4.84827,49.78972],[4.86599,49.81918],[4.84266,49.86913],[4.85659,49.86973],[4.87961,49.91078],[4.84433,49.94482],[4.78844,49.95381],[4.78535,49.97018],[4.79004,49.98569],[4.81194,49.99563],[4.81579,50.02853],[4.83599,50.04069],[4.82339,50.04664],[4.81641,50.06702],[4.83456,50.06856],[4.83709,50.09442],[4.84472,50.10023],[4.85447,50.1029],[4.866,50.09623],[4.86587,50.12038],[4.8776,50.13223],[4.89443,50.13779],[4.88043,50.1403],[4.87725,50.15205],[4.8529,50.15168],[4.83169,50.1526],[4.82334,50.15923],[4.78067,50.14092],[4.76486,50.13634],[4.75217,50.11158],[4.71293,50.09598],[4.70278,50.09336],[4.68851,50.06595],[4.70309,50.05587],[4.68731,50.01802],[4.69495,49.99662],[4.69461,49.99504],[4.63074,49.98584],[4.58965,49.98336],[4.55981,49.96757],[4.54315,49.9679],[4.52365,49.94973],[4.51156,49.94579],[4.47953,49.94584],[4.44588,49.93656],[4.40593,49.94785],[4.39149,49.94697],[4.38072,49.95088],[4.34921,49.95202],[4.3137,49.96541],[4.19616,49.9536],[4.19304,49.95746],[4.19582,49.96629],[4.13704,49.97691],[4.15996,49.99544],[4.13683,50.00786],[4.13272,50.01973],[4.16174,50.05032],[4.17458,50.04772],[4.22857,50.06873],[4.19529,50.10571],[4.19766,50.12037],[4.19566,50.13394],[4.15448,50.12716],[4.13656,50.12909],[4.12568,50.13511],[4.13677,50.15213],[4.14989,50.1647],[4.14686,50.17314],[4.15567,50.19785],[4.14799,50.21344],[4.15979,50.21579],[4.19179,50.24106],[4.21836,50.25492],[4.20676,50.27068],[4.17487,50.27492],[4.16567,50.28779],[4.155,50.27742],[4.16937,50.26848],[4.16851,50.25626],[4.13426,50.25572],[4.13228,50.26754],[4.12086,50.27276],[4.12139,50.29732],[4.10928,50.30112],[4.0977,50.31201],[4.08017,50.30809],[4.07339,50.31754],[4.03817,50.33987],[4.02738,50.35491],[3.98611,50.34137],[3.96482,50.34012],[3.96355,50.34742],[3.90223,50.3257],[3.88419,50.32554],[3.88429,50.33511],[3.85645,50.34099],[3.84244,50.35243],[3.81321,50.34251],[3.80551,50.35098],[3.74124,50.34624],[3.73556,50.32532],[3.73175,50.30705],[3.70911,50.3021],[3.68231,50.31988],[3.66397,50.34724],[3.65542,50.37075],[3.66788,50.38597],[3.67276,50.40227],[3.66777,50.42262],[3.66743,50.43635],[3.65685,50.4464],[3.66129,50.45399],[3.64419,50.4618],[3.6099,50.4935],[3.58162,50.48917],[3.56897,50.4982],[3.49868,50.48577],[3.49448,50.49918],[3.51582,50.52075],[3.4742,50.53204],[3.44739,50.50415],[3.43663,50.5083],[3.42736,50.50327],[3.37405,50.48993],[3.35949,50.50325],[3.32767,50.50732],[3.31872,50.51788],[3.30319,50.51966],[3.28718,50.52552],[3.27549,50.53872],[3.27524,50.59381],[3.25497,50.62115],[3.24349,50.64031],[3.23893,50.65864],[3.24019,50.67023],[3.26029,50.67692],[3.25131,50.69091],[3.25881,50.69312],[3.24518,50.71225],[3.23779,50.71086],[3.22148,50.70958],[3.20498,50.71072],[3.18953,50.72603],[3.19445,50.7316],[3.14457,50.78871],[3.12547,50.78553],[3.11348,50.79278],[3.10455,50.78042],[3.08585,50.77064],[3.05758,50.77987],[3.04064,50.77484],[3.03691,50.77003],[3.02927,50.76813],[3.01945,50.77263],[2.99536,50.76043],[2.96822,50.74763],[2.9557,50.75181],[2.93962,50.74441],[2.94602,50.73167],[2.9349,50.72822],[2.92939,50.70786],[2.92206,50.70224],[2.91184,50.70267],[2.91281,50.69463],[2.90742,50.69209],[2.90017,50.69202],[2.88533,50.70547],[2.87992,50.70199],[2.86855,50.70242],[2.84646,50.72043],[2.81843,50.71386],[2.78869,50.72508],[2.77811,50.74686],[2.76469,50.75397],[2.75409,50.76251],[2.75922,50.77052],[2.73745,50.77967],[2.7236,50.79079],[2.71636,50.8123],[2.6788,50.81207],[2.67057,50.81562],[2.63543,50.80987],[2.61055,50.84419],[2.59427,50.84743],[2.60628,50.86565],[2.60151,50.90993],[2.58525,50.91825],[2.62479,50.94743],[2.62148,50.95406],[2.60263,50.98638],[2.56946,51.00113],[2.55892,51.06596],[2.34072,51.31453],[3.01078,51.59839],[3.32658,51.43728],[3.37581,51.3584],[3.38739,51.33392],[3.36094,51.31523],[3.3789,51.30251],[3.36832,51.29778],[3.38177,51.28732],[3.38342,51.27485],[3.38922,51.27329],[3.41852,51.25984],[3.43471,51.24621],[3.45031,51.24219],[3.527,51.24651],[3.51433,51.28799],[3.54179,51.29123],[3.56145,51.29637],[3.57559,51.29428],[3.58905,51.30652],[3.63839,51.29078],[3.6582,51.29056],[3.69139,51.28043],[3.71763,51.27428],[3.77605,51.26777],[3.79652,51.25635],[3.79031,51.24163],[3.78934,51.22711],[3.79294,51.21546],[3.85827,51.21334],[3.88901,51.22423],[3.89467,51.21743],[3.88782,51.20283],[3.91256,51.20837],[3.91482,51.21509],[3.9281,51.22508],[3.93751,51.2174],[3.95603,51.22117],[4.01551,51.24825],[4.0551,51.24402],[4.1651,51.2938],[4.23804,51.35274],[4.21772,51.36206],[4.21546,51.37487],[4.33535,51.37775],[4.34197,51.36012],[4.38556,51.35574],[4.39906,51.35785],[4.42462,51.3668],[4.42309,51.37577],[4.38147,51.41805],[4.39426,51.44251],[4.37771,51.44595],[4.38055,51.45075],[4.4768,51.47912],[4.53739,51.48358],[4.54967,51.47364],[4.53097,51.44965],[4.53758,51.42456],[4.57427,51.43404],[4.6431,51.42478],[4.64951,51.42741],[4.66744,51.42777],[4.66465,51.44625],[4.69115,51.45283],[4.70175,51.46691],[4.72792,51.48435],[4.74476,51.48977],[4.74945,51.49905],[4.75827,51.50302],[4.7766,51.50625],[4.81666,51.49552],[4.82318,51.48441],[4.84355,51.48177],[4.83884,51.46588],[4.84529,51.45817],[4.82521,51.44674],[4.83103,51.42488],[4.88072,51.4166],[4.91431,51.45952],[4.95767,51.4548],[4.94134,51.42928],[4.93775,51.40655],[4.96007,51.42194],[4.99955,51.44324],[5.00816,51.47134],[5.01937,51.48074],[5.03235,51.48827],[5.04093,51.4876],[5.04722,51.47217],[5.08032,51.47226],[5.10643,51.43135],[5.0727,51.39365],[5.11662,51.36118],[5.13225,51.3472],[5.13581,51.31594],[5.15592,51.31278],[5.20039,51.32325],[5.24326,51.3057],[5.22742,51.26844],[5.238,51.26255],[5.26216,51.26778],[5.335,51.26474],[5.34493,51.27681],[5.41551,51.2639],[5.44065,51.28246],[5.48215,51.30064],[5.51628,51.29599],[5.55816,51.26613],[5.56283,51.22287],[5.65253,51.19899],[5.65947,51.19052],[5.71011,51.18671],[5.74598,51.19455],[5.76873,51.18843],[5.78118,51.18082],[5.78447,51.15925],[5.82594,51.16827],[5.85709,51.14477],[5.83976,51.12993],[5.81435,51.11524],[5.83555,51.10842],[5.8338,51.09577],[5.82291,51.09124],[5.8119,51.0943],[5.79816,51.09023],[5.80612,51.07955],[5.80458,51.05888],[5.77731,51.05804],[5.76027,51.03223],[5.77383,51.02859],[5.77829,51.02399],[5.76759,51.00526],[5.76846,50.9985],[5.76419,50.99502],[5.74816,50.98087],[5.72174,50.96128],[5.73469,50.95683],[5.7426,50.96113],[5.74604,50.96209],[5.75617,50.95898],[5.76011,50.95227],[5.73223,50.9221],[5.72625,50.9059],[5.70051,50.90955],[5.69711,50.8958],[5.68051,50.88068],[5.64516,50.86533],[5.64337,50.84974],[5.64049,50.84701],[5.64576,50.83961],[5.64567,50.83789],[5.65094,50.83431],[5.65568,50.82591],[5.70296,50.80821],[5.69338,50.79687],[5.70259,50.78396],[5.69204,50.75629],[5.7218,50.76538],[5.73762,50.75842],[5.73912,50.76522],[5.76476,50.7837],[5.77748,50.78344],[5.78519,50.7684],[5.7927,50.77138],[5.80759,50.75681],[5.84525,50.76609],[5.84901,50.75975],[5.88667,50.77108],[5.89689,50.75501],[5.95896,50.76308],[6.02001,50.75521],[6.04208,50.74557],[6.03953,50.7295],[6.11623,50.72364],[6.1491,50.68465],[6.16312,50.67169],[6.17755,50.65576],[6.18715,50.6505],[6.18348,50.6457],[6.18205,50.63583],[6.26822,50.62829],[6.27251,50.62033],[6.24102,50.58657],[6.22795,50.58535],[6.18304,50.55597],[6.1833,50.54646],[6.19789,50.53715],[6.22586,50.49832],[6.26954,50.50961],[6.35349,50.49244],[6.34706,50.46422],[6.37423,50.45989],[6.3825,50.43975],[6.37408,50.40637],[6.35129,50.38206],[6.40305,50.34866],[6.41162,50.32769],[6.40783,50.31893],[6.38558,50.31658],[6.36388,50.30021],[6.32792,50.3186],[6.31289,50.31636],[6.29335,50.2909],[6.29547,50.27422],[6.28111,50.26236],[6.23624,50.25692],[6.21151,50.24816],[6.1981,50.23275],[6.18166,50.23125],[6.1789,50.22147],[6.19337,50.20761],[6.19683,50.17988],[6.15231,50.16841],[6.15923,50.14002],[6.13978,50.12527],[6.10856,50.1326],[6.11273,50.16093],[6.10156,50.16551],[6.08452,50.16697],[6.0821,50.15275],[6.06344,50.14834],[6.03055,50.15829],[6.02136,50.17685],[5.96932,50.16795],[5.96515,50.12813],[5.90347,50.11172],[5.89064,50.07554],[5.86237,50.06368],[5.8749,50.04624],[5.86392,50.02594],[5.82586,50.00934],[5.82665,50.00135],[5.8448,49.99123],[5.83952,49.9756],[5.80883,49.95773],[5.78215,49.957],[5.76822,49.91307],[5.74481,49.89975],[5.78087,49.88794],[5.78897,49.87213],[5.77636,49.86265],[5.75667,49.8703],[5.76191,49.85693],[5.75803,49.84287],[5.74291,49.83555],[5.75151,49.81985],[5.75473,49.79514],[5.7909,49.79765],[5.8179,49.75977],[5.83544,49.74713],[5.82702,49.72616],[5.86996,49.72777],[5.88817,49.70952],[5.86372,49.68213],[5.91262,49.66488],[5.90382,49.65192],[5.90876,49.63876],[5.89899,49.63401],[5.89117,49.63469],[5.87663,49.60771],[5.84953,49.59399],[5.87403,49.58991],[5.8736,49.57435],[5.84053,49.55222],[5.82582,49.54931],[5.81858,49.5461],[5.79504,49.55029],[5.77149,49.55832],[5.76226,49.554],[5.76126,49.53952],[5.74792,49.53452],[5.73009,49.53954],[5.6987,49.53744],[5.66008,49.55039],[5.64371,49.54565],[5.6228,49.5283],[5.62589,49.51698],[5.61175,49.50102],[5.59116,49.51734],[5.55638,49.52373],[5.54257,49.5105],[5.47007,49.49196]]],terms_url:"https://openstreetmap.org/",terms_text:"© OpenStreetMap contributors, CC-BY-SA; Tiles courtesy of GEO-6",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"MAPNIK",name:"OpenStreetMap (Standard)",type:"tms",template:"https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png",zoomExtent:[0,19],terms_url:"https://www.openstreetmap.org",terms_text:"© OpenStreetMap contributors, CC-BY-SA","default":true,description:"The default OpenStreetMap layer.",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png"},{id:"osm-gps",name:"OpenStreetMap GPS traces",type:"tms",template:"https://{switch:a,b,c}.gps-tile.openstreetmap.org/lines/{zoom}/{x}/{y}.png",zoomExtent:[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:"https://osmlab.github.io/editor-layer-index/sources/world/OpenStreetMap-GPS.png",overlay:true},{id:"osm-hu-ortho",name:"openstreetmap.hu orthophotos",type:"tms",template:"http://adam.openstreetmap.hu/mapproxy/tiles/1.0.0/openstreetmap.hu.orthophotos/mercator/{zoom}/{x}/{y}.png",zoomExtent:[0,21],polygon:[[[18.8577,47.44553],[18.86169,47.44883],[18.86491,47.44704],[18.8609,47.44373],[18.8577,47.44553]],[[18.80614,47.59304],[18.81376,47.5974],[18.82295,47.59011],[18.81533,47.58574],[18.80614,47.59304]],[[17.66691,46.92167],[17.66369,46.93033],[17.67207,46.93178],[17.67529,46.92312],[17.66691,46.92167]],[[17.6725,46.93546],[17.67529,46.92708],[17.68409,46.92845],[17.68129,46.93683],[17.6725,46.93546]],[[17.82155,46.96075],[17.82507,46.9547],[17.83347,46.95701],[17.82995,46.96304],[17.82155,46.96075]],[[18.62796,47.19818],[18.63943,47.20324],[18.64953,47.1926],[18.63806,47.18753],[18.62796,47.19818]],[[17.51223,46.8789],[17.51406,46.88166],[17.5214,46.87939],[17.51957,46.87662],[17.51223,46.8789]],[[17.67724,46.91844],[17.68718,46.92344],[17.70594,46.90603],[17.69249,46.89926],[17.68144,46.90951],[17.68275,46.90595],[17.68198,46.90582],[17.68667,46.89926],[17.67947,46.89686],[17.67405,46.90445],[17.67131,46.90398],[17.66666,46.91662],[17.67724,46.91844]],[[18.80776,47.55615],[18.81638,47.55969],[18.81351,47.56305],[18.80473,47.55949],[18.80776,47.55615]],[[18.98706,47.46989],[18.97962,47.47042],[18.98056,47.47648],[18.988,47.47595],[18.98706,47.46989]],[[18.98356,47.41149],[19.00839,47.42511],[19.01568,47.41932],[18.9907,47.40518],[18.98356,47.41149]],[[19.02652,47.87563],[19.03163,47.87613],[19.03305,47.86957],[19.02793,47.86907],[19.02652,47.87563]],[[18.00803,46.86674],[18.01095,46.86028],[18.01323,46.86064],[18.01626,46.8536],[18.01682,46.85371],[18.01852,46.84948],[18.02021,46.84631],[18.02961,46.84829],[18.02742,46.85392],[18.03388,46.85534],[18.03056,46.86395],[18.03367,46.86456],[18.03058,46.87154],[18.00803,46.86674]],[[17.99509,46.87632],[17.98585,46.87595],[17.98535,46.88397],[17.98599,46.88412],[17.98531,46.88537],[17.95829,46.87876],[17.96077,46.87351],[17.92868,46.86631],[17.92467,46.87372],[17.93136,46.87535],[17.92995,46.87822],[17.9553,46.88415],[17.9946,46.89341],[17.99786,46.88671],[17.98771,46.88443],[17.98774,46.88411],[17.99415,46.88442],[17.99509,46.87632]],[[18.86533,47.42808],[18.87291,47.42455],[18.87701,47.42871],[18.86799,47.43238],[18.86774,47.43208],[18.86517,47.43317],[18.86477,47.4327],[18.86441,47.43285],[18.86288,47.43108],[18.86328,47.43092],[18.86288,47.43046],[18.86516,47.42947],[18.86448,47.42875],[18.86553,47.42829],[18.86533,47.42808]],[[19.16232,47.59776],[19.16893,47.59033],[19.17815,47.59512],[19.17291,47.60068],[19.16232,47.59776]],[[18.13162,47.02619],[18.14103,47.02111],[18.13923,47.01957],[18.15704,47.01044],[18.16271,47.00242],[18.16463,46.99571],[18.16639,46.9959],[18.16702,46.99363],[18.17101,46.99454],[18.1722,46.99571],[18.16977,47.00416],[18.17656,47.00709],[18.1761,47.00771],[18.17639,47.00781],[18.17057,47.01414],[18.1748,47.01815],[18.17782,47.01428],[18.18518,47.01746],[18.17933,47.0239],[18.17589,47.02268],[18.17277,47.02434],[18.17219,47.02377],[18.17159,47.02407],[18.16938,47.0221],[18.16216,47.02596],[18.16485,47.02832],[18.16245,47.02947],[18.16323,47.03025],[18.1521,47.03554],[18.15156,47.03498],[18.1503,47.03563],[18.14513,47.03112],[18.14337,47.0322],[18.1454,47.03419],[18.14441,47.03467],[18.14522,47.03539],[18.14168,47.03697],[18.13111,47.02745],[18.13226,47.0269],[18.13162,47.02619]],[[17.79852,46.81745],[17.79178,46.81585],[17.79601,46.80664],[17.7948,46.80598],[17.79693,46.80056],[17.80109,46.79993],[17.80736,46.80225],[17.79852,46.81745]],[[17.7788,46.81461],[17.78446,46.80714],[17.79083,46.80925],[17.7853,46.81683],[17.7788,46.81461]]],terms_text:"openstreetmap.hu"},{id:"OpenTopoMap",name:"OpenTopoMap",type:"tms",template:"https://{switch:a,b,c}.tile.opentopomap.org/{zoom}/{x}/{y}.png",zoomExtent:[3,17],terms_url:"https://tile.opentopomap.org/about#verwendung",terms_text:"Kartendaten: © OpenStreetMap-Mitwirkende, SRTM | Kartendarstellung: © OpenTopoMap (CC-BY-SA)",icon:"https://osmlab.github.io/editor-layer-index/sources/world/OpenTopoMap.png"},{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",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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:"ORTOFOTO_V1",name:"Orthophoto 1st cycle (1994-1999) - Latvia",type:"wms",template:"https://services.lgia.gov.lv/arcfree/services/Ortofoto_v1/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:[[[27.66415,55.75354],[27.68475,55.93319],[28.26703,56.1908],[28.23682,56.49827],[27.82757,56.94886],[27.90997,57.37037],[27.58313,57.56387],[26.93219,57.63598],[26.5202,57.58596],[26.0368,57.87192],[25.1991,58.10487],[24.31744,57.90258],[24.31744,57.19669],[23.93567,56.9788],[23.55115,56.98479],[23.23804,57.10283],[23.14465,57.37333],[22.60632,57.60215],[22.60083,57.76953],[21.66699,57.56681],[21.40057,57.29625],[21.38409,57.0177],[21.04626,56.80026],[20.99133,56.36615],[21.0545,56.0392],[21.28796,56.05608],[21.29895,56.1908],[22.11743,56.41936],[24.44379,56.24425],[24.81183,56.3996],[25.15515,56.1694],[25.58087,56.12962],[26.53668,55.66146],[26.91296,55.66766],[27.0805,55.80991],[27.66415,55.75354]]],terms_text:"Latvijas Ģeotelpiskās informācijas aģentūras brīvais WMS serviss 1994 - 1999.gada Latvijas ortofotokarte"},{id:"ORTOS_DGRF_2004_06",name:"Ortofotos DGRF 2004-2006 (WMS)",type:"wms",template:"http://mapas.dgterritorio.pt:8888/wms/produtos?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortos&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2006-01-01T00:00:00.000Z",startDate:"2004-01-01T00:00:00.000Z",zoomExtent:[14,19],polygon:[[[-7.31278,36.98391],[-7.44461,37.5718],[-7.1933,37.97019],[-6.97357,38.00807],[-6.90628,38.24142],[-7.06627,38.20743],[-7.27158,38.45628],[-7.20429,38.72356],[-7.0134,38.85468],[-6.91315,39.03839],[-6.97357,39.13113],[-7.17957,39.23651],[-7.28668,39.48497],[-7.44873,39.61838],[-7.34162,39.60886],[-6.99692,39.64906],[-6.81839,40.0192],[-7.01065,40.19986],[-6.85272,40.24285],[-6.76209,40.35073],[-6.77994,40.8886],[-6.88637,41.01151],[-6.79642,41.01721],[-6.63849,41.21689],[-6.4531,41.24116],[-6.29311,41.38763],[-6.15715,41.5908],[-6.31165,41.68932],[-6.51215,41.71188],[-6.49841,41.88081],[-6.56296,41.97991],[-6.80191,42.00951],[-7.20497,42.00135],[-7.22763,41.8849],[-7.36908,41.87058],[-7.72751,41.92885],[-7.92526,41.94009],[-8.07907,41.84706],[-8.1601,41.91812],[-8.01796,42.05031],[-8.19924,42.18681],[-8.39356,42.1023],[-8.66066,42.07886],[-8.88382,41.88081],[-9.17084,41.86956],[-9.04175,41.43655],[-9.01978,40.65981],[-9.15711,40.26695],[-9.81903,39.52099],[-9.74213,38.6512],[-9.12964,37.88136],[-9.27246,36.99378],[-9.09394,36.68604],[-7.80579,36.74989],[-7.31278,36.98391]]],terms_url:"http://www.dgterritorio.pt/dados_abertos/ortofotos/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"ORTOS_DGT_2014_15",name:"Ortofotos Litoral DGT 2014-2015 (WMS)",type:"wms",template:"http://ows.dgterritorio.pt/wss/service/ortos2014-2015-wms/guest?language=por&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Ortoimagens_2014-2015_Litoral&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[1,20],polygon:[[[-7.38968,37.19205],[-7.52426,37.18002],[-7.89505,36.98171],[-8.15186,37.10886],[-8.65036,37.14062],[-8.95111,37.03545],[-8.78632,37.34833],[-8.76434,37.55111],[-8.7561,38.38258],[-8.47664,38.33466],[-8.47183,38.40141],[-8.66066,38.46596],[-8.66959,38.60882],[-9.142,38.53689],[-8.81104,38.67372],[-8.79318,38.85468],[-8.95935,38.9829],[-9.18732,38.84934],[-9.2395,38.72838],[-9.37821,38.74659],[-9.38233,39.07891],[-9.29169,39.2514],[-9.31915,39.33642],[-9.17084,39.38526],[-9.06372,39.48815],[-9.02252,39.69662],[-8.78632,40.14529],[-8.86322,40.2093],[-8.72589,40.53155],[-8.64075,40.50858],[-8.62427,40.63063],[-8.53089,40.6004],[-8.535,40.71292],[-8.61466,40.89275],[-8.61878,41.10419],[-8.53089,41.16728],[-8.66959,41.21689],[-8.72315,41.41081],[-8.76984,41.65958],[-8.66547,41.73955],[-8.81104,41.72316],[-8.81104,41.85217],[-8.74649,41.9125],[-8.83576,41.93089],[-8.91815,41.84501],[-8.89343,41.70778],[-8.82065,41.50755],[-8.73139,41.16315],[-8.67508,41.069],[-8.68469,40.90729],[-8.93326,40.17573],[-8.88107,40.12219],[-9.11453,39.64694],[-9.11865,39.5623],[-9.3013,39.40543],[-9.43039,39.37571],[-9.34799,39.23864],[-9.45099,39.04799],[-9.45786,38.89317],[-9.53201,38.78835],[-9.50043,38.68551],[-9.28894,38.663],[-9.19418,38.54172],[-9.25324,38.38473],[-9.03488,38.42347],[-8.92502,38.46757],[-8.81241,38.35997],[-8.7973,38.14968],[-8.91953,37.95286],[-8.84262,37.8651],[-8.83988,37.40617],[-9.02664,37.01023],[-8.92914,36.97513],[-8.61466,37.099],[-8.15048,37.05956],[-7.8923,36.93672],[-7.48993,37.15156],[-7.39105,37.15813],[-7.38968,37.19205]]],terms_url:"http://www.dgterritorio.pt/",terms_text:"Direcção-Geral do Território",icon:"http://www.igeo.pt/favicon.ico"},{id:"OS-historic-25k-OSM_Limited",name:"OS 1:25k historic (OSM)",type:"tms",template:"https://ooc.openstreetmap.org/os1/{zoom}/{x}/{y}.jpg",zoomExtent:[6,17],polygon:[[[-6.45854,49.90441],[-6.3872,49.98411],[-6.22968,49.98962],[-6.21713,49.86801],[-6.45512,49.85918],[-6.45854,49.90441]],[[-1.44951,60.86341],[-0.71671,60.85451],[-0.73497,60.43598],[-0.69388,60.41682],[-0.72584,60.39427],[-0.73954,60.04847],[-0.92674,60.04619],[-0.93815,59.82662],[-1.45865,59.8312],[-1.44552,60.0536],[-1.46321,60.0536],[-1.46435,60.063],[-1.57165,60.06385],[-1.56936,60.179],[-1.64356,60.1807],[-1.64356,60.18922],[-1.82162,60.1895],[-1.82048,60.36155],[-1.8416,60.36973],[-1.82162,60.38328],[-1.81799,60.59343],[-1.45317,60.59343],[-1.44951,60.86341]],[[-4.90892,54.42421],[-4.2826,54.44299],[-4.25354,54.02977],[-4.87664,54.02218],[-4.90892,54.42421]],[[-5.86674,59.14446],[-5.776,59.14709],[-5.772,59.10141],[-5.86218,59.09906],[-5.86674,59.14446]],[[-1.70659,59.57036],[-1.55792,59.56935],[-1.55649,59.49657],[-1.70545,59.49758],[-1.70659,59.57036]],[[-7.68658,58.2941],[-7.53306,58.3007],[-7.52564,58.26469],[-7.67973,58.25779],[-7.68658,58.2941]],[[-4.53383,59.03599],[-4.48132,59.03716],[-4.47961,59.01866],[-4.53326,59.01807],[-4.53383,59.03599]],[[-8.67107,57.87699],[-8.46732,57.88973],[-8.44678,57.7907],[-8.65109,57.77792],[-8.67107,57.87699]],[[-5.23955,50.35306],[-5.79201,50.33849],[-5.76005,49.9317],[-4.65514,49.95815],[-4.67797,50.28601],[-4.24422,50.28017],[-4.24878,50.20425],[-3.38129,50.20425],[-3.42238,50.51882],[-3.11648,50.52463],[-3.12105,50.65796],[-2.67364,50.66195],[-2.59535,50.63943],[-2.5905,50.57284],[-2.47912,50.57335],[-2.47589,50.50667],[-2.39679,50.50564],[-2.40164,50.57233],[-1.04003,50.57182],[-1.03357,50.70593],[-0.5493,50.70388],[-0.54607,50.78866],[-0.09247,50.7856],[-0.08763,50.71819],[0.47897,50.71206],[0.48704,50.81825],[0.97615,50.80499],[0.99229,51.01263],[1.44912,51.00044],[1.47818,51.40904],[1.02296,51.42716],[1.03588,51.76409],[1.61054,51.7501],[1.64606,52.156],[1.72677,52.15402],[1.74937,52.44818],[1.78707,52.48116],[1.7591,52.52251],[1.79335,52.96027],[0.37981,52.99585],[0.38952,53.25112],[0.34786,53.25112],[0.32389,53.28219],[0.34615,53.65385],[0.12849,53.65755],[0.11658,53.66747],[0.13506,54.06557],[-0.06098,54.06591],[-0.04142,54.47094],[-0.56627,54.47718],[-0.55921,54.65651],[-1.16656,54.66235],[-1.16374,54.84261],[-1.33162,54.84391],[-1.32571,55.24708],[-1.52945,55.24871],[-1.52418,55.65401],[-1.76388,55.65401],[-1.77337,55.97191],[-2.16079,55.9683],[-2.15433,56.06214],[-2.45781,56.05853],[-2.41906,56.64172],[-2.09622,56.64172],[-2.0833,57.00213],[-1.92834,57.01268],[-1.9181,57.35909],[-1.75022,57.36257],[-1.76959,57.76086],[-3.69376,57.75742],[-3.70667,57.98064],[-3.5969,57.97721],[-3.60336,58.12073],[-3.02223,58.13096],[-3.02869,58.54108],[-2.8479,58.53097],[-2.86081,58.84305],[-2.67962,58.8415],[-2.68419,58.88517],[-2.63397,58.90522],[-2.67962,58.93351],[-2.68876,59.02292],[-2.36687,59.02292],[-2.37029,59.26529],[-2.3429,59.2822],[-2.37144,59.29969],[-2.37372,59.37071],[-2.3429,59.38582],[-2.37258,59.40035],[-2.37144,59.42591],[-3.07342,59.42301],[-3.07114,59.34336],[-3.1031,59.33114],[-3.07456,59.31367],[-3.07228,59.2326],[-3.38503,59.14842],[-3.37476,58.93528],[-3.56538,58.93233],[-3.55483,58.69759],[-5.28086,58.66677],[-5.25342,58.35141],[-5.50685,58.34379],[-5.47618,58.03236],[-5.8975,58.02124],[-5.8523,57.61718],[-6.13963,57.61372],[-6.15416,57.74232],[-6.29137,57.73801],[-6.33657,58.13988],[-6.11219,58.14669],[-6.14738,58.51063],[-6.29348,58.54162],[-6.84137,58.29773],[-7.00574,58.29293],[-7.10162,58.20644],[-7.25731,58.17931],[-7.25311,58.10049],[-7.40707,58.09056],[-7.39135,57.79114],[-7.79099,57.77332],[-7.76242,57.54442],[-7.6985,57.14532],[-7.79438,57.13045],[-7.71676,56.73686],[-7.01221,56.76544],[-6.97992,56.54539],[-7.06386,56.54539],[-7.04449,56.35626],[-6.50068,56.38129],[-6.44914,55.97936],[-6.56329,55.96915],[-6.53937,55.70301],[-6.55955,55.69073],[-6.53453,55.67617],[-6.52162,55.57044],[-5.89126,55.59234],[-5.85601,55.23207],[-5.22936,55.2516],[-5.18371,54.62541],[-3.6656,54.65184],[-3.64962,54.432],[-3.54004,54.43067],[-3.53091,54.02902],[-3.06977,54.03036],[-3.06757,53.82214],[-3.08049,53.77399],[-3.06192,53.74775],[-3.06112,53.6737],[-3.21447,53.67084],[-3.20577,53.42262],[-3.27996,53.35522],[-3.28967,53.36084],[-3.33275,53.36493],[-3.37613,53.35403],[-4.0889,53.34331],[-4.09455,53.4612],[-4.69741,53.44486],[-4.68828,53.33186],[-4.72024,53.28958],[-4.68371,53.24862],[-4.67687,53.15426],[-4.84808,53.14468],[-4.81783,52.74403],[-4.25458,52.75589],[-4.22888,52.25488],[-4.26076,52.25364],[-4.27246,52.24326],[-4.81363,52.23009],[-4.80792,52.11389],[-5.38891,52.09917],[-5.37179,51.91297],[-5.42087,51.91015],[-5.41402,51.84532],[-5.36836,51.84744],[-5.34668,51.55953],[-4.77368,51.57585],[-4.76569,51.48851],[-4.19154,51.49704],[-4.18698,51.43447],[-3.61512,51.44443],[-3.61055,51.37465],[-3.14941,51.37893],[-3.14941,51.29193],[-4.30387,51.27459],[-4.28612,51.05087],[-4.85433,51.03666],[-4.83722,50.72128],[-5.26183,50.70827],[-5.23955,50.35306]],[[-2.15027,60.17132],[-2.00302,60.16961],[-2.00131,60.0997],[-2.14855,60.10112],[-2.15027,60.17132]],[[-6.2086,59.11635],[-6.12299,59.11664],[-6.12185,59.0715],[-6.20974,59.0715],[-6.2086,59.11635]],[[-4.41596,59.0889],[-4.4212,59.07708],[-4.39719,59.07791],[-4.39134,59.08973],[-4.41596,59.0889]]]},{id:"OS-New_Popular_Edition-historic",name:"OS New Popular Edition historic",type:"tms",template:"https://ooc.openstreetmap.org/npe/{zoom}/{x}/{y}.png",zoomExtent:[6,15],polygon:[[[-3.68466,55.23744],[-3.65106,54.42892],[-3.54463,54.43072],[-3.52815,54.02593],[-3.07016,54.03137],[-3.06123,53.6717],[-3.21298,53.67048],[-3.20371,53.35568],[-4.10424,53.34297],[-4.11042,53.46005],[-4.71124,53.44799],[-4.69339,53.15171],[-4.84307,53.1476],[-4.81595,52.74378],[-4.25342,52.75541],[-4.22733,52.24378],[-4.81303,52.23117],[-4.80754,52.11452],[-5.38913,52.09892],[-5.3493,51.56085],[-4.77252,51.57622],[-4.76772,51.48652],[-4.19299,51.49806],[-4.18956,51.43518],[-3.61278,51.44502],[-3.61072,51.37307],[-3.15067,51.37864],[-3.14723,51.28984],[-4.29462,51.2718],[-4.28363,51.04744],[-4.85423,51.03406],[-4.83707,50.76556],[-5.2621,50.75427],[-5.23395,50.34984],[-5.79562,50.33319],[-5.76228,49.92913],[-4.64717,49.96094],[-4.66914,50.2753],[-4.25166,50.2832],[-4.24617,50.19361],[-3.40159,50.20679],[-3.41395,50.52041],[-3.13105,50.52391],[-3.1338,50.66078],[-2.66963,50.66252],[-2.66688,50.5719],[-1.04228,50.56929],[-1.04502,50.70429],[-0.54652,50.69994],[-0.54103,50.79031],[-0.08784,50.78424],[-0.08887,50.72211],[0.47693,50.70907],[0.48242,50.81939],[0.98024,50.8068],[0.99328,51.01333],[1.44784,51.00036],[1.47805,51.40478],[1.018,51.41634],[1.04272,51.76742],[1.6195,51.75084],[1.65246,52.15456],[1.72662,52.15245],[1.79529,52.9594],[0.60396,52.99123],[0.60327,52.97222],[0.38148,52.97883],[0.39625,53.24796],[0.31934,53.24961],[0.34269,53.65319],[0.11609,53.65726],[0.13738,54.06181],[-0.06243,54.06584],[-0.04183,54.46924],[-0.56781,54.47722],[-0.56163,54.65715],[-1.18098,54.66271],[-1.17755,54.84183],[-1.33342,54.84381],[-1.32655,55.24743],[-1.53117,55.24821],[-1.52636,55.6528],[-1.76394,55.6528],[-1.76257,55.96765],[-2.40321,55.96727],[-2.39772,55.56243],[-2.16151,55.56282],[-2.15808,55.2486],[-2.92158,55.24571],[-3.68466,55.23744]]]},{id:"OS-OpenData_Locator",name:"OS OpenData Locator",type:"tms",template:"http://tiles.itoworld.com/os_locator/{zoom}/{x}/{y}.png",zoomExtent:[0,22],polygon:[[[-0.88639,61.11666],[-9.24009,57.92465],[-6.61235,55.46835],[-6.1039,55.40191],[-5.61358,55.06607],[-5.40088,54.90562],[-5.29371,54.77201],[-5.11832,54.5911],[-4.92368,54.38599],[-4.94067,53.59884],[-5.44172,52.27725],[-6.03376,51.6012],[-7.54473,49.33762],[-2.59721,50.2588],[0.65674,50.64047],[1.32419,50.83256],[1.87586,51.19234],[2.05883,52.88863],[-1.61452,56.47933],[-1.21085,57.64972],[-1.69525,59.08903],[0.21543,60.43058],[-0.88639,61.11666]]],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",zoomExtent:[1,18],polygon:[[[-5.82929,50.02297],[-5.82929,50.25482],[-5.37336,50.25482],[-5.37336,50.35306],[-5.1756,50.35306],[-5.1756,50.59254],[-4.99707,50.59254],[-4.99707,50.69356],[-4.79657,50.69356],[-4.79657,50.78221],[-4.69495,50.78221],[-4.69495,50.96074],[-4.60431,50.96074],[-4.60431,51.06921],[-4.37922,51.06921],[-4.37922,51.25218],[-3.90393,51.25218],[-3.90393,51.2917],[-3.71717,51.2917],[-3.71717,51.2453],[-3.14862,51.2453],[-3.14862,51.36207],[-3.74463,51.36207],[-3.74463,51.43404],[-3.82978,51.43404],[-3.82978,51.52982],[-4.08521,51.52982],[-4.08521,51.49393],[-4.37922,51.49393],[-4.37922,51.54272],[-5.14442,51.54272],[-5.14442,51.6296],[-5.73871,51.6296],[-5.73871,51.77404],[-5.50954,51.77404],[-5.50954,51.98026],[-5.1988,51.98026],[-5.1988,52.09734],[-4.88806,52.09734],[-4.88806,52.18316],[-4.49575,52.18316],[-4.49575,52.29257],[-4.30154,52.29257],[-4.30154,52.36853],[-4.18112,52.36853],[-4.18112,52.79337],[-4.44137,52.79337],[-4.44137,52.73696],[-4.85698,52.73696],[-4.85698,52.93173],[-4.7288,52.93173],[-4.7288,53.50386],[-4.15782,53.50386],[-4.15782,53.41135],[-3.31105,53.41135],[-3.31105,53.50386],[-3.23337,53.50386],[-3.23337,54.01592],[-3.39262,54.01592],[-3.39262,54.1981],[-3.55964,54.1981],[-3.55964,54.43373],[-3.7189,54.43373],[-3.7189,54.7219],[-4.30154,54.7219],[-4.30154,54.61407],[-5.04731,54.61407],[-5.04731,54.75329],[-5.22987,54.75329],[-5.22987,55.21908],[-5.65326,55.21908],[-5.65326,55.25009],[-5.89796,55.25009],[-5.89796,55.48225],[-6.59332,55.48225],[-6.59332,56.30134],[-7.17277,56.30134],[-7.17277,56.56018],[-6.81717,56.56018],[-6.81717,56.69917],[-6.53153,56.69917],[-6.53153,56.9067],[-6.81168,56.9067],[-6.81168,57.37166],[-6.8721,57.37166],[-6.8721,57.55189],[-7.09732,57.55189],[-7.09732,57.24111],[-7.17423,57.24111],[-7.17423,56.9067],[-7.37198,56.9067],[-7.37198,56.80759],[-7.5203,56.80759],[-7.5203,56.71425],[-7.83068,56.71425],[-7.83068,56.89946],[-7.64941,56.89946],[-7.64941,57.47396],[-7.83068,57.47396],[-7.83068,57.79156],[-7.47362,57.79156],[-7.47362,58.08606],[-7.18798,58.08606],[-7.18798,58.3672],[-6.80346,58.3672],[-6.80346,58.41558],[-6.63866,58.41558],[-6.63866,58.46733],[-6.51781,58.46733],[-6.51781,58.56256],[-6.05362,58.56256],[-6.05362,58.15688],[-6.14701,58.15688],[-6.14701,58.11059],[-6.27998,58.11059],[-6.27998,57.71227],[-6.15913,57.71227],[-6.15913,57.66676],[-5.93391,57.66676],[-5.93391,57.88925],[-5.80643,57.88925],[-5.80643,57.96218],[-5.61417,57.96218],[-5.61417,58.09112],[-5.49082,58.09112],[-5.49082,58.37333],[-5.31991,58.37333],[-5.31991,58.75015],[-3.572,58.75015],[-3.572,59.20918],[-3.19445,59.20918],[-3.19445,59.47592],[-2.24358,59.47592],[-2.24358,59.13887],[-2.4611,59.13887],[-2.4611,58.81859],[-2.74077,58.81859],[-2.74077,58.58047],[-2.91167,58.58047],[-2.91167,58.11575],[-3.48654,58.11575],[-3.48654,57.74039],[-1.71532,57.74039],[-1.71532,57.22256],[-1.97945,57.22256],[-1.97945,56.87607],[-2.1659,56.87607],[-2.1659,56.63332],[-2.36011,56.63332],[-2.36011,56.04775],[-1.97945,56.04775],[-1.97945,55.86509],[-1.4745,55.86509],[-1.4745,55.24999],[-1.3222,55.24999],[-1.3222,54.82217],[-1.055,54.82217],[-1.055,54.67466],[-0.66188,54.67466],[-0.66188,54.55275],[-0.32476,54.55275],[-0.32476,54.28652],[0.00928,54.28652],[0.00928,53.79385],[0.2082,53.79385],[0.2082,53.52177],[0.41635,53.52177],[0.41635,53.02989],[1.42734,53.02989],[1.42734,52.92021],[1.83339,52.92021],[1.83339,52.04249],[1.52355,52.04249],[1.52355,51.82613],[1.2697,51.82613],[1.2697,51.69675],[1.11665,51.69675],[1.11665,51.44035],[1.52355,51.44035],[1.52355,51.33318],[1.45076,51.33318],[1.45076,51.02076],[1.06999,51.02076],[1.06999,50.90084],[0.77881,50.90084],[0.77881,50.72984],[-0.7256,50.72984],[-0.7256,50.70384],[-1.00744,50.70384],[-1.00744,50.57363],[-2.36253,50.57363],[-2.36253,50.48464],[-2.49878,50.48464],[-2.49878,50.57363],[-3.40964,50.57363],[-3.40964,50.20578],[-3.69224,50.20578],[-3.69224,50.13477],[-5.00547,50.13477],[-5.00547,49.94745],[-5.28395,49.94745],[-5.28395,50.02297],[-5.82929,50.02297]],[[-6.45807,49.86736],[-6.45807,49.94999],[-6.39788,49.94999],[-6.39788,50.00538],[-6.17996,50.00538],[-6.17996,49.91686],[-6.25402,49.91686],[-6.25402,49.86736],[-6.45807,49.86736]],[[-5.83432,49.93216],[-5.83432,49.97546],[-5.76833,49.97546],[-5.76833,49.93216],[-5.83432,49.93216]],[[-1.94838,60.68857],[-1.94838,60.30588],[-1.75431,60.30588],[-1.75431,60.12844],[-1.57549,60.12844],[-1.57549,59.79792],[-1.0317,59.79792],[-1.0317,60.03545],[-0.66269,60.03545],[-0.66269,60.91039],[-1.10344,60.91039],[-1.10344,60.804],[-1.35063,60.804],[-1.35063,60.68857],[-1.94838,60.68857]],[[-2.20338,60.19686],[-2.20338,60.09294],[-1.9864,60.09294],[-1.9864,60.19686],[-2.20338,60.19686]],[[-1.75431,59.56983],[-1.75431,59.46394],[-1.53733,59.46394],[-1.53733,59.56983],[-1.75431,59.56983]],[[-4.5586,59.13705],[-4.5586,58.95691],[-4.2867,58.95691],[-4.2867,59.13705],[-4.5586,59.13705]],[[-6.27877,59.20257],[-6.27877,59.02278],[-5.66506,59.02278],[-5.66506,59.20257],[-6.27877,59.20257]],[[-8.71635,57.94406],[-8.71635,57.73059],[-8.35929,57.73059],[-8.35929,57.94406],[-8.71635,57.94406]],[[-7.6077,50.4021],[-7.6077,50.26887],[-7.39072,50.26887],[-7.39072,50.4021],[-7.6077,50.4021]],[[-7.73043,58.35799],[-7.73043,58.24831],[-7.51345,58.24831],[-7.51345,58.35799],[-7.73043,58.35799]]]},{id:"OS-Scottish_Popular-historic",name:"OS Scottish Popular historic",type:"tms",template:"https://ooc.openstreetmap.org/npescotland/{zoom}/{x}/{y}.jpg",zoomExtent:[6,15],polygon:[[[-6.37546,57.1045],[-6.12998,57.11183],[-6.12586,56.94143],[-6.26045,56.93892],[-6.26045,56.83765],[-6.24259,56.65806],[-6.3552,56.65655],[-6.37649,56.79029],[-7.02812,56.76396],[-6.99636,56.54246],[-7.04391,56.53937],[-7.03206,56.44201],[-6.98331,56.44353],[-6.97593,56.36063],[-6.45271,56.37964],[-6.44035,56.2013],[-6.19315,56.21199],[-6.18354,56.12483],[-6.36379,56.11641],[-6.36173,55.98258],[-6.48944,55.97912],[-6.47777,55.84134],[-6.55467,55.8371],[-6.53545,55.66049],[-6.45442,55.66087],[-6.44412,55.57285],[-6.19985,55.57266],[-5.96845,55.58857],[-5.98562,55.7686],[-5.90665,55.77169],[-5.88949,55.59284],[-5.80983,55.594],[-5.79335,55.41395],[-5.827,55.41395],[-5.80915,55.24247],[-5.61826,55.24873],[-5.62101,55.26713],[-5.46239,55.27026],[-5.48642,55.514],[-5.43836,55.51516],[-5.42943,55.42681],[-5.24129,55.43071],[-5.19464,54.80351],[-5.07105,54.80668],[-5.05221,54.62471],[-4.3223,54.65173],[-4.33123,54.7319],[-4.06786,54.73697],[-4.06786,54.76471],[-3.55699,54.77342],[-3.55837,54.83754],[-2.42098,54.84671],[-2.42647,55.25265],[-2.03097,55.25265],[-2.01449,55.56606],[-1.76455,55.56606],[-1.76455,55.9724],[-2.35026,55.96548],[-2.5796,56.06527],[-2.58234,56.37071],[-2.65032,56.36919],[-2.65581,56.50585],[-2.48965,56.50509],[-2.42785,56.55356],[-2.42373,56.73026],[-2.1628,56.73177],[-2.17104,56.99301],[-2.00075,56.99301],[-1.98479,57.3159],[-1.83476,57.31553],[-1.83441,57.36074],[-1.75167,57.36111],[-1.74893,57.63046],[-1.83613,57.63009],[-1.83544,57.70171],[-2.00436,57.70207],[-2.00367,57.71968],[-3.22281,57.71418],[-3.22629,57.76157],[-3.51331,57.77622],[-3.50914,57.71051],[-3.84766,57.70611],[-3.85182,57.76853],[-3.79925,57.76989],[-3.80474,57.88578],[-3.85556,57.88651],[-3.85937,57.97558],[-3.79513,57.97656],[-3.79483,58.03052],[-3.69733,58.03161],[-3.69458,58.06722],[-3.52391,58.07437],[-3.52978,58.16007],[-3.35774,58.16286],[-3.3483,58.28742],[-3.07638,58.29121],[-3.03004,58.43744],[-3.01768,58.65814],[-2.85837,58.66028],[-2.86524,58.7943],[-2.75812,58.79715],[-2.76636,58.87461],[-2.6208,58.88668],[-2.62766,58.97527],[-2.54114,58.97668],[-2.54217,59.0841],[-2.52363,59.08375],[-2.52913,59.1574],[-2.43849,59.15705],[-2.4378,59.246],[-2.36914,59.24705],[-2.3688,59.40748],[-2.52947,59.40748],[-2.52741,59.33436],[-2.70319,59.33576],[-2.70525,59.40608],[-3.12891,59.40433],[-3.12411,59.15951],[-3.40288,59.1574],[-3.39464,58.9689],[-3.4276,58.96961],[-3.42572,58.88526],[-3.45215,58.87071],[-3.51017,58.86911],[-3.50708,58.78826],[-3.38555,58.79004],[-3.3828,58.6999],[-3.4494,58.69847],[-3.45078,58.65385],[-3.50159,58.65421],[-3.5009,58.62705],[-3.72612,58.62383],[-3.72475,58.60595],[-4.6476,58.5895],[-4.65996,58.67171],[-5.10697,58.66135],[-5.09804,58.58091],[-5.23743,58.57769],[-5.22455,58.26305],[-5.4127,58.25818],[-5.39965,58.12245],[-5.53286,58.11991],[-5.52393,57.99494],[-5.55346,57.99422],[-5.54728,57.93995],[-5.85696,57.93157],[-5.83181,57.73361],[-5.86374,57.73224],[-5.85773,57.66096],[-6.19624,57.64975],[-6.20242,57.72353],[-6.41666,57.7162],[-6.42421,57.75945],[-6.4764,57.75725],[-6.46884,57.71326],[-6.53339,57.71216],[-6.52721,57.6391],[-6.692,57.63395],[-6.68102,57.54341],[-6.78195,57.53826],[-6.75311,57.31608],[-6.50592,57.32498],[-6.49768,57.28084],[-6.4812,57.27824],[-6.47159,57.19203],[-6.38644,57.19352],[-6.37546,57.1045]],[[-7.65043,56.77461],[-7.40667,56.79304],[-7.41972,56.88281],[-7.38676,56.90268],[-7.25836,56.91056],[-7.24806,57.07141],[-7.11485,57.077],[-7.16772,57.43466],[-7.0352,57.44094],[-7.05236,57.69026],[-6.86834,57.6976],[-6.87315,57.71631],[-6.70286,57.72217],[-6.71591,57.81117],[-6.53188,57.81958],[-6.53875,57.88133],[-6.22015,57.89265],[-6.24143,58.09935],[-6.12676,58.10152],[-6.17758,58.53105],[-6.46734,58.52029],[-6.4591,58.45102],[-6.63145,58.44455],[-6.6239,58.39169],[-6.79212,58.38485],[-6.78869,58.34956],[-6.90885,58.34415],[-6.89718,58.25503],[-7.20136,58.24166],[-7.14094,57.83201],[-7.37509,57.82104],[-7.36822,57.69503],[-7.6573,57.68292],[-7.67652,57.80715],[-7.79257,57.80202],[-7.77327,57.67734],[-7.70756,57.68024],[-7.69376,57.59088],[-7.75947,57.58797],[-7.74587,57.49965],[-7.51241,57.5085],[-7.47911,57.29468],[-7.52855,57.2932],[-7.51276,57.05871],[-7.61163,57.05386],[-7.59859,56.87493],[-7.66725,56.87268],[-7.65043,56.77461]],[[-1.46238,59.82831],[-1.21519,59.83107],[-1.21519,59.96194],[-1.10533,59.96056],[-1.0986,60.09498],[-0.97632,60.09346],[-0.96352,60.3476],[-0.74028,60.34484],[-0.7147,60.84722],[-1.08215,60.85901],[-1.08455,60.76944],[-1.21296,60.77011],[-1.21579,60.68079],[-1.23364,60.68113],[-1.23467,60.5909],[-1.27132,60.59191],[-1.27338,60.64581],[-1.45466,60.64648],[-1.45397,60.59224],[-1.6373,60.59292],[-1.63954,60.3507],[-1.73172,60.35095],[-1.73172,60.18067],[-1.64177,60.17931],[-1.64177,60.1448],[-1.46393,60.14344],[-1.46238,59.82831]],[[-6.21496,56.97437],[-6.22525,57.06445],[-6.29117,57.06184],[-6.29237,57.08062],[-6.62162,57.06943],[-6.61338,57.00629],[-6.46163,57.01302],[-6.4582,56.96776],[-6.21496,56.97437]],[[-2.12774,60.10855],[-2.12803,60.16207],[-2.00203,60.16224],[-2.00174,60.10872],[-2.12774,60.10855]],[[-6.68977,56.95804],[-6.69228,56.9759],[-6.65984,56.97726],[-6.65733,56.9594],[-6.68977,56.95804]],[[-7.66365,58.25846],[-7.66844,58.28502],[-7.54896,58.29098],[-7.54417,58.26442],[-7.66365,58.25846]],[[-8.65104,57.78885],[-8.66674,57.875],[-8.48272,57.88449],[-8.46702,57.79836],[-8.65104,57.78885]]]},{id:"osmie_barony",name:"OSMIE Baronies",type:"tms",template:"https://tile.openstreetmap.ie/barony/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_cps",name:"OSMIE Civil Parishes",type:"tms",template:"https://tile.openstreetmap.ie/civilparish/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_dail_ea",name:"OSMIE Dail Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/dail_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_eds",name:"OSMIE EDs",type:"tms",template:"https://tile.openstreetmap.ie/ed/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_local_ea",name:"OSMIE Local Election Areas",type:"tms",template:"https://tile.openstreetmap.ie/local_ea/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tie_not_counties",name:"OSMIE T.ie Land not in Counties",type:"tms",template:"https://www.townlands.ie/tiles/not_counties/{zoom}/{x}/{y}.png",zoomExtent:[2,19],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"osmie_tds",name:"OSMIE Townlands",type:"tms",template:"https://tile.openstreetmap.ie/townland/{zoom}/{x}/{y}.png",zoomExtent:[7,20],polygon:[[[-6.32987,52.38838],[-6.16508,52.58073],[-5.9893,52.9811],[-6.05796,53.31713],[-5.9838,53.50704],[-6.24473,53.86326],[-6.35459,53.91182],[-6.31614,53.98133],[-6.13487,53.97002],[-5.61851,54.23574],[-5.3878,54.44708],[-5.53886,54.67641],[-6.07444,55.21277],[-6.21452,55.33168],[-6.78306,55.17828],[-6.9506,55.25505],[-7.17582,55.35355],[-7.22526,55.45024],[-7.50816,55.28791],[-7.63999,55.28009],[-8.02451,55.2206],[-8.25797,55.27853],[-8.28269,55.172],[-8.58482,55.01168],[-8.38432,54.86021],[-8.69743,54.78901],[-8.85124,54.67641],[-8.46946,54.57942],[-8.17008,54.62397],[-8.33763,54.4854],[-8.68644,54.36556],[-8.62876,54.27625],[-9.04075,54.3051],[-9.13688,54.23614],[-9.2852,54.33834],[-9.90043,54.32233],[-10.15037,54.2245],[-10.27397,53.94578],[-9.98832,53.85678],[-10.3289,53.60982],[-10.22727,53.39418],[-9.78233,53.21857],[-8.96934,53.26952],[-9.04624,53.1762],[-9.2852,53.15644],[-9.40879,52.99433],[-9.57084,52.75562],[-9.97321,52.54316],[-9.70405,52.57071],[-9.69444,52.4855],[-9.97733,52.41854],[-9.87296,52.33387],[-9.92378,52.2381],[-10.06523,52.34478],[-10.15586,52.30113],[-10.65849,52.07212],[-9.90318,52.12274],[-10.45799,51.88772],[-10.39344,51.82411],[-10.56098,51.76635],[-10.32478,51.79014],[-10.25749,51.70937],[-9.80705,51.81816],[-10.28289,51.57045],[-9.89631,51.60032],[-9.51454,51.70256],[-9.83177,51.55082],[-9.83039,51.43368],[-9.43351,51.50468],[-9.53788,51.41741],[-8.63151,51.59179],[-7.70316,51.95209],[-7.46421,52.12105],[-6.33537,52.17667],[-6.32987,52.38838]],[[-9.89082,53.14368],[-9.51042,53.03605],[-9.45274,53.08557],[-9.82902,53.18279],[-9.89082,53.14368]]],icon:"https://www.townlands.ie/static/logo_small.png"},{id:"al_palestina",name:"Palestina AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.28907,-9.71916],[-37.28904,-9.71114],[-37.28911,-9.7022],[-37.28915,-9.69175],[-37.28919,-9.68886],[-37.28927,-9.68069],[-37.28926,-9.67732],[-37.28936,-9.66999],[-37.28936,-9.66599],[-37.28931,-9.66133],[-37.28941,-9.65526],[-37.28946,-9.64556],[-37.2895,-9.63489],[-37.28954,-9.62926],[-37.2964,-9.62885],[-37.31188,-9.62897],[-37.32762,-9.62914],[-37.33181,-9.62919],[-37.34338,-9.62917],[-37.35876,-9.62923],[-37.37175,-9.6293],[-37.37839,-9.62913],[-37.38051,-9.62922],[-37.38061,-9.63143],[-37.38054,-9.63785],[-37.38043,-9.63895],[-37.38053,-9.64147],[-37.38051,-9.64876],[-37.3805,-9.6543],[-37.38043,-9.656],[-37.38024,-9.66028],[-37.38022,-9.66551],[-37.38019,-9.67054],[-37.38016,-9.67896],[-37.38013,-9.68781],[-37.38009,-9.70116],[-37.38003,-9.71053],[-37.3801,-9.71743],[-37.38005,-9.71959],[-37.37932,-9.71954],[-37.37392,-9.71956],[-37.36582,-9.71945],[-37.35849,-9.71946],[-37.35334,-9.71938],[-37.34414,-9.71937],[-37.33423,-9.71923],[-37.32933,-9.71927],[-37.3218,-9.71924],[-37.31983,-9.71927],[-37.31094,-9.7192],[-37.29589,-9.71921],[-37.28907,-9.71916]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"palmeira_dos_indios",name:"Palmeira dos Indios AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.58664,-9.46124],[-36.58665,-9.45851],[-36.58619,-9.41968],[-36.58604,-9.41452],[-36.58596,-9.40593],[-36.58585,-9.39509],[-36.58579,-9.39163],[-36.58565,-9.38983],[-36.58549,-9.38249],[-36.58529,-9.37965],[-36.58511,-9.37744],[-36.58503,-9.37059],[-36.5889,-9.37058],[-36.59064,-9.37065],[-36.59389,-9.3706],[-36.60037,-9.37073],[-36.61046,-9.37049],[-36.62288,-9.37021],[-36.63377,-9.37002],[-36.63835,-9.36986],[-36.64743,-9.36997],[-36.65141,-9.36994],[-36.65534,-9.36972],[-36.65647,-9.36974],[-36.66111,-9.37024],[-36.66276,-9.37026],[-36.66704,-9.36973],[-36.67052,-9.36966],[-36.67325,-9.36966],[-36.67602,-9.36987],[-36.67593,-9.3726],[-36.67597,-9.37679],[-36.67639,-9.38138],[-36.67654,-9.38464],[-36.67663,-9.39265],[-36.67675,-9.39829],[-36.67689,-9.40875],[-36.67707,-9.41887],[-36.67717,-9.43179],[-36.67724,-9.43395],[-36.67718,-9.43753],[-36.67728,-9.44311],[-36.6773,-9.44933],[-36.67741,-9.45528],[-36.6774,-9.45938],[-36.67735,-9.46017],[-36.67568,-9.46021],[-36.66625,-9.4603],[-36.66224,-9.4603],[-36.65736,-9.46042],[-36.6504,-9.46047],[-36.63543,-9.46065],[-36.61979,-9.46083],[-36.61433,-9.46083],[-36.61029,-9.46097],[-36.60647,-9.46097],[-36.60186,-9.46099],[-36.59426,-9.46112],[-36.58664,-9.46124]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Pangasinan_Bulacan_HiRes",name:"Pangasinán/Bulacan (Philippines HiRes)",type:"tms",template:"https://gravitystorm.dev.openstreetmap.org/imagery/philippines/{zoom}/{x}/{y}.png",zoomExtent:[12,19],polygon:[[[120.33659,15.98577],[120.44599,15.984],[120.44613,15.97446],[120.47646,15.97459],[120.59425,15.94683],[120.59806,16.09079],[120.59654,16.198],[120.36854,16.21853],[120.34758,16.04231],[120.33659,15.98577]],[[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://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.39003,-9.78589],[-37.39019,-9.7762],[-37.38993,-9.76575],[-37.38991,-9.75256],[-37.39015,-9.74102],[-37.39003,-9.73201],[-37.39012,-9.72254],[-37.39015,-9.71289],[-37.39019,-9.70341],[-37.3902,-9.69548],[-37.40377,-9.6955],[-37.41728,-9.6956],[-37.43224,-9.69569],[-37.44319,-9.69573],[-37.44723,-9.69582],[-37.45682,-9.69585],[-37.47062,-9.69591],[-37.47373,-9.69591],[-37.47586,-9.69604],[-37.48128,-9.69605],[-37.48131,-9.6989],[-37.48122,-9.70087],[-37.48121,-9.70239],[-37.48135,-9.70545],[-37.48138,-9.71046],[-37.48134,-9.71617],[-37.4812,-9.71875],[-37.48125,-9.72035],[-37.48136,-9.72134],[-37.48134,-9.7241],[-37.4813,-9.72506],[-37.48103,-9.72732],[-37.48102,-9.73088],[-37.48127,-9.73462],[-37.48131,-9.73638],[-37.48131,-9.73893],[-37.48131,-9.74388],[-37.4813,-9.74989],[-37.48122,-9.75315],[-37.48102,-9.75855],[-37.48084,-9.7642],[-37.48085,-9.76526],[-37.48094,-9.76675],[-37.48093,-9.76881],[-37.48084,-9.7721],[-37.48087,-9.77486],[-37.48076,-9.77993],[-37.48081,-9.7863],[-37.46382,-9.78623],[-37.45353,-9.7862],[-37.43979,-9.78611],[-37.42998,-9.78607],[-37.4208,-9.786],[-37.40853,-9.78596],[-37.39545,-9.78593],[-37.39003,-9.78589]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{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.33149,41.64637],[12.41178,41.64791],[12.41499,41.54635],[12.49574,41.54789],[12.4985,41.49619],[12.57948,41.49843],[12.58062,41.42932],[12.60632,41.4288],[12.60746,41.39663],[12.8293,41.39818],[12.83159,41.34688],[12.9128,41.34843],[12.9151,41.29726],[12.99585,41.2983],[12.99791,41.19636],[13.1679,41.19808],[13.16721,41.24692],[13.41337,41.24829],[13.4152,41.19705],[13.8341,41.19808],[13.83341,41.2476],[13.91737,41.24847],[13.91668,41.39749],[14.0011,41.39784],[13.99996,41.49774],[14.08415,41.49826],[14.08346,41.65014],[14.00087,41.6498],[13.99973,41.75051],[13.83433,41.74965],[13.83364,41.80047],[13.75151,41.79978],[13.7499,41.84987],[13.41841,41.8497],[13.41681,41.95027],[13.33445,41.94959],[13.3333,42.00041],[13.25141,41.99973],[13.25003,42.05051],[13.08509,42.04966],[13.08394,42.097],[13.33399,42.09819],[13.33376,42.1472],[13.41772,42.14822],[13.41635,42.25052],[13.33399,42.24984],[13.33353,42.30094],[13.25141,42.29992],[13.25003,42.54699],[13.41795,42.54817],[13.41589,42.75065],[13.33468,42.74947],[13.33307,42.90056],[13.16836,42.89938],[13.16721,42.95079],[12.96419,42.95012],[12.96258,43.0003],[12.91877,42.9998],[12.91601,43.25078],[12.83526,43.24994],[12.83228,43.50107],[12.66321,43.4994],[12.66482,43.45112],[12.58567,43.44996],[12.58246,43.5508],[12.50171,43.5498],[12.49987,43.65131],[12.16242,43.64915],[12.16494,43.60132],[12.07891,43.5995],[12.0819,43.45196],[11.99541,43.44913],[11.99862,43.34661],[12.07891,43.34795],[12.08075,43.30189],[11.9961,43.29955],[11.99862,43.20214],[11.91237,43.19929],[11.91466,43.15212],[11.83207,43.14944],[11.8323,43.09653],[11.91099,43.09837],[11.91466,42.90191],[11.82909,42.89922],[11.83139,42.85231],[11.74582,42.84945],[11.74811,42.65236],[11.6731,42.64966],[11.67493,42.6105],[11.49485,42.59936],[11.49852,42.49593],[11.57812,42.49796],[11.58156,42.45244],[11.41226,42.44872],[11.41524,42.34656],[11.49599,42.34792],[11.49921,42.29636],[11.57835,42.29822],[11.58225,42.24628],[11.66185,42.24832],[11.66621,42.09649],[11.74536,42.09819],[11.74903,41.99666],[11.91443,41.99922],[11.91535,41.98626],[11.99403,41.98745],[11.99862,41.89685],[12.07868,41.89907],[12.08144,41.84594],[12.16311,41.84799],[12.16563,41.6964],[12.3292,41.69863],[12.33149,41.64637]]]},{id:"PCN-Italy-2012",name:"PCN 2012 - Italy",type:"wms",template:"http://wms.pcn.minambiente.it/ogc?map=/ms_ogc/WMS_v1.3/raster/ortofoto_colore_12.map&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=OI.ORTOIMMAGINI.2012&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[7.54795,43.73118],[8.10697,43.86701],[8.73593,44.38944],[10.18338,43.85116],[9.55016,43.13605],[10.27725,42.27515],[11.69748,42.08118],[12.90059,40.84897],[14.97466,40.20869],[16.04773,38.8953],[13.1086,38.74113],[11.77717,37.93605],[14.40624,36.74299],[15.13467,36.59364],[15.42867,37.027],[15.21993,37.43376],[15.4836,37.92936],[16.01644,37.8036],[17.21669,38.87425],[17.21669,39.40468],[16.55477,39.78775],[17.05464,40.45144],[18.32906,39.70539],[18.68773,40.0587],[18.04964,40.67064],[16.00545,41.52122],[16.38448,41.85964],[15.51837,42.1537],[14.57997,42.2461],[13.56099,43.65128],[12.57889,44.0867],[12.28795,44.62204],[12.56398,44.97092],[12.34151,45.17458],[12.41696,45.40557],[13.09252,45.62826],[13.69549,45.70806],[13.78445,45.5825],[13.9191,45.6322],[13.8235,45.7176],[13.59784,45.8072],[13.64307,45.98326],[13.52963,45.96588],[13.47474,46.00546],[13.66472,46.17392],[13.47587,46.22725],[13.42218,46.20758],[13.37671,46.29668],[13.59777,46.44137],[13.68684,46.43881],[13.7148,46.5222],[12.9151,46.60953],[12.38708,46.71529],[12.27591,46.88651],[12.17486,46.90895],[12.11675,47.01241],[12.21781,47.03996],[12.19254,47.09331],[11.74789,46.98484],[11.33355,46.99862],[11.10618,46.92966],[11.00764,46.76896],[10.72974,46.78972],[10.75753,46.82258],[10.66405,46.87614],[10.47197,46.85698],[10.38659,46.67847],[10.49375,46.62049],[10.46136,46.53164],[10.25309,46.57432],[10.23674,46.63484],[10.10307,46.61003],[10.03715,46.44479],[10.165,46.41051],[10.10506,46.3372],[10.17862,46.25626],[10.07055,46.21668],[9.95249,46.38045],[9.73086,46.35071],[9.71273,46.29266],[9.57015,46.2958],[9.46117,46.37481],[9.45936,46.50873],[9.40487,46.46621],[9.36128,46.5081],[9.28136,46.49685],[9.24503,46.23616],[8.95601,45.96503],[9.09065,45.89906],[9.0298,45.82127],[8.90992,45.8333],[8.9408,45.86682],[8.88904,45.95465],[8.78551,45.99063],[8.85617,46.0748],[8.62242,46.12112],[8.45032,46.26869],[8.42464,46.46367],[8.08814,46.26692],[8.15493,46.1834],[8.11383,46.11577],[8.02906,46.10331],[7.98881,45.99867],[7.9049,45.99945],[7.85949,45.91485],[7.56343,45.97421],[7.10685,45.85653],[7.04151,45.92435],[6.95315,45.85163],[6.80785,45.83265],[6.80785,45.71864],[6.98948,45.63869],[7.00037,45.509],[7.18019,45.40071],[7.10572,45.32924],[7.13115,45.25386],[6.85144,45.13226],[6.7697,45.16044],[6.62803,45.11175],[6.66981,45.02324],[6.74791,45.01939],[6.75518,44.89915],[7.02217,44.82519],[7.07484,44.68073],[6.95133,44.66264],[6.85507,44.53072],[6.94504,44.43112],[6.88784,44.42043],[6.89171,44.36637],[7.00764,44.23736],[7.36364,44.11882],[7.68694,44.17487],[7.72508,44.07578],[7.49355,43.86551],[7.54795,43.73118]],[[8.17134,39.14848],[8.62453,38.75119],[9.09831,39.03764],[9.03102,39.13144],[9.26585,39.18575],[9.64076,39.0227],[9.89894,40.67991],[9.50068,41.39257],[8.30317,40.91071],[8.41304,41.16139],[8.21254,41.13864],[8.07521,40.59862],[8.36154,40.35],[8.27914,39.98585],[8.38283,39.6536],[8.17134,39.14848]],[[12.51489,35.53423],[12.64054,35.5306],[12.63861,35.48641],[12.51296,35.49005],[12.51489,35.53423]],[[11.91218,36.85688],[12.08179,36.85523],[12.07958,36.70974],[11.90998,36.71139],[11.91218,36.85688]],[[12.84019,35.88131],[12.89186,35.88145],[12.89198,35.85003],[12.84031,35.84989],[12.84019,35.88131]]]},{id:"Actueel_ortho25_WMS",name:"PDOK aerial imagery Beeldmateriaal.nl 25cm latest",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}",zoomExtent:[0,19],polygon:[[[3.14377,51.35984],[3.1575,51.24113],[3.33878,51.11544],[3.91281,51.05851],[4.65714,51.28067],[4.89334,51.26348],[5.17899,51.12579],[5.38498,51.13096],[5.54428,51.05678],[5.42069,50.85956],[5.46738,50.70326],[5.65689,50.61926],[6.14853,50.62143],[6.30234,50.85782],[6.29959,50.95438],[6.26389,51.01835],[6.37238,51.09259],[6.40122,51.20114],[6.37375,51.25102],[6.44516,51.31587],[6.42044,51.5496],[6.34354,51.67922],[6.79672,51.76429],[7.04666,51.91024],[7.07138,52.04559],[7.27188,52.17041],[7.30759,52.38551],[7.20596,52.53195],[7.28287,52.61458],[7.29935,52.77853],[7.44217,52.97827],[7.43393,53.28314],[7.04392,53.55159],[6.78299,53.63635],[6.23917,53.54016],[5.6871,53.51241],[5.17349,53.43885],[4.81644,53.23384],[4.65164,53.06583],[4.54178,52.48598],[4.32205,52.19568],[4.08104,52.01369],[4.02199,52.01623],[3.93684,51.96379],[3.95195,51.88079],[3.84483,51.84942],[3.62373,51.70752],[3.65532,51.66069],[3.63335,51.62746],[3.54683,51.62234],[3.39577,51.56091],[3.38203,51.51735],[3.49876,51.43267],[3.32985,51.38556],[3.14377,51.35984]]],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:"Nationwide data set 25cm resolution color aerial imagery of the most recent year.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/nl/PDOK-Luchtfoto-Beeldmateriaal-25cm-latest.png"},{id:"al_piranhas",name:"Piranhas AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.71918,-9.65236],[-37.71918,-9.63874],[-37.71914,-9.6321],[-37.71924,-9.62114],[-37.71929,-9.61023],[-37.71934,-9.59988],[-37.7194,-9.58891],[-37.71945,-9.57802],[-37.71944,-9.57173],[-37.71952,-9.56684],[-37.71956,-9.56225],[-37.71998,-9.56218],[-37.72258,-9.56195],[-37.72818,-9.56203],[-37.73254,-9.562],[-37.74107,-9.56206],[-37.74845,-9.56202],[-37.75926,-9.56216],[-37.76972,-9.56227],[-37.78036,-9.56244],[-37.78537,-9.56236],[-37.78907,-9.56233],[-37.79562,-9.56245],[-37.79771,-9.56237],[-37.81006,-9.56243],[-37.81061,-9.56241],[-37.81053,-9.56531],[-37.81049,-9.57629],[-37.81046,-9.58742],[-37.81038,-9.59757],[-37.81031,-9.61798],[-37.81018,-9.65197],[-37.81018,-9.6523],[-37.81024,-9.65259],[-37.80664,-9.65245],[-37.80206,-9.65253],[-37.79597,-9.65237],[-37.79179,-9.65252],[-37.78815,-9.65246],[-37.78723,-9.65242],[-37.78035,-9.65241],[-37.77865,-9.65223],[-37.77625,-9.6523],[-37.77475,-9.65219],[-37.77234,-9.65223],[-37.7696,-9.65245],[-37.76623,-9.65251],[-37.76345,-9.65246],[-37.7604,-9.6525],[-37.75102,-9.65237],[-37.75012,-9.65249],[-37.74155,-9.65248],[-37.7403,-9.65239],[-37.73785,-9.65246],[-37.73443,-9.65238],[-37.73106,-9.65243],[-37.72651,-9.65237],[-37.72195,-9.65225],[-37.71992,-9.65228],[-37.71918,-9.65236]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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}",zoomExtent:[0,20],polygon:[[[-17.88463,28.44606],[-17.89395,28.52255],[-18.02125,28.74819],[-18.02241,28.80384],[-17.9424,28.87261],[-17.89118,28.87371],[-17.89033,28.85151],[-17.76759,28.85378],[-17.76698,28.83122],[-17.74127,28.832],[-17.73949,28.76422],[-17.71398,28.76497],[-17.71293,28.73037],[-17.75744,28.69318],[-17.75708,28.67413],[-17.74579,28.67435],[-17.74573,28.61656],[-17.75197,28.58337],[-17.76225,28.5592],[-17.78331,28.54167],[-17.78316,28.49366],[-17.80861,28.4925],[-17.80601,28.4469],[-17.88463,28.44606]],[[-18.1661,27.78516],[-18.16349,27.69492],[-18.08898,27.69634],[-18.08734,27.67387],[-18.03641,27.67537],[-18.03501,27.63026],[-17.959,27.6324],[-17.86033,27.7926],[-17.86303,27.83688],[-17.8884,27.83649],[-17.88913,27.85905],[-17.99065,27.85675],[-18.03868,27.76558],[-18.11464,27.76379],[-18.11546,27.78636],[-18.1661,27.78516]],[[-17.36038,28.06398],[-17.36297,28.17572],[-17.33756,28.17637],[-17.33846,28.2213],[-17.18579,28.22388],[-17.08208,28.13518],[-17.08084,28.068],[-17.13154,28.06681],[-17.15633,28.02146],[-17.23211,28.02037],[-17.23199,27.99804],[-17.25768,27.99784],[-17.25785,28.01997],[-17.30867,28.01923],[-17.36038,28.06398]],[[-16.92782,28.32758],[-16.92866,28.37219],[-16.87767,28.37293],[-16.87807,28.39542],[-16.52143,28.42261],[-16.44571,28.49113],[-16.44625,28.53597],[-16.42059,28.53627],[-16.42092,28.55884],[-16.34433,28.55976],[-16.3446,28.58221],[-16.19125,28.58372],[-16.19162,28.60684],[-16.12793,28.60782],[-16.1278,28.59218],[-16.09951,28.5925],[-16.09934,28.51638],[-16.16481,28.51612],[-16.16475,28.49386],[-16.23858,28.44847],[-16.26535,28.44761],[-16.26586,28.403],[-16.31675,28.40176],[-16.31631,28.38019],[-16.34208,28.37951],[-16.34083,28.2893],[-16.41584,28.19761],[-16.4151,28.13113],[-16.51533,28.01648],[-16.61684,28.01532],[-16.61681,27.99305],[-16.71842,27.99192],[-16.7191,28.03714],[-16.7447,28.03679],[-16.74534,28.08181],[-16.7707,28.08161],[-16.8224,28.1259],[-16.82317,28.17087],[-16.8487,28.17075],[-16.85028,28.26079],[-16.87565,28.26055],[-16.87608,28.28322],[-16.90151,28.28277],[-16.90239,28.32793],[-16.92782,28.32758]],[[-15.85374,27.90089],[-15.8542,27.99018],[-15.82895,27.99066],[-15.82911,28.03558],[-15.7783,28.03632],[-15.75328,28.08143],[-15.72788,28.08157],[-15.72826,28.17186],[-15.49897,28.1728],[-15.49874,28.15041],[-15.44978,28.15075],[-15.45016,28.19614],[-15.39728,28.19614],[-15.39644,28.03836],[-15.37103,28.03802],[-15.37065,28.01532],[-15.34578,28.01532],[-15.34548,27.92544],[-15.3708,27.92524],[-15.37057,27.83521],[-15.39598,27.83474],[-15.421,27.78797],[-15.47181,27.78939],[-15.47188,27.76665],[-15.52277,27.76678],[-15.54771,27.72161],[-15.62361,27.72134],[-15.62415,27.74199],[-15.70075,27.74335],[-15.80167,27.81105],[-15.85374,27.90089]],[[-14.52156,28.04678],[-14.52244,28.11841],[-14.41575,28.11561],[-14.21688,28.22788],[-14.21537,28.33903],[-14.16417,28.45283],[-14.11151,28.4748],[-14.03358,28.72267],[-13.95652,28.74494],[-13.95617,28.76659],[-13.82902,28.76643],[-13.82896,28.78798],[-13.80007,28.78793],[-13.8013,28.71899],[-13.82757,28.71935],[-13.82786,28.6518],[-13.80258,28.6519],[-13.80339,28.53842],[-13.82885,28.53847],[-13.83151,28.39702],[-13.91582,28.22414],[-13.98564,28.22357],[-14.03696,28.17958],[-14.13871,28.17999],[-14.13866,28.15791],[-14.21537,28.15781],[-14.21472,28.11189],[-14.29132,28.04524],[-14.33197,28.03687],[-14.44578,28.04698],[-14.44666,28.0658],[-14.49628,28.06826],[-14.49593,28.04585],[-14.52156,28.04678]],[[-13.80066,28.84566],[-13.80093,28.82311],[-13.77569,28.82305],[-13.69729,28.88982],[-13.69729,28.91277],[-13.60725,28.9118],[-13.43886,29.00024],[-13.43746,29.13513],[-13.4117,29.13499],[-13.41056,29.22298],[-13.45928,29.25559],[-13.45974,29.2942],[-13.50913,29.29456],[-13.51006,29.31635],[-13.56354,29.31729],[-13.56406,29.27138],[-13.53892,29.2712],[-13.53897,29.25004],[-13.56613,29.25013],[-13.5666,29.203],[-13.51565,29.20223],[-13.51565,29.18206],[-13.5398,29.18278],[-13.54089,29.13753],[-13.65782,29.13685],[-13.71322,29.09351],[-13.76634,29.09345],[-13.85025,29.01659],[-13.85182,28.98343],[-13.85244,28.91486],[-13.90131,28.89245],[-13.9024,28.84698],[-13.80066,28.84566]],[[1.64799,38.99907],[1.73217,38.99936],[1.73147,39.04417],[1.64895,39.04319],[1.64816,39.12764],[1.39486,39.12657],[1.39544,39.08642],[1.22811,39.08526],[1.22911,39.0029],[1.14487,39.0018],[1.14528,38.832],[1.31136,38.83316],[1.31219,38.79065],[1.39469,38.79162],[1.39519,38.75296],[1.31128,38.75193],[1.31259,38.62388],[1.6489,38.62511],[1.64807,38.71115],[1.58456,38.71012],[1.58116,38.70054],[1.54915,38.70028],[1.51972,38.70921],[1.50355,38.72532],[1.48133,38.91551],[1.55189,38.92544],[1.56673,38.95666],[1.64874,38.95833],[1.64799,38.99907]],[[2.54507,39.41667],[2.43933,39.41611],[2.43871,39.48469],[2.43902,39.49934],[2.31223,39.49934],[2.31192,39.54179],[2.22907,39.541],[2.22835,39.62606],[2.34601,39.62709],[2.92704,39.96016],[3.14566,39.96005],[3.14608,40.00198],[3.23139,40.00198],[3.23129,39.83292],[3.14823,39.83316],[3.14844,39.79357],[3.48148,39.79318],[3.48035,39.5959],[3.31506,39.47846],[3.31462,39.37855],[3.08302,39.24994],[2.97986,39.25015],[2.97904,39.3335],[2.72874,39.33342],[2.72885,39.45814],[2.64569,39.45774],[2.64538,39.49966],[2.54528,39.49942],[2.54507,39.41667]],[[3.81204,40.04344],[3.72908,40.0438],[3.72862,39.95842],[3.81266,39.9576],[3.81228,39.91644],[3.9609,39.91598],[4.19381,39.79131],[4.31503,39.79058],[4.31599,39.83293],[4.39874,39.83204],[4.39737,39.91858],[4.3158,39.91933],[4.31619,40.0434],[4.2319,40.04436],[4.23248,40.08478],[4.14915,40.08611],[4.14906,40.12552],[4.0628,40.12722],[4.06242,40.08499],[3.81287,40.08529],[3.81204,40.04344]],[[-8.89106,41.82289],[-9.1092,42.57511],[-9.03655,42.73066],[-9.08834,42.72696],[-9.14661,42.77503],[-9.21855,42.90163],[-9.2761,42.86051],[-9.30991,42.93113],[-9.27898,42.9822],[-9.30991,43.06004],[-9.25236,43.10417],[-9.2315,43.17032],[-9.14733,43.21018],[-9.06748,43.19916],[-9.03367,43.24267],[-8.99842,43.24477],[-8.99986,43.29558],[-8.93727,43.30553],[-8.92936,43.32699],[-8.8639,43.32908],[-8.87613,43.37407],[-8.82217,43.37354],[-8.78548,43.31914],[-8.70635,43.305],[-8.60996,43.3296],[-8.55097,43.32332],[-8.52435,43.3364],[-8.52507,43.36465],[-8.45745,43.39184],[-8.36105,43.41118],[-8.36033,43.46342],[-8.33444,43.57974],[-8.27761,43.57088],[-8.06467,43.72392],[-7.99921,43.7234],[-7.9172,43.78264],[-7.85605,43.79146],[-7.83591,43.73743],[-7.66284,43.80982],[-7.31889,43.67827],[-7.19975,43.58308],[-6.24882,43.6075],[-6.12293,43.57901],[-5.85204,43.6799],[-5.60363,43.57087],[-5.28553,43.56191],[-5.17875,43.49916],[-4.90899,43.48367],[-4.61562,43.4192],[-4.18399,43.42492],[-3.80295,43.51954],[-3.74,43.48693],[-3.56128,43.54236],[-3.1083,43.38163],[-2.93857,43.46246],[-2.74524,43.47551],[-2.30462,43.31706],[-1.9854,43.3563],[-1.85528,43.39725],[-1.7698,43.39644],[-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],[3.23049,42.37644],[3.31415,42.37604],[3.31412,42.33399],[3.39785,42.33404],[3.39739,42.29009],[3.31389,42.29084],[3.31397,42.20702],[3.14759,42.2073],[3.14759,42.12606],[3.23055,42.126],[3.24668,41.95294],[3.19452,41.85589],[3.06054,41.76474],[2.78358,41.63718],[2.26293,41.42716],[2.16492,41.29893],[1.86008,41.22322],[1.3763,41.11627],[1.17937,41.04646],[1.08585,41.04849],[0.75854,40.81956],[0.9114,40.73376],[0.87813,40.67514],[0.66502,40.53587],[0.55801,40.55022],[0.43392,40.37576],[0.26756,40.19192],[0.16415,40.06472],[0.07513,40.01447],[0.01039,39.89522],[-0.09392,39.81169],[-0.18474,39.63117],[-0.29085,39.50363],[-0.28636,39.33343],[-0.18564,39.17746],[-0.21352,39.15585],[-0.11101,38.97222],[0.00949,38.88268],[0.12189,38.87218],[0.23429,38.79864],[0.25587,38.72642],[0.09581,38.61338],[-0.0022,38.60706],[-0.05705,38.52691],[-0.27197,38.47624],[-0.37987,38.39312],[-0.38347,38.33813],[-0.45091,38.33108],[-0.50487,38.28309],[-0.48238,38.19481],[-0.42933,38.16583],[-0.45451,38.14886],[-0.584,38.17219],[-0.61367,38.11986],[-0.63705,37.96122],[-0.68111,37.94562],[-0.73237,37.88107],[-0.72158,37.78306],[-0.68831,37.734],[-0.66415,37.62315],[-0.71939,37.58784],[-0.91963,37.53758],[-1.11071,37.51641],[-1.33832,37.52867],[-1.44089,37.39037],[-1.6767,37.27652],[-1.85408,36.91229],[-2.06835,36.69291],[-2.21588,36.66192],[-2.37219,36.78018],[-2.68129,36.65911],[-2.92015,36.66756],[-3.09402,36.71263],[-3.46108,36.65488],[-3.72804,36.69291],[-4.37435,36.66333],[-4.65712,36.44042],[-4.9188,36.45313],[-5.16995,36.35135],[-5.28411,36.19702],[-5.26809,36.12418],[-5.35248,36.12247],[-5.35161,36.04014],[-5.43658,36.03889],[-5.43532,36.00344],[-5.68886,36.00365],[-5.68996,36.04053],[-5.85506,36.03856],[-5.85668,36.12421],[-5.93848,36.12215],[-5.94003,36.16556],[-5.99834,36.1645],[-6.03573,36.1781],[-6.07752,36.22241],[-6.15061,36.28646],[-6.23154,36.37701],[-6.33585,36.53106],[-6.32146,36.58163],[-6.40419,36.6235],[-6.47433,36.74897],[-6.41588,36.79939],[-6.49052,36.91738],[-6.62989,37.0194],[-6.87448,37.10838],[-7.04264,37.18507],[-7.26474,37.18435],[-7.37535,37.15354],[-7.40832,37.16822],[-7.42029,37.21183],[-7.42492,37.23505],[-7.43805,37.2452],[-7.44597,37.33261],[-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]]],terms_text:"PNOA",best:true},{id:"poco_das_trincheiras",name:"Poço das Trincheiras AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.23942,-9.35157],[-37.23947,-9.34387],[-37.23942,-9.33792],[-37.23954,-9.33022],[-37.23973,-9.32791],[-37.23974,-9.3228],[-37.23964,-9.32085],[-37.23971,-9.31864],[-37.2398,-9.31706],[-37.23982,-9.31561],[-37.24053,-9.30933],[-37.24051,-9.30004],[-37.24008,-9.29687],[-37.23998,-9.29546],[-37.23992,-9.29319],[-37.23989,-9.28978],[-37.23995,-9.28818],[-37.24008,-9.28641],[-37.24036,-9.28212],[-37.24038,-9.27897],[-37.24051,-9.27557],[-37.24004,-9.26979],[-37.24018,-9.26721],[-37.24018,-9.26612],[-37.23995,-9.26455],[-37.23983,-9.26151],[-37.24333,-9.26136],[-37.24936,-9.26146],[-37.26445,-9.26161],[-37.28016,-9.26172],[-37.28294,-9.26171],[-37.29581,-9.26178],[-37.30685,-9.26178],[-37.31419,-9.26189],[-37.32437,-9.26192],[-37.33078,-9.26175],[-37.33057,-9.27275],[-37.33048,-9.28007],[-37.33054,-9.28117],[-37.33069,-9.28427],[-37.3307,-9.28535],[-37.33064,-9.28617],[-37.33071,-9.28717],[-37.33064,-9.28769],[-37.33062,-9.29027],[-37.33043,-9.29308],[-37.33038,-9.29655],[-37.33034,-9.30591],[-37.3304,-9.31203],[-37.33038,-9.32194],[-37.33041,-9.3342],[-37.33035,-9.34185],[-37.3303,-9.34783],[-37.33035,-9.35202],[-37.31509,-9.35194],[-37.30011,-9.3519],[-37.29531,-9.35183],[-37.28899,-9.35171],[-37.28497,-9.35182],[-37.27851,-9.35173],[-37.27431,-9.35181],[-37.27115,-9.3517],[-37.26351,-9.35168],[-37.26046,-9.35164],[-37.25402,-9.35177],[-37.24705,-9.35163],[-37.23942,-9.35157]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"e-mapa.net-buildings",name:"polska.e-mapa.net: Buildings",type:"wms",template:"http://wms02.epodgik.pl/cgi-bin/KrajowaIntegracjaEwidencjiGruntow?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[15.9751,54.37092],[16.31116,54.55618],[17.13919,54.78457],[18.34485,54.90227],[19.66137,54.47372],[20.28152,54.42135],[21.46639,54.34064],[22.77599,54.37698],[22.8626,54.42336],[23.29567,54.26786],[23.53472,54.09553],[23.52086,53.97752],[23.71834,53.46296],[23.92968,53.18567],[23.92968,52.68873],[23.7322,52.60675],[23.5659,52.58781],[23.20905,52.33026],[23.19519,52.23701],[23.50354,52.18606],[23.69062,52.00301],[23.59708,51.7399],[23.66291,51.38886],[23.9366,50.98278],[24.16873,50.86048],[24.01975,50.80358],[24.10983,50.66105],[24.05786,50.41884],[23.61787,50.30834],[22.68244,49.51635],[22.73788,49.20949],[22.90417,49.07804],[22.8626,48.99401],[22.60969,49.03718],[22.07615,49.20044],[21.84749,49.37219],[21.37631,49.44883],[21.10262,49.37219],[20.91207,49.3022],[20.6453,49.39023],[20.18451,49.33156],[20.11869,49.20044],[19.942,49.13021],[19.76531,49.21176],[19.74798,49.39925],[19.60247,49.41503],[19.50893,49.58154],[19.42925,49.59052],[19.23177,49.41503],[18.99618,49.38798],[18.93382,49.4916],[18.83681,49.49386],[18.80216,49.66234],[18.6428,49.70941],[18.52154,49.89947],[18.08154,50.01092],[17.88753,49.98865],[17.73855,50.06877],[17.6069,50.17096],[17.74548,50.21532],[17.71084,50.3017],[17.41635,50.26407],[16.94864,50.44533],[16.89321,50.40339],[17.00061,50.31055],[17.01793,50.22419],[16.81352,50.18649],[16.64029,50.09767],[16.43242,50.28621],[16.19683,50.42767],[16.42203,50.58852],[16.33888,50.66324],[16.22802,50.63688],[16.05479,50.61271],[15.57322,50.76415],[15.26834,50.89764],[15.24409,50.9806],[15.02929,51.0133],[15.00157,50.85829],[14.81102,50.87359],[14.95653,51.07212],[15.01889,51.29146],[14.93921,51.46015],[14.72094,51.55718],[14.75212,51.62606],[14.59968,51.84276],[14.70362,52.07334],[14.55811,52.24974],[14.51654,52.42544],[14.60315,52.58781],[14.11465,52.82083],[14.15276,52.9734],[14.35024,53.07342],[14.42299,53.26656],[14.1978,53.87348],[14.22205,53.99585],[15.9751,54.37092]]],terms_url:"https://polska.e-mapa.net/",terms_text:"polska.e-mapa.net - Geoportal otwartych danych przestrzennych",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/polskae-mapanetBuildings.png"},{id:"debicki-buildings",name:"Powiat dębicki: Buildings",type:"wms",template:"https://debica.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,adresy,EBU,EBT,S&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.53768,50.01085],[21.51944,50.05423],[21.58099,50.1233],[21.48804,50.18059],[21.13725,50.14835],[21.13939,50.12721],[21.18058,50.12101],[21.14315,50.05965],[21.15356,49.92854],[21.27892,49.92554],[21.22448,49.8861],[21.22362,49.84258],[21.35177,49.8349],[21.36368,49.86838],[21.41585,49.82003],[21.47943,49.8398],[21.52679,49.88911],[21.47689,50.00135],[21.53768,50.01085]]],terms_text:"Powiat dębicki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lancucki-buildings",name:"Powiat łańcucki: Buildings",type:"wms",template:"https://lancut.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.17224,50.10121],[22.12574,50.1079],[22.0823,50.17206],[22.13591,50.1867],[22.173,50.18117],[22.18418,50.22914],[22.235,50.24718],[22.3856,50.16031],[22.40346,50.13331],[22.45275,50.12745],[22.45275,50.10676],[22.41768,50.08997],[22.38364,50.08915],[22.38542,50.05393],[22.35315,50.05067],[22.3562,50.00627],[22.31478,49.99451],[22.32139,49.94614],[22.29979,49.92455],[22.24161,49.92847],[22.20901,49.93728],[22.22382,49.96085],[22.16683,50.00412],[22.1387,50.00251],[22.12015,50.04626],[22.17224,50.10121]]],terms_text:"Powiat łańcucki",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"lubaczowski-buildings",name:"Powiat lubaczowski: Buildings",type:"wms",template:"https://lubaczow.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=S,EBT,adresy,budynki_ewid&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[23.29224,50.09693],[23.55763,50.25704],[23.51394,50.26643],[23.522,50.29892],[23.40991,50.3083],[23.44482,50.35653],[23.38072,50.3699],[23.38829,50.4058],[23.35821,50.41105],[23.2527,50.36601],[23.19379,50.40529],[23.01962,50.2928],[22.84161,50.30574],[22.83572,50.27037],[22.82426,50.26923],[22.79651,50.20933],[22.86603,50.18949],[22.87414,50.13786],[22.93233,50.1678],[22.88954,50.11501],[22.95351,50.07178],[23.05556,50.04967],[22.99884,49.99028],[23.14951,49.97563],[23.29224,50.09693]]],terms_text:"Powiat lubaczowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznanski-buildings",name:"Powiat poznański: Buildings",type:"wms",template:"http://wms.podgik.poznan.pl/cgi-bin/poznan?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",polygon:[[[16.9585,52.46312],[17.03946,52.33605],[16.84291,52.36501],[16.78596,52.46566],[16.70022,52.53819],[16.6415,52.5288],[16.44898,52.36793],[16.47775,52.2696],[16.5659,52.26813],[16.58375,52.17007],[17.08099,52.14981],[17.37124,52.34522],[17.39853,52.44037],[17.35338,52.53949],[17.13689,52.57783],[17.13126,52.6419],[17.01608,52.68366],[16.9158,52.65079],[16.85814,52.58191],[16.7367,52.57459],[16.70022,52.53824],[16.78598,52.46567],[16.9585,52.46312]]],terms_text:"PODGIK Poznań",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatpoznaskiOrthophotomap(aerialimage).png"},{id:"sropczyce-buildings",name:"Powiat ropczycko-sędziszowski: Buildings",type:"wms",template:"https://spropczyce.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[21.60041,50.21025],[21.74199,50.16538],[21.792,50.17829],[21.81459,50.15264],[21.78741,50.10859],[21.82597,50.09149],[21.82552,50.02925],[21.78666,49.97585],[21.70632,49.96022],[21.683,49.92431],[21.60062,49.91793],[21.54249,49.8862],[21.5188,49.89119],[21.45315,49.99268],[21.50364,50.0198],[21.49298,50.07161],[21.55535,50.11909],[21.50429,50.16559],[21.59816,50.17866],[21.60041,50.21025]]],terms_text:"Powiat ropczycko-sędziszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-buildings",name:"Powiat rzeszowski: Buildings",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,EBT,EBU&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"rzeszowski-aerial",name:"Powiat rzeszowski: Orthophotomap (aerial image)",type:"wms",template:"https://powiatrzeszowski.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.18219,50.17339],[22.09834,50.17176],[22.18016,50.09784],[22.13779,50.00695],[22.09444,50.00841],[22.02839,50.06668],[21.9354,50.06636],[21.98164,49.94977],[22.05278,50.0097],[22.1771,50.00555],[22.23319,49.96829],[22.31144,49.87008],[22.34961,49.72826],[21.99951,49.82808],[21.84961,49.95739],[21.7495,49.96981],[21.78503,50.14212],[21.93307,50.24748],[22.08291,50.26471],[21.98553,50.31545],[22.0901,50.37369],[22.19821,50.35265],[22.2536,50.2647],[22.18219,50.17339]]],terms_text:"Powiat rzeszowski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"stalowowolski-buildings",name:"Powiat stalowowolski: Buildings",type:"wms",template:"https://stalowawola.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=EBT,adresy,budynki,centroidy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.017,50.35811],[22.09292,50.44916],[22.06785,50.51434],[22.09722,50.54302],[22.16347,50.52686],[22.23795,50.5503],[22.26768,50.60465],[22.22757,50.6653],[22.16235,50.66969],[22.20843,50.75403],[22.16239,50.80039],[22.0546,50.82234],[21.94394,50.77639],[21.86228,50.80439],[21.83413,50.75035],[21.87465,50.70066],[21.84046,50.65749],[21.97582,50.53164],[21.84797,50.47196],[21.88045,50.3913],[22.017,50.35811]]],terms_text:"Powiat stalowowolski",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"poznan-buildings",name:"Poznań: Buildings",type:"wms",template:"http://wms2.geopoz.poznan.pl:8080/geoserver/sip/wms?SERVICE=WMS&FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki_ewidencyjne_sql&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2014",name:"Poznań: Orthophotomap 2014 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapa_2014/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2014_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"poznan-ortofotomapa2016",name:"Poznań: Orthophotomap 2016 (aerial image)",type:"wms",template:"http://wms1.geopoz.poznan.pl:6080/arcgis/services/sip/ortofotomapy/MapServer/WmsServer?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa_2016_image&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2016-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[16.72794,52.48838],[16.86925,52.48982],[16.86879,52.50779],[16.93948,52.50845],[16.93926,52.51743],[16.98639,52.51784],[16.98784,52.45494],[17.03491,52.45534],[17.0353,52.43736],[17.08235,52.43774],[17.0831,52.4018],[17.0596,52.40161],[17.06129,52.32075],[17.01438,52.32035],[17.01518,52.28441],[16.96829,52.28401],[16.96787,52.30198],[16.89752,52.30134],[16.89662,52.33728],[16.80273,52.33638],[16.80176,52.37232],[16.77828,52.3721],[16.77603,52.45294],[16.72897,52.45244],[16.72794,52.48838]]],terms_text:"Zarząd Geodezji i Katastru Miejskiego GEOPOZ"},{id:"PrahaIPRlatestorthophoto",name:"Praha IPR latest orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/letecke_snimky_posledni_snimkovani_cache/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:4326",zoomExtent:[1,20],polygon:[[[14.81232,49.93089],[14.18755,49.87687],[14.12025,50.19882],[14.74502,50.25247],[14.81232,49.93089]]]},{id:"PrahaIPRlow-vegetationorthophoto",name:"Praha IPR low-vegetation orthophoto",type:"wms",template:"http://giswa1.mag.mepnet.cz/arcgis/services/MAP/mimovegetacni_snimkovani_cache/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:4326",zoomExtent:[1,20],polygon:[[[14.30454,49.99538],[14.31604,49.94205],[14.35,49.94508],[14.35384,49.92726],[14.42385,49.93352],[14.42009,49.95097],[14.48865,49.95709],[14.48479,49.97501],[14.55386,49.98117],[14.55012,49.99852],[14.58455,50.00159],[14.5883,49.98424],[14.69168,49.99346],[14.67634,50.06453],[14.71279,50.06777],[14.70115,50.12158],[14.6647,50.11834],[14.661,50.13543],[14.62755,50.13246],[14.61965,50.16895],[14.58543,50.16591],[14.58163,50.18344],[14.40776,50.168],[14.41156,50.15045],[14.37765,50.14744],[14.3738,50.16524],[14.33893,50.16214],[14.34278,50.14434],[14.27368,50.1382],[14.27749,50.12058],[14.2088,50.11447],[14.21289,50.09557],[14.24656,50.09857],[14.25417,50.06336],[14.21987,50.0603],[14.2237,50.04259],[14.258,50.04565],[14.26953,49.99226],[14.30454,49.99538]]]},{id:"przemysl-buildings",name:"Przemyśl: Buildings",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=adresy,budynki&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"przemysl-aerial",name:"Przemyśl: Ortophotomap (aerial image)",type:"wms",template:"http://przemysl.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.72268,49.76885],[22.73002,49.76787],[22.73097,49.77612],[22.72027,49.77662],[22.71787,49.78062],[22.73104,49.78553],[22.7244,49.79043],[22.73458,49.80441],[22.73167,49.81429],[22.7261,49.8165],[22.72762,49.82124],[22.74395,49.8187],[22.75952,49.80939],[22.79042,49.81462],[22.81169,49.80571],[22.79738,49.80146],[22.80384,49.79247],[22.83118,49.79664],[22.85752,49.78561],[22.84549,49.76746],[22.82485,49.77105],[22.82004,49.75674],[22.77358,49.74439],[22.73838,49.75895],[22.72205,49.74644],[22.71065,49.76288],[22.72268,49.76885]]],terms_text:"Miasto Przemyśl",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/pl/PowiatrzeszowskiBuildings.png"},{id:"RABA-KGZ-3000",name:"RABA-KGZ: Slovenia built-up areas",type:"tms",template:"http://wms.openstreetmap.de/tms/RABA3000/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2015 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"RABA-KGZ",name:"RABA-KGZ: Slovenia farmland use",type:"tms",template:"http://wms.openstreetmap.de/tms/RABA/{zoom}/{x}/{y}.png",zoomExtent:[8,19],polygon:[[[15.17101,45.41273],[15.06731,45.4781],[14.98353,45.48726],[14.93027,45.51869],[14.91295,45.46869],[14.81398,45.45019],[14.77755,45.49724],[14.71885,45.52386],[14.68383,45.51924],[14.68367,45.57107],[14.58902,45.61966],[14.59477,45.65727],[14.51653,45.5974],[14.49636,45.52968],[14.32388,45.46048],[14.28251,45.47949],[14.26083,45.47352],[14.2367,45.49569],[14.21022,45.45962],[14.1328,45.46542],[14.06694,45.47615],[14.01187,45.50769],[13.98752,45.49945],[14.00668,45.4739],[13.99154,45.44854],[13.91789,45.44329],[13.88867,45.416],[13.81063,45.42531],[13.7856,45.45577],[13.67553,45.43241],[13.58846,45.46171],[13.45377,45.59765],[13.62822,45.64153],[13.72158,45.60472],[13.83759,45.59226],[13.89962,45.63295],[13.82754,45.67917],[13.82429,45.70266],[13.78961,45.73525],[13.66355,45.79008],[13.62279,45.78613],[13.58835,45.80154],[13.56531,45.85522],[13.62633,45.93894],[13.62975,45.97662],[13.59233,45.97929],[13.57124,45.9591],[13.52998,45.95627],[13.46729,46.00147],[13.49765,46.03741],[13.4896,46.06574],[13.58839,46.11268],[13.63712,46.14524],[13.65358,46.17505],[13.57147,46.17434],[13.54859,46.19982],[13.48189,46.21479],[13.42003,46.19662],[13.40026,46.21037],[13.40304,46.23284],[13.36653,46.30266],[13.43369,46.33243],[13.43247,46.36779],[13.56263,46.40895],[13.59357,46.44846],[13.68393,46.44947],[13.71321,46.53296],[13.79725,46.5164],[13.91305,46.53108],[14.00849,46.49169],[14.09406,46.49538],[14.12664,46.4852],[14.16569,46.44341],[14.28242,46.45347],[14.3259,46.44111],[14.43178,46.4568],[14.45113,46.43239],[14.52618,46.43623],[14.56677,46.38549],[14.58993,46.44479],[14.65658,46.45447],[14.71191,46.50954],[14.80818,46.51778],[14.81442,46.55093],[14.86094,46.61239],[14.9102,46.61569],[14.95398,46.64257],[14.98376,46.61868],[15.02973,46.65796],[15.10645,46.66965],[15.23727,46.64973],[15.41364,46.66553],[15.46237,46.64732],[15.47411,46.6226],[15.53427,46.64346],[15.53636,46.6761],[15.59201,46.69952],[15.62405,46.69039],[15.65624,46.71643],[15.767,46.70899],[15.83801,46.73237],[15.91476,46.71958],[16.02919,46.67033],[16.02955,46.68778],[15.99495,46.71178],[15.97505,46.74967],[15.98671,46.84189],[16.0553,46.85049],[16.11022,46.87912],[16.15425,46.86525],[16.23302,46.88667],[16.29431,46.8824],[16.34649,46.85476],[16.36058,46.8278],[16.34711,46.79707],[16.32245,46.79068],[16.33977,46.7799],[16.33186,46.75896],[16.38893,46.70785],[16.4383,46.69655],[16.42822,46.65301],[16.40159,46.6439],[16.51477,46.57299],[16.54136,46.53627],[16.5416,46.50887],[16.611,46.48393],[16.61889,46.46203],[16.52219,46.45842],[16.47451,46.50108],[16.36776,46.53371],[16.2582,46.489],[16.28533,46.42441],[16.3168,46.40141],[16.30574,46.36921],[16.18689,46.36804],[16.14548,46.39515],[16.06959,46.38154],[16.08614,46.34087],[16.04058,46.32708],[16.01819,46.29964],[15.80777,46.25091],[15.79649,46.21296],[15.77128,46.19937],[15.67996,46.21707],[15.65737,46.20838],[15.65639,46.18456],[15.62037,46.16163],[15.61899,46.11595],[15.63483,46.09529],[15.71869,46.06873],[15.74241,46.04578],[15.71612,45.99489],[15.71645,45.9178],[15.69237,45.90013],[15.69375,45.87111],[15.71776,45.8416],[15.6441,45.81058],[15.57467,45.83999],[15.52333,45.81155],[15.49115,45.82041],[15.47514,45.78666],[15.40343,45.78216],[15.28683,45.73391],[15.27435,45.72408],[15.29763,45.70782],[15.36329,45.72191],[15.41517,45.65443],[15.39705,45.62929],[15.31501,45.62356],[15.31503,45.60696],[15.29266,45.60163],[15.30852,45.58653],[15.31145,45.5423],[15.39496,45.48325],[15.34824,45.44665],[15.27515,45.45599],[15.22848,45.41683],[15.17101,45.41273]]],terms_url:"https://wiki.openstreetmap.org/wiki/Slovenia_Landcover_Import_-_RABA-KGZ",terms_text:"Copyright ©2015 Ministrstvo za kmetijstvo, gozdarstvo in prehrano (mkgp.gov.si). Some rights reserved.",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/si/RABA-KGZSloveniafarmlanduse.png"},{id:"riksantikvaren-kulturminner",name:"Riksantikvaren Heritage Sites overlay",type:"wms",template:"https://kart.ra.no/arcgis/services/Distribusjon/Kulturminner/MapServer/WmsServer?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=3,6&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[13,22],polygon:[[[-10.95725,71.60964],[-6.16765,71.62095],[-6.13756,70.30991],[-10.92717,70.29784],[-10.95725,71.60964]],[[16.81947,74.9482],[21.25771,74.94213],[21.23712,73.8918],[16.79889,73.89828],[16.81947,74.9482]],[[4.04288,79.93593],[20.65421,81.54417],[36.6503,80.40108],[26.76265,75.8129],[13.88667,75.79135],[4.04288,79.93593]],[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.riksantikvaren.no/Veiledning/Data-og-tjenester/Karttjenester",terms_text:"© Riksantikvaren",description:"Archeological and architectural monuments/sites and cultural environments protected by law (''enkeltminner'') from the Norwegian Directorate for Cultural Heritage",icon:"https://www.riksantikvaren.no/extension/riksantikvaren/design/internetsite/images/logo_na.png",overlay:true},{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.17709,-22.96971],[-43.14586,-22.96959],[-43.14605,-22.92719],[-43.15625,-22.92731],[-43.15647,-22.87557],[-43.17739,-22.87494],[-43.17742,-22.88553],[-43.19804,-22.88571],[-43.19804,-22.85429],[-43.21875,-22.85444],[-43.21901,-22.83365],[-43.22937,-22.83365],[-43.22934,-22.82371],[-43.19869,-22.82353],[-43.19856,-22.83413],[-43.18826,-22.83398],[-43.18804,-22.84448],[-43.16667,-22.84442],[-43.16683,-22.83404],[-43.15638,-22.83407],[-43.15654,-22.81336],[-43.10436,-22.81306],[-43.10446,-22.80288],[-43.09387,-22.80276],[-43.0941,-22.73998],[-43.13599,-22.73992],[-43.13569,-22.75067],[-43.12573,-22.75055],[-43.12556,-22.77118],[-43.14595,-22.77109],[-43.14612,-22.76055],[-43.17771,-22.76088],[-43.17758,-22.77115],[-43.18807,-22.7713],[-43.18807,-22.78166],[-43.25067,-22.78163],[-43.25057,-22.79198],[-43.28054,-22.79282],[-43.30343,-22.79312],[-43.33353,-22.79297],[-43.33347,-22.80258],[-43.38574,-22.8024],[-43.38542,-22.81255],[-43.41691,-22.81285],[-43.41675,-22.82341],[-43.42717,-22.82335],[-43.4274,-22.83374],[-43.45844,-22.83362],[-43.45864,-22.81276],[-43.48984,-22.813],[-43.48994,-22.7965],[-43.50208,-22.79746],[-43.51543,-22.79737],[-43.52078,-22.79591],[-43.54169,-22.79603],[-43.54179,-22.80234],[-43.54653,-22.80246],[-43.54666,-22.81189],[-43.55251,-22.81279],[-43.56991,-22.81294],[-43.56998,-22.8197],[-43.57361,-22.82326],[-43.58348,-22.82329],[-43.58352,-22.83347],[-43.59391,-22.83374],[-43.59394,-22.85468],[-43.66099,-22.85459],[-43.66099,-22.85983],[-43.70852,-22.86019],[-43.70836,-22.86503],[-43.72206,-22.86488],[-43.72213,-22.86847],[-43.75015,-22.86859],[-43.75009,-22.8753],[-43.76038,-22.87527],[-43.75992,-22.8785],[-43.75976,-22.88457],[-43.76132,-22.88586],[-43.78129,-22.8858],[-43.78126,-22.89591],[-43.80213,-22.89621],[-43.80135,-22.91137],[-43.80119,-22.92758],[-43.79213,-22.92776],[-43.7922,-22.93822],[-43.78191,-22.93799],[-43.78184,-22.94869],[-43.75067,-22.94845],[-43.7506,-22.95909],[-43.72986,-22.95886],[-43.72966,-22.97984],[-43.70904,-22.97966],[-43.70891,-22.99033],[-43.69846,-22.99006],[-43.69836,-23.00065],[-43.66735,-23.00044],[-43.66726,-23.01117],[-43.63125,-23.00937],[-43.63131,-23.02079],[-43.63586,-23.02091],[-43.63602,-23.03164],[-43.67771,-23.03164],[-43.67765,-23.04233],[-43.67086,-23.0423],[-43.67109,-23.0631],[-43.64599,-23.06304],[-43.64605,-23.05276],[-43.60475,-23.05255],[-43.60452,-23.06307],[-43.58381,-23.06289],[-43.58368,-23.08404],[-43.54186,-23.08383],[-43.54195,-23.06319],[-43.52147,-23.06301],[-43.5213,-23.07352],[-43.50043,-23.07337],[-43.50043,-23.04218],[-43.45877,-23.04221],[-43.4587,-23.03194],[-43.43782,-23.03182],[-43.43776,-23.02154],[-43.3235,-23.02121],[-43.3233,-23.04212],[-43.31291,-23.04195],[-43.31275,-23.05267],[-43.30239,-23.05258],[-43.30236,-23.04227],[-43.29194,-23.04215],[-43.29197,-23.03194],[-43.27109,-23.03182],[-43.27119,-23.01093],[-43.26061,-23.01087],[-43.26067,-23.00059],[-43.25057,-23.00047],[-43.25054,-23.01126],[-43.23989,-23.01102],[-43.23986,-23.00062],[-43.21908,-23.0005],[-43.21904,-22.99021],[-43.20901,-22.99009],[-43.20862,-23.08389],[-43.18768,-23.08377],[-43.18761,-23.07334],[-43.13582,-23.07337],[-43.13589,-23.05249],[-43.17732,-23.05255],[-43.17709,-22.96971]]],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",zoomExtent:[0,13],polygon:[[[-42.30363,-22.43698],[-44.10842,-22.06579],[-44.5313,-23.7863],[-42.70469,-24.16178],[-42.30363,-22.43698]]],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",zoomExtent:[12,20],polygon:[[[-2.7,43.9],[-6.3,48.98],[-2.25,50.09],[1.31,50.88],[2.35816,51.32937],[2.5488,51.09759],[2.57048,51.07409],[2.58741,51.01763],[2.59845,51.0051],[2.61558,50.99749],[2.63986,50.95766],[2.64225,50.94578],[2.62452,50.9256],[2.61962,50.91067],[2.62396,50.86071],[2.62781,50.85054],[2.63786,50.83696],[2.6511,50.82906],[2.73267,50.81738],[2.79995,50.73795],[2.81655,50.73092],[2.85265,50.73335],[2.89072,50.7162],[2.90492,50.71536],[2.9161,50.72418],[2.93508,50.75592],[3.00718,50.78377],[3.08218,50.78749],[3.09244,50.79092],[3.11412,50.80566],[3.14877,50.80195],[3.2154,50.73111],[3.22149,50.7267],[3.27051,50.70375],[3.27545,50.67757],[3.26576,50.6604],[3.26588,50.64054],[3.28922,50.60028],[3.29219,50.55037],[3.3056,50.53267],[3.37551,50.50839],[3.3898,50.50884],[3.4748,50.54445],[3.52173,50.53459],[3.53266,50.51873],[3.54779,50.51012],[3.61523,50.50558],[3.67378,50.45642],[3.68415,50.35277],[3.6901,50.34044],[3.70258,50.33482],[3.71576,50.33854],[3.74935,50.36279],[3.84109,50.36558],[3.90189,50.3436],[3.91317,50.34291],[4.02672,50.36904],[4.13761,50.29984],[4.14388,50.29727],[4.21444,50.28167],[4.22904,50.26664],[4.23078,50.25233],[4.17084,50.18579],[4.16601,50.16888],[4.1764,50.1547],[4.21195,50.13602],[4.24074,50.07102],[4.23193,50.05551],[4.18164,50.03436],[4.17177,50.02537],[4.16976,50.01217],[4.1765,50.00065],[4.20633,49.97546],[4.22164,49.97089],[4.30877,49.98145],[4.44542,49.9523],[4.45469,49.95251],[4.6581,50.00609],[4.66936,50.01392],[4.67293,50.02716],[4.66924,50.06972],[4.69517,50.10472],[4.83123,50.17941],[4.8815,50.16436],[4.90479,50.14451],[4.90426,50.12639],[4.88076,50.0815],[4.86277,50.0745],[4.85104,50.06216],[4.84331,50.03884],[4.84331,50.03883],[4.8433,50.03881],[4.82678,49.989],[4.82662,49.97692],[4.83343,49.96696],[4.89654,49.91753],[4.89755,49.89424],[4.87913,49.86942],[4.87625,49.85111],[4.88924,49.81266],[4.89769,49.80204],[4.91098,49.79926],[4.99534,49.81116],[5.01867,49.79272],[5.02686,49.78886],[5.09944,49.77323],[5.13458,49.73462],[5.1412,49.72984],[5.18761,49.70906],[5.19602,49.70732],[5.28157,49.70836],[5.33363,49.67308],[5.344,49.65049],[5.3544,49.64041],[5.43141,49.60791],[5.48205,49.52815],[5.49294,49.51979],[5.50666,49.52042],[5.55401,49.54025],[5.59311,49.53424],[5.6076,49.53761],[5.641,49.56095],[5.70676,49.55267],[5.71578,49.55361],[5.77526,49.57414],[5.8399,49.55321],[5.86126,49.52038],[5.876,49.5114],[5.97516,49.50129],[5.99801,49.47317],[6.01627,49.46597],[6.08635,49.47562],[6.09319,49.47787],[6.17397,49.52187],[6.24643,49.52511],[6.334,49.48235],[6.34423,49.48037],[6.43515,49.487],[6.5451,49.44384],[6.60639,49.37868],[6.60497,49.33739],[6.61627,49.31869],[6.67013,49.29269],[6.72996,49.22917],[6.74328,49.19086],[6.76026,49.17752],[6.80904,49.17284],[6.82473,49.17826],[6.83093,49.19366],[6.82982,49.21802],[6.85119,49.23136],[6.88453,49.2239],[6.89322,49.22389],[6.93753,49.23369],[7.04055,49.19794],[7.0463,49.17503],[7.05478,49.16313],[7.06908,49.16018],[7.10494,49.16634],[7.14315,49.14159],[7.1535,49.13839],[7.28683,49.13488],[7.29893,49.13856],[7.36095,49.18259],[7.45012,49.19517],[7.50113,49.17672],[7.54379,49.10572],[7.5579,49.09626],[7.6296,49.08527],[7.64722,49.06722],[7.6612,49.06119],[7.75401,49.05963],[7.76073,49.06067],[7.80291,49.07489],[7.85525,49.05329],[7.8673,49.05227],[7.93826,49.06832],[8.08069,49.00688],[8.2225,48.98787],[8.23704,48.97683],[8.23589,48.95817],[8.20888,48.94863],[8.20089,48.94339],[8.15824,48.89753],[8.10087,48.7993],[7.99071,48.74478],[7.98534,48.7409],[7.90422,48.65865],[7.85605,48.63606],[7.8484,48.62977],[7.81842,48.58883],[7.81456,48.57704],[7.81449,48.50968],[7.78547,48.48337],[7.78055,48.47652],[7.74506,48.39484],[7.74357,48.38427],[7.75159,48.32322],[7.71085,48.29841],[7.70241,48.28803],[7.67661,48.21555],[7.59605,48.11698],[7.59165,48.10648],[7.58522,48.04694],[7.59127,48.03035],[7.62437,47.99865],[7.63205,47.97081],[7.57554,47.87436],[7.5728,47.86435],[7.57267,47.83631],[7.54581,47.78793],[7.54418,47.77232],[7.55758,47.72899],[7.53526,47.6989],[7.53136,47.68564],[7.537,47.67302],[7.60016,47.60822],[7.58967,47.56755],[7.55424,47.55128],[7.54511,47.54283],[7.51256,47.48439],[7.38747,47.42111],[7.32653,47.4273],[7.24435,47.40939],[7.16708,47.4335],[7.15212,47.47612],[7.14279,47.48707],[7.12853,47.48893],[7.0801,47.47718],[7.03557,47.48695],[7.02102,47.48458],[7.01205,47.47287],[7.003,47.44095],[6.9551,47.40808],[6.94716,47.39698],[6.94818,47.38337],[6.95769,47.37359],[6.97126,47.37218],[7.018,47.38386],[7.05623,47.37035],[7.07007,47.35005],[7.05958,47.32257],[6.97424,47.27856],[6.96347,47.26233],[6.96134,47.23479],[6.89443,47.19393],[6.88913,47.18922],[6.85545,47.14636],[6.76907,47.10751],[6.76011,47.09953],[6.72561,47.0418],[6.62355,46.9811],[6.4812,46.9445],[6.46892,46.93522],[6.46686,46.91997],[6.47548,46.88771],[6.4535,46.8239],[6.45644,46.80534],[6.46722,46.79104],[6.46098,46.76887],[6.15817,46.59343],[6.14872,46.58069],[6.15152,46.56508],[6.16549,46.54399],[6.15811,46.52456],[6.10174,46.46979],[6.09572,46.45418],[6.09704,46.43317],[6.10829,46.41643],[6.16622,46.38839],[6.17817,46.36922],[6.13748,46.31297],[6.13371,46.30227],[6.13038,46.23737],[6.1103,46.22344],[6.08865,46.23081],[6.07717,46.23123],[6.01857,46.21601],[6.00681,46.20752],[6.00388,46.19332],[6.00787,46.16977],[6.01783,46.15564],[6.03509,46.15456],[6.05564,46.16288],[6.12468,46.15415],[6.13778,46.15702],[6.24026,46.22094],[6.24906,46.23299],[6.24707,46.24777],[6.21148,46.31057],[6.21219,46.32485],[6.23946,46.36705],[6.31648,46.41557],[6.41083,46.42495],[6.41748,46.42682],[6.50498,46.46871],[6.63047,46.47435],[6.74665,46.45695],[6.82244,46.42925],[6.81832,46.38181],[6.80484,46.36179],[6.80189,46.34639],[6.81095,46.33359],[6.86491,46.30038],[6.87504,46.28007],[6.86092,46.2439],[6.82698,46.21188],[6.82075,46.19862],[6.81863,46.16592],[6.82259,46.15261],[6.83427,46.14509],[6.90382,46.12971],[6.90491,46.09595],[6.90932,46.08406],[6.92001,46.07721],[6.94898,46.0699],[7.01556,46.00883],[7.05191,45.93066],[7.04533,45.92217],[7.04497,45.92064],[7.04394,45.92036],[6.99582,45.85822],[6.94097,45.83551],[6.84376,45.82387],[6.83102,45.81711],[6.82614,45.80353],[6.82787,45.73217],[6.83174,45.72082],[6.8414,45.71373],[6.90729,45.69124],[6.92419,45.66935],[6.94247,45.66172],[6.97131,45.66528],[7.00597,45.64945],[7.01151,45.63652],[6.9978,45.60877],[6.99643,45.59465],[7.0158,45.52354],[7.02774,45.5102],[7.1072,45.47877],[7.1228,45.44924],[7.13304,45.44001],[7.1856,45.41894],[7.19515,45.40409],[7.17075,45.35069],[7.14232,45.32298],[7.13649,45.30576],[7.14458,45.25048],[7.08417,45.20279],[6.99279,45.19823],[6.98106,45.19368],[6.90009,45.12689],[6.85843,45.11699],[6.78283,45.14228],[6.77056,45.14242],[6.67751,45.11356],[6.6653,45.10289],[6.66501,45.08667],[6.68237,45.04558],[6.69602,45.03395],[6.75744,45.01884],[6.78375,44.9146],[6.7942,44.90161],[6.86698,44.86519],[6.8798,44.86346],[6.93633,44.87461],[7.01795,44.84402],[7.03453,44.82282],[7.03711,44.75009],[7.0496,44.73226],[7.07224,44.72311],[7.08651,44.6968],[7.08666,44.68085],[7.07671,44.67134],[6.99007,44.67203],[6.97413,44.66431],[6.97056,44.64696],[6.97819,44.61784],[6.94659,44.57124],[6.88235,44.53479],[6.87233,44.5195],[6.87892,44.50245],[6.95894,44.43129],[6.95872,44.42908],[6.92167,44.41436],[6.91223,44.40659],[6.90907,44.39477],[6.90972,44.38195],[6.91637,44.36804],[6.99909,44.29414],[7.01181,44.256],[7.01983,44.24558],[7.03259,44.2424],[7.07312,44.2461],[7.1651,44.22112],[7.24533,44.18544],[7.26053,44.16682],[7.27537,44.15947],[7.33878,44.1574],[7.36278,44.13834],[7.37776,44.13416],[7.56283,44.15792],[7.5642,44.15836],[7.56478,44.15817],[7.60548,44.1634],[7.6162,44.16827],[7.63989,44.18928],[7.68608,44.1861],[7.69422,44.17795],[7.68937,44.13869],[7.69445,44.12276],[7.72786,44.08615],[7.72403,44.05704],[7.68603,44.02371],[7.68077,44.0164],[7.66016,43.9672],[7.59624,43.94466],[7.58419,43.93287],[7.56858,43.89159],[7.5271,43.87434],[7.51649,43.86397],[7.51594,43.84915],[7.53622,43.79234],[9.8,43.1],[9.63227,41.43244],[9.36968,41.35052],[9.27311,41.29196],[8.94186,41.27688],[5.8,41.64],[3.17358,42.41768],[3.16081,42.42757],[3.0944,42.41457],[3.03402,42.45331],[3.02214,42.45645],[2.87822,42.4487],[2.87019,42.44653],[2.78424,42.40256],[2.7413,42.41128],[2.72928,42.40998],[2.69331,42.39417],[2.68378,42.3854],[2.68162,42.37263],[2.68585,42.34679],[2.66719,42.33008],[2.58106,42.34418],[2.56777,42.34173],[2.5338,42.32197],[2.47795,42.32986],[2.41933,42.37658],[2.41222,42.38021],[2.26719,42.42055],[2.25973,42.42117],[2.20694,42.41558],[2.20653,42.41526],[2.20526,42.41541],[2.16028,42.41065],[2.14881,42.40545],[2.09393,42.35474],[2.00861,42.33818],[1.965,42.36473],[1.93076,42.42442],[1.92089,42.43302],[1.88467,42.44761],[1.88459,42.44762],[1.88444,42.4477],[1.82774,42.47056],[1.72567,42.48452],[1.71561,42.50125],[1.7272,42.56103],[1.72479,42.57499],[1.71011,42.59992],[1.69377,42.60975],[1.60283,42.61382],[1.56069,42.6392],[1.54636,42.64166],[1.50444,42.6331],[1.4921,42.62502],[1.47238,42.59703],[1.43792,42.59264],[1.41936,42.60643],[1.38032,42.67415],[1.37335,42.68127],[1.33313,42.70563],[1.32364,42.7085],[1.23221,42.71248],[1.16554,42.69928],[1.08546,42.76635],[1.07564,42.77079],[0.95937,42.78852],[0.95073,42.78794],[0.92265,42.7797],[0.84606,42.8157],[0.71511,42.8464],[0.70017,42.84402],[0.69117,42.83186],[0.67409,42.76479],[0.67474,42.75286],[0.69192,42.70684],[0.669,42.67901],[0.43024,42.67863],[0.3715,42.70308],[0.35954,42.70415],[0.34912,42.69817],[0.32567,42.67274],[0.29571,42.66388],[0.24594,42.70175],[0.23972,42.70494],[0.18967,42.72039],[0.17919,42.72075],[-0.01993,42.67389],[-0.06726,42.6848],[-0.16949,42.77157],[-0.29987,42.82697],[-0.31683,42.82635],[-0.39208,42.78766],[-0.44354,42.78453],[-0.48842,42.80255],[-0.50868,42.79935],[-0.54499,42.76906],[-0.56721,42.76937],[-0.67446,42.86392],[-0.68094,42.86775],[-0.73372,42.88666],[-0.7476,42.93879],[-0.75711,42.95107],[-0.77253,42.95284],[-0.82114,42.93865],[-0.94508,42.94192],[-1.02313,42.98206],[-1.10852,43.00409],[-1.1156,43.00461],[-1.14775,43.00124],[-1.15845,43.01452],[-1.16736,43.02083],[-1.21622,43.0381],[-1.22612,43.03898],[-1.26236,43.03303],[-1.30643,43.05531],[-1.31992,43.05696],[-1.33135,43.0496],[-1.3542,43.0197],[-1.43868,43.03371],[-1.4775,43.06889],[-1.48311,43.08561],[-1.47641,43.10248],[-1.43479,43.13087],[-1.42732,43.1404],[-1.39411,43.22935],[-1.39531,43.24596],[-1.40868,43.25591],[-1.52629,43.28099],[-1.54626,43.2737],[-1.57149,43.2412],[-1.61053,43.24223],[-1.65,43.29323],[-1.66953,43.30065],[-1.73359,43.28856],[-1.75606,43.31966],[-1.76297,43.32565],[-1.79156,43.34067],[-1.80099,43.37017],[-1.78509,43.39037],[-1.7835,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:"Ruda_Slaska-aerial_image",name:"Ruda Śląska: Orthophotomap (aerial image)",type:"wms",template:"https://rudaslaska.geoportal2.pl/map/wmsorto/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[18.84294,50.32508],[18.84008,50.33091],[18.85132,50.33437],[18.86262,50.3305],[18.88693,50.333],[18.89493,50.3319],[18.90045,50.32562],[18.89713,50.31146],[18.89312,50.31149],[18.89114,50.30778],[18.8972,50.2999],[18.89073,50.29586],[18.90211,50.29204],[18.90706,50.28637],[18.90853,50.27823],[18.93583,50.27379],[18.94106,50.25859],[18.93848,50.25317],[18.95086,50.24267],[18.96531,50.24084],[18.94611,50.22907],[18.89932,50.22516],[18.90251,50.21749],[18.89075,50.21557],[18.89292,50.20913],[18.86474,50.20512],[18.85673,50.22078],[18.85258,50.22331],[18.84619,50.21761],[18.83341,50.21715],[18.83533,50.22307],[18.83051,50.23099],[18.82411,50.23055],[18.81641,50.23709],[18.81619,50.24125],[18.80635,50.24596],[18.80344,50.24293],[18.78831,50.24456],[18.79552,50.2768],[18.81681,50.27732],[18.81919,50.28794],[18.83893,50.29795],[18.83849,50.3004],[18.82699,50.30342],[18.82691,50.32073],[18.83007,50.32371],[18.84294,50.32508]]],terms_text:"Urząd Miasta Ruda Śląska"},{id:"Rzeszow-buildings",name:"Rzeszów: Buildings",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=komunikacja,budynki,adresy&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"Rzeszow-aerial_image",name:"Rzeszów: Orthophotomap (aerial image)",type:"wms",template:"http://wms.erzeszow.pl/?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=rastry&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[22.09538,50.08157],[22.0947,50.05584],[22.08892,50.05589],[22.08874,50.03671],[22.09505,50.03682],[22.09435,49.98723],[22.0609,49.98754],[22.0605,49.96525],[22.04757,49.96509],[22.04724,49.95792],[22.03139,49.95845],[22.0312,49.9574],[22.0014,49.95833],[22.00019,49.9375],[22.0014,49.93746],[22.00029,49.92047],[21.96799,49.92088],[21.969,49.93683],[21.95393,49.93706],[21.95441,49.94373],[21.94192,49.94378],[21.94253,49.96646],[21.93676,49.9665],[21.93776,49.97828],[21.92898,49.97858],[21.92951,49.98858],[21.91606,49.9888],[21.9165,50.01192],[21.90572,50.01195],[21.90653,50.04136],[21.87425,50.04183],[21.87546,50.06072],[21.90465,50.06083],[21.90672,50.0835],[22.09538,50.08157]]],terms_text:"Urząd Miasta Rzeszowa"},{id:"SanJuanMetroAreaUSACEOrthophotos",name:"San Juan Metro Area: 2013 USACE Orthophotos",type:"tms",template:"http://imagery-pr-usace-2013.s3-website-us-east-1.amazonaws.com/tiles/{zoom}/{x}/{y}.jpg",endDate:"2013-03-15T00:00:00.000Z",startDate:"2013-03-13T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-66.15007,18.35002],[-66.03337,18.35002],[-66.03328,18.45634],[-66.05464,18.45636],[-66.05463,18.46542],[-66.08303,18.46544],[-66.08302,18.47451],[-66.13034,18.47455],[-66.13034,18.4796],[-66.13983,18.47961],[-66.13984,18.46557],[-66.14995,18.46558],[-66.15007,18.35002]]]},{id:"santana_do_ipanema",name:"Santana do Ipanema AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.20224,-9.41356],[-37.20188,-9.37768],[-37.20208,-9.37455],[-37.20192,-9.36733],[-37.20169,-9.36045],[-37.20172,-9.35501],[-37.20195,-9.35101],[-37.20191,-9.34773],[-37.20175,-9.33835],[-37.2017,-9.33505],[-37.20171,-9.33301],[-37.20142,-9.32833],[-37.20121,-9.32469],[-37.20117,-9.32351],[-37.21425,-9.32346],[-37.21537,-9.3234],[-37.22078,-9.32328],[-37.23727,-9.32313],[-37.25181,-9.32293],[-37.2656,-9.32276],[-37.2803,-9.32259],[-37.29191,-9.32245],[-37.29205,-9.33522],[-37.29304,-9.4122],[-37.28357,-9.41235],[-37.27789,-9.4125],[-37.2716,-9.41249],[-37.26506,-9.41262],[-37.26165,-9.41274],[-37.25499,-9.41276],[-37.24991,-9.41296],[-37.24616,-9.41297],[-37.24108,-9.41303],[-37.23461,-9.41321],[-37.2284,-9.41325],[-37.22165,-9.41335],[-37.21686,-9.41346],[-37.21292,-9.41343],[-37.20224,-9.41356]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"Sao_miguel_dos_campos",name:"São Miguel dos Campos AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.1415,-9.83171],[-36.05047,-9.83246],[-36.04959,-9.74246],[-36.14059,-9.74166],[-36.1415,-9.83171]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"GEOSN-DOP-2005",name:"Saxony historical aerial imagery 2005",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-2005/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2005&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",endDate:"2005-01-01T00:00:00.000Z",startDate:"2005-01-01T00:00:00.000Z",polygon:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=3f38c3f3-03db-4a2a-b6da-2704b9a1d5f0",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-2012_2014",name:"Saxony historical aerial imagery 2012-2014",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop_2012_2014/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=dop_2012_2014_rgb&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:[[[13.86571,50.71509],[13.86683,50.73012],[13.90116,50.73012],[13.90184,50.74446],[13.91043,50.74446],[13.91043,50.77378],[13.95266,50.77486],[13.95197,50.78897],[13.99969,50.78941],[13.999,50.79831],[14.16715,50.79762],[14.1747,50.8462],[14.32851,50.84534],[14.33503,50.87643],[14.41674,50.876],[14.41674,50.95025],[14.33263,50.95133],[14.3364,50.99802],[14.58188,50.99608],[14.57742,50.94895],[14.54068,50.95003],[14.54446,50.89831],[14.60557,50.89116],[14.60454,50.83439],[14.6605,50.83352],[14.65673,50.79578],[14.83422,50.79469],[14.84727,50.89138],[14.9204,50.88943],[14.9331,50.99478],[14.99902,50.99673],[15.00142,51.09709],[15.04159,51.09709],[15.04228,51.35317],[14.99696,51.35317],[15.00314,51.49959],[14.91593,51.50301],[14.91662,51.55043],[14.74908,51.55129],[14.75114,51.60121],[14.41056,51.59993],[14.41125,51.55129],[14.07891,51.54915],[14.07479,51.49831],[13.99446,51.50002],[13.99446,51.39817],[13.53921,51.39989],[13.53852,51.42516],[13.50041,51.42505],[13.50179,51.44945],[13.41596,51.45094],[13.41699,51.50013],[13.3315,51.50055],[13.33047,51.44966],[13.24945,51.44987],[13.25116,51.60036],[13.16773,51.60057],[13.16739,51.65023],[13.08328,51.65066],[13.08362,51.69941],[12.66202,51.70027],[12.66065,51.64832],[12.4162,51.65045],[12.41345,51.60057],[12.16146,51.60015],[12.16146,51.50109],[12.07631,51.50023],[12.07974,51.39625],[12.16008,51.39753],[12.16214,51.34995],[12.07906,51.35253],[12.07906,51.24562],[12.16214,51.24691],[12.16352,51.0958],[12.24317,51.09709],[12.2454,51.04813],[12.49688,51.04883],[12.49894,50.89966],[12.33346,50.89923],[12.32797,50.84984],[12.20712,50.8494],[12.20506,50.69829],[12.24694,50.69744],[12.24694,50.65023],[11.91529,50.64849],[11.91598,50.59839],[11.83221,50.59817],[11.83255,50.39922],[11.91495,50.39922],[11.91461,50.34886],[11.99486,50.34659],[11.99838,50.29897],[12.16506,50.29912],[12.16549,50.24904],[12.23673,50.24871],[12.24823,50.24212],[12.24772,50.14904],[12.33149,50.14893],[12.33852,50.19335],[12.33286,50.23927],[12.3538,50.23619],[12.35998,50.24926],[12.41457,50.24948],[12.41594,50.29906],[12.49851,50.29874],[12.49834,50.34948],[12.58142,50.34915],[12.58125,50.39896],[12.69489,50.39962],[12.70622,50.39426],[12.71257,50.39875],[13.0813,50.39907],[13.0813,50.4992],[13.24816,50.49898],[13.24884,50.54809],[13.33124,50.54918],[13.33056,50.59911],[13.50908,50.59759],[13.50462,50.62656],[13.5393,50.62635],[13.53827,50.65481],[13.54633,50.65547],[13.54599,50.66983],[13.5544,50.67027],[13.55457,50.68908],[13.54736,50.68887],[13.54582,50.69969],[13.63886,50.69947],[13.63955,50.71425],[13.86571,50.71509]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=8c276e3c-88af-462f-8128-6900bc7dd4f8",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{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.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],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:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DOP-CIR",name:"Saxony latest aerial imagery infrared",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dop-cir/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dop_020_cir&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=ba87bbed-4cb5-4539-a9f5-f863de752f52",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-DTK",name:"Saxony topographic map",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_dtk-pg-color/guest?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=sn_dtk_pg_color&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=d6d24c6d-94ea-447d-8a0c-40afdedeb5c6",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{id:"GEOSN-WebAtlas",name:"Saxony WebAtlasSN",type:"wms",template:"https://geodienste.sachsen.de/wms_geosn_webatlas-sn/guest?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Vegetation,Siedlung,Gewaesser,Verkehr,Administrative_Einheiten,Beschriftung&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[13.54901,50.69792],[13.84251,50.71126],[13.93239,50.74504],[14.04614,50.79389],[14.25257,50.85953],[14.40002,50.88966],[14.42671,50.9357],[14.35649,50.97197],[14.32559,50.99319],[14.27504,50.99054],[14.31577,51.04266],[14.41547,51.01263],[14.51939,51.0038],[14.5882,50.9817],[14.54467,50.91977],[14.57977,50.90649],[14.64718,50.92243],[14.64437,50.90915],[14.60505,50.85687],[14.7202,50.81785],[14.81008,50.81341],[14.85642,50.89055],[14.91259,50.94721],[14.99685,51.08679],[15.05303,51.24793],[15.05583,51.29274],[14.99264,51.34452],[14.98843,51.398],[14.97719,51.45754],[14.90979,51.49603],[14.73986,51.5371],[14.73986,51.59122],[14.70054,51.60605],[14.67948,51.5982],[14.68369,51.57813],[14.67386,51.55806],[14.61769,51.55718],[14.58399,51.59035],[14.51939,51.56941],[14.43513,51.5598],[14.327,51.52574],[14.13461,51.55544],[14.0672,51.49952],[14.02788,51.47854],[14.04333,51.45229],[13.99558,51.39274],[13.95767,51.40588],[13.88886,51.38836],[13.72455,51.37434],[13.55463,51.39274],[13.40437,51.45929],[13.35241,51.43916],[13.3159,51.44354],[13.28641,51.41815],[13.22602,51.40063],[13.21339,51.46104],[13.219,51.52661],[13.17406,51.5982],[13.00274,51.67751],[12.90584,51.65312],[12.90303,51.66619],[12.85388,51.69318],[12.76401,51.65922],[12.68817,51.67054],[12.64324,51.62959],[12.57723,51.63046],[12.42557,51.61041],[12.23037,51.57028],[12.17701,51.53011],[12.13909,51.46017],[12.16718,51.41727],[12.1742,51.33487],[12.13207,51.3182],[12.18684,51.21364],[12.15875,51.18812],[12.22054,51.09296],[12.49017,51.05414],[12.52106,50.99319],[12.60532,50.97286],[12.62639,50.91889],[12.50281,50.91092],[12.23739,50.81874],[12.21352,50.72993],[12.28654,50.665],[12.21773,50.6463],[12.13347,50.6276],[12.05343,50.56342],[12.01972,50.64719],[11.85963,50.54825],[11.87649,50.50808],[11.92704,50.5054],[11.93687,50.48664],[11.87087,50.44194],[11.93406,50.39989],[11.96917,50.33987],[12.12083,50.29773],[12.17279,50.3067],[12.18543,50.26094],[12.21212,50.25375],[12.25705,50.21603],[12.28233,50.15668],[12.35535,50.15848],[12.35535,50.22142],[12.41433,50.28158],[12.51123,50.34705],[12.53791,50.38735],[12.67835,50.40257],[12.71205,50.38646],[12.7289,50.39631],[12.75699,50.42584],[12.78648,50.43389],[12.81737,50.41779],[12.84686,50.43657],[12.94797,50.38735],[13.00976,50.41421],[13.04627,50.44999],[13.0561,50.48753],[13.21479,50.49289],[13.27517,50.56609],[13.34118,50.56877],[13.39173,50.61334],[13.47739,50.58571],[13.54761,50.63473],[13.56867,50.67212],[13.54901,50.69792]]],terms_url:"https://geoportal.sachsen.de/cps/metadaten_portal.html?id=475a9197-620f-4dcb-b8aa-7f71b626443f",terms_text:"Staatsbetrieb Geobasisinformation und Vermessung Sachsen",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/de/SaxonyWebAtlasSN.png"},{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",zoomExtent:[0,21],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_url:"https://download.kortforsyningen.dk/content/vilkaar-og-betingelser",terms_text:"Geodatastyrelsen og Danske Kommuner",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Cadastral_Parcels_INSPIRE_View",name:"SDFE Cadastral Parcels INSPIRE View",type:"wms",template:"https://kortforsyningen.kms.dk/cp_inspire?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=CP.CadastralParcel&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_DTK_Kort25",name:"SDFE DTK Kort25",type:"wms",template:"https://kortforsyningen.kms.dk/topo25?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=topo25_klassisk&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"Geodatastyrelsen_Skaermkort",name:"SDFE Skærmkort",type:"wms",template:"https://kortforsyningen.kms.dk/topo_skaermkort?FORMAT=image/png&VERSION=1.1.1&login=OpenStreetMapDK2015&password=Gall4Peters&SERVICE=WMS&REQUEST=GetMap&Layers=dtk_skaermkort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,19],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Overflade_Skyggekort_40cm",name:"SDFE Surface Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_overflade_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{id:"SDFE_Terraen_Skyggekort_40cm",name:"SDFE Terrain Shadow Map (40 cm)",type:"wms",template:"https://kortforsyningen.kms.dk/dhm?login=OpenStreetMapDK2015&password=Gall4Peters&FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&Layers=dhm_terraen_skyggekort&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,20],polygon:[[[8.37439,54.95517],[8.36838,55.40421],[8.2104,55.40398],[8.20873,55.49373],[8.05027,55.49247],[8.01851,56.75014],[8.18192,56.75099],[8.17633,57.02089],[8.34133,57.02199],[8.33925,57.11196],[8.50544,57.11232],[8.50339,57.20205],[9.33163,57.20276],[9.33191,57.29248],[9.49789,57.29196],[9.49886,57.38206],[9.66497,57.38116],[9.66873,57.56056],[9.8352,57.55963],[9.83749,57.64933],[10.17257,57.64628],[10.17542,57.73678],[10.51183,57.73303],[10.51521,57.82289],[10.68349,57.82077],[10.67516,57.6412],[10.5077,57.64331],[10.504,57.55351],[10.67104,57.55141],[10.65078,57.10245],[10.48577,57.10451],[10.47862,56.92491],[10.3144,56.92676],[10.31123,56.83693],[10.47503,56.83509],[10.4649,56.56567],[10.95242,56.55898],[10.94792,56.46922],[11.10993,56.46647],[11.10526,56.37683],[10.94299,56.37953],[10.93412,56.19948],[10.77197,56.20202],[10.76948,56.11201],[10.60797,56.11503],[10.44667,56.11672],[10.28659,56.11868],[10.28315,56.02819],[10.44393,56.02704],[10.44177,55.75792],[10.4335,55.66935],[10.74381,55.66469],[10.74381,55.57123],[10.8969,55.57123],[10.90518,55.39539],[11.06137,55.38128],[11.0593,55.11241],[11.04586,55.03186],[11.20308,55.02475],[11.20308,55.11714],[11.0593,55.11241],[11.06137,55.38128],[11.07896,55.57123],[10.8969,55.57123],[10.92587,55.66702],[10.74381,55.66469],[10.75623,55.75792],[10.44177,55.75792],[10.44393,56.02704],[10.44667,56.11672],[10.60797,56.11503],[10.60521,56.02475],[10.92587,56.02012],[10.91971,55.93094],[11.08028,55.92792],[11.08581,56.01783],[11.7265,56.00506],[11.732,56.09521],[12.05403,56.08713],[12.06085,56.17626],[12.70235,56.15944],[12.66111,55.71143],[12.97923,55.7014],[12.96129,55.52173],[12.32687,55.54121],[12.32061,55.45137],[12.47782,55.44707],[12.47024,55.35705],[12.62697,55.35238],[12.62009,55.26326],[12.46273,55.26722],[12.45529,55.17782],[12.2987,55.18223],[12.28973,55.09236],[12.60486,55.08329],[12.5872,54.90363],[12.27666,54.9119],[12.26102,54.73316],[12.10707,54.73782],[12.08586,54.46817],[11.7795,54.47536],[11.78374,54.56548],[11.16585,54.57822],[11.17064,54.66865],[10.86172,54.6734],[10.86512,54.76347],[10.77136,54.76439],[10.77073,54.73728],[10.75514,54.73758],[10.7544,54.71957],[10.73891,54.71976],[10.73844,54.71085],[10.70745,54.7113],[10.70411,54.67567],[10.5511,54.67817],[10.55472,54.76702],[10.2424,54.77059],[10.24598,54.86047],[10.09023,54.86221],[10.08737,54.77239],[9.15558,54.77696],[9.15628,54.86754],[8.5322,54.86638],[8.53143,54.95516],[8.37439,54.95517]],[[11.45777,56.81955],[11.78492,56.81274],[11.77167,56.63328],[11.44596,56.64011],[11.45777,56.81955]],[[11.32747,57.3613],[11.31618,57.1818],[11.15087,57.18473],[11.14566,57.09496],[10.81577,57.10017],[10.82906,57.36953],[11.32747,57.3613]],[[11.58433,56.27779],[11.57829,56.18804],[11.73923,56.18458],[11.74564,56.27432],[11.58433,56.27779]],[[14.68259,55.36394],[14.83952,55.35652],[14.82638,55.26713],[15.13934,55.25174],[15.1532,55.34108],[15.30992,55.33306],[15.29572,55.24374],[15.13934,55.25174],[15.12556,55.16238],[15.28158,55.15442],[15.25356,54.97576],[14.63175,55.00625],[14.68259,55.36394]]],terms_text:"Geodatastyrelsen og Danske Kommuner",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/dk/SDFESkrmkort.png"},{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.71165,38.25894],[15.23718,38.81938],[14.27124,38.55246],[13.15063,38.75408],[11.96411,37.97451],[12.52441,37.54022],[11.87897,36.79609],[12.49695,35.47409],[12.68921,35.46962],[14.57336,36.66401],[15.29709,36.62875],[15.39854,37.42171],[15.71165,38.25894]]]},{id:"Siemianowice_Slaskie-buildings",name:"Siemianowice Śląskie: Buildings",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/png&transparent=true&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=budynki,drogi,adresy,ulice&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,19],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"Siemianowice_Slaskie-aerial_image",name:"Siemianowice Śląskie: Orthophotomap (aerial image)",type:"wms",template:"https://siemianowice.geoportal2.pl/map/wms/wms.php?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortofotomapa&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:4326",zoomExtent:[0,23],polygon:[[[19.03103,50.33933],[19.0316,50.35413],[19.0656,50.35373],[19.06529,50.34219],[19.06118,50.33749],[19.06069,50.31967],[19.05603,50.31975],[19.05562,50.30155],[19.06432,50.3015],[19.06366,50.27175],[19.04379,50.27179],[19.04375,50.27478],[19.0213,50.27505],[19.02156,50.28398],[19.01027,50.28856],[18.98791,50.28871],[18.98822,50.3022],[18.98143,50.30226],[18.98213,50.33977],[19.03103,50.33933]]],terms_text:"Urząd Miasta Siemianowice Śląskie"},{id:"sc2012",name:"SIG Santa Catarina OrtoRGB 2012",type:"wms",template:"http://sigsc.sc.gov.br/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.62488,-26.91624],[-48.62416,-26.83409],[-48.56163,-26.83412],[-48.56165,-26.74919],[-48.62675,-26.74918],[-48.62715,-26.73276],[-48.64126,-26.733],[-48.64174,-26.70912],[-48.62414,-26.70913],[-48.62418,-26.50079],[-48.57099,-26.50077],[-48.57155,-26.47415],[-48.55418,-26.47381],[-48.5545,-26.45736],[-48.56155,-26.45747],[-48.56161,-26.41746],[-48.4991,-26.41747],[-48.49909,-26.25081],[-48.43664,-26.25079],[-48.43661,-26.20752],[-48.4601,-26.20751],[-48.46195,-26.1242],[-48.56161,-26.12419],[-48.56163,-25.95753],[-48.62411,-25.95753],[-48.62411,-25.94507],[-48.68838,-25.94607],[-48.6884,-25.95752],[-49.25089,-25.95752],[-49.2509,-25.9992],[-49.31339,-25.9992],[-49.31338,-26.0825],[-49.37591,-26.0825],[-49.37591,-26.12419],[-49.50093,-26.12418],[-49.50092,-26.16586],[-49.68661,-26.16585],[-49.68661,-26.12417],[-49.74907,-26.08246],[-49.74908,-26.04084],[-49.8116,-26.04085],[-49.81159,-25.99918],[-49.93657,-25.99915],[-49.93661,-25.98244],[-50.00091,-25.98288],[-50.00094,-25.99915],[-50.31338,-25.99916],[-50.31342,-26.04083],[-50.37411,-26.04084],[-50.3741,-25.9992],[-50.49914,-25.99918],[-50.49911,-25.98414],[-50.62593,-25.98452],[-50.62595,-26.04084],[-50.6884,-26.04161],[-50.68845,-26.12416],[-50.75094,-26.12414],[-50.75095,-26.20752],[-51.12595,-26.20747],[-51.12595,-26.24913],[-51.18848,-26.24918],[-51.31344,-26.33245],[-51.31347,-26.62414],[-51.4366,-26.62415],[-51.43659,-26.56476],[-51.62409,-26.5641],[-51.62411,-26.5408],[-51.99907,-26.5408],[-52.06158,-26.49911],[-52.06158,-26.45747],[-52.12408,-26.45749],[-52.12406,-26.41579],[-52.37407,-26.4158],[-52.37409,-26.39133],[-52.56156,-26.3894],[-52.56158,-26.37415],[-52.62408,-26.37417],[-52.62409,-26.33247],[-53.12408,-26.33247],[-53.1241,-26.31707],[-53.1618,-26.3165],[-53.16136,-26.29082],[-53.18656,-26.29083],[-53.24907,-26.24911],[-53.24906,-26.23919],[-53.31159,-26.23824],[-53.3741,-26.22882],[-53.43845,-26.22777],[-53.43843,-26.24914],[-53.5616,-26.24916],[-53.56159,-26.23983],[-53.65501,-26.23814],[-53.65623,-26.29263],[-53.67011,-26.31684],[-53.68846,-26.33242],[-53.70322,-26.3741],[-53.70929,-26.38449],[-53.7098,-26.39568],[-53.70619,-26.40722],[-53.70721,-26.45927],[-53.71438,-26.46168],[-53.71476,-26.48118],[-53.73047,-26.49913],[-53.73146,-26.54081],[-53.75096,-26.5408],[-53.75095,-26.62417],[-53.7602,-26.62414],[-53.76125,-26.6675],[-53.75098,-26.66751],[-53.75096,-26.74298],[-53.72737,-26.7434],[-53.72133,-26.74905],[-53.72141,-26.75093],[-53.74571,-26.75943],[-53.74612,-26.77704],[-53.71948,-26.77755],[-53.72084,-26.83416],[-53.70047,-26.83414],[-53.70277,-26.93108],[-53.71168,-26.93091],[-53.71224,-26.95557],[-53.751,-26.95479],[-53.75092,-26.99915],[-53.76467,-26.99915],[-53.8037,-27.03751],[-53.80454,-27.07258],[-53.80809,-27.07249],[-53.80862,-27.09613],[-53.8269,-27.09577],[-53.82762,-27.12414],[-53.84644,-27.12413],[-53.84765,-27.17014],[-53.83506,-27.18932],[-53.83536,-27.20054],[-53.68847,-27.20284],[-53.68849,-27.22789],[-53.43654,-27.23246],[-53.43655,-27.16751],[-53.37598,-27.16751],[-53.37601,-27.23352],[-53.24905,-27.23564],[-53.24905,-27.20922],[-53.06344,-27.20918],[-53.06345,-27.2334],[-52.81348,-27.23685],[-52.81346,-27.27653],[-52.75096,-27.27732],[-52.75096,-27.29249],[-52.4385,-27.29252],[-52.43848,-27.32689],[-52.37603,-27.32753],[-52.37599,-27.3342],[-52.25098,-27.33418],[-52.25099,-27.34669],[-52.18655,-27.34728],[-52.18657,-27.33419],[-52.12598,-27.3342],[-52.12599,-27.36413],[-52.02979,-27.36489],[-52.03036,-27.42442],[-51.97534,-27.42479],[-51.97603,-27.50088],[-51.93845,-27.50085],[-51.93845,-27.54252],[-51.68846,-27.54247],[-51.68847,-27.55742],[-51.59903,-27.5579],[-51.59923,-27.59481],[-51.56351,-27.59498],[-51.56348,-27.62586],[-51.50088,-27.62586],[-51.50095,-27.66754],[-51.43937,-27.6675],[-51.43954,-27.70932],[-51.37597,-27.7095],[-51.37601,-27.75089],[-51.31349,-27.7509],[-51.31346,-27.79253],[-51.18847,-27.79251],[-51.18848,-27.87586],[-51.12598,-27.87586],[-51.12597,-27.91752],[-51.06348,-27.9175],[-51.06347,-27.95919],[-51.00095,-28.00086],[-50.9385,-28.00086],[-50.93849,-28.16755],[-50.81346,-28.16752],[-50.81345,-28.29253],[-50.75096,-28.29251],[-50.68845,-28.33418],[-50.68849,-28.41754],[-50.626,-28.41752],[-50.56352,-28.44094],[-50.43848,-28.44051],[-50.43847,-28.45917],[-50.37597,-28.45921],[-50.37598,-28.47554],[-50.18844,-28.47454],[-50.18849,-28.51143],[-50.12398,-28.51104],[-50.12402,-28.50086],[-49.87597,-28.50085],[-49.87601,-28.5142],[-49.81347,-28.51369],[-49.81347,-28.58255],[-49.83003,-28.58251],[-49.82951,-28.62597],[-49.8759,-28.66572],[-50.001,-28.74915],[-50.001,-29.04083],[-50.03319,-29.04081],[-50.03219,-29.14711],[-50.12602,-29.14774],[-50.12598,-29.16579],[-50.13613,-29.16581],[-50.1885,-29.19623],[-50.1885,-29.31905],[-50.1422,-29.31873],[-50.14208,-29.33422],[-50.126,-29.33418],[-50.12599,-29.36238],[-49.99906,-29.36153],[-49.99904,-29.24031],[-49.93848,-29.23986],[-49.93851,-29.25087],[-49.87601,-29.25087],[-49.876,-29.30098],[-49.82262,-29.30052],[-49.82227,-29.33419],[-49.81347,-29.33422],[-49.81354,-29.3411],[-49.68654,-29.33991],[-49.68651,-29.29255],[-49.62399,-29.29252],[-49.62398,-29.25085],[-49.56149,-29.25083],[-49.56145,-29.16749],[-49.49901,-29.16746],[-49.49902,-29.08419],[-49.4365,-29.08418],[-49.43651,-29.04251],[-49.37405,-29.04248],[-49.37402,-28.9592],[-49.31153,-28.95917],[-49.31152,-28.91749],[-49.24898,-28.9175],[-49.24897,-28.87582],[-49.18655,-28.87585],[-49.18653,-28.83414],[-49.12402,-28.83418],[-49.12401,-28.7925],[-49.06149,-28.79247],[-49.06146,-28.75084],[-48.99903,-28.75085],[-48.99903,-28.70919],[-48.93658,-28.70918],[-48.93658,-28.66752],[-48.87405,-28.66751],[-48.87404,-28.62585],[-48.74912,-28.62585],[-48.74912,-28.54254],[-48.68656,-28.54253],[-48.68658,-28.33417],[-48.62408,-28.33416],[-48.62406,-28.08418],[-48.5616,-28.08418],[-48.56159,-27.95919],[-48.49905,-27.95916],[-48.49904,-27.91581],[-48.56157,-27.9158],[-48.5616,-27.87584],[-48.49902,-27.87586],[-48.49902,-27.83422],[-48.43657,-27.83418],[-48.43661,-27.62583],[-48.37406,-27.62585],[-48.37405,-27.50086],[-48.31157,-27.50086],[-48.31153,-27.24913],[-48.43657,-27.24913],[-48.43654,-27.20916],[-48.37402,-27.2092],[-48.37405,-27.1658],[-48.43656,-27.1658],[-48.43656,-27.12415],[-48.49906,-27.12413],[-48.49907,-27.08667],[-48.50022,-27.08666],[-48.50031,-27.08247],[-48.5616,-27.08248],[-48.56159,-27.04252],[-48.49906,-27.04252],[-48.49906,-26.99913],[-48.56156,-26.99913],[-48.56157,-26.91579],[-48.62488,-26.91624]]],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",zoomExtent:[14,20],polygon:[[[6.71057,46.54396],[6.72968,46.54408],[6.72995,46.52605],[6.71085,46.52596],[6.71113,46.50796],[6.6922,46.50788],[6.6923,46.49883],[6.63531,46.49847],[6.63488,46.52547],[6.65381,46.52558],[6.65361,46.54358],[6.69163,46.54384],[6.69155,46.55284],[6.71047,46.55293],[6.71057,46.54396]]],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",zoomExtent:[0,12],polygon:[[[16.81969,47.49272],[16.81969,49.50303],[22.83883,49.50303],[22.83883,47.49272],[16.81969,47.49272]]],icon:"https://raw.githubusercontent.com/FreemapSlovakia/freemap-v3-react/master/src/images/freemap-logo-small.png"},{id:"skoterleder",name:"Snowmobile map Sweden",type:"tms",template:"https://tiles.skoterleder.org/tiles/{zoom}/{x}/{y}.png",zoomExtent:[5,14],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[23.87328,65.21069],[30.14647,65.19226],[30.19042,67.62596],[29.43236,69.62651],[27.93822,70.14037],[20.73119,69.2756],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],terms_url:"https://skoterleder.org/",terms_text:"© Skoterleder.org",description:"Snowmobile trails",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/8/8f/Sweden_road_sign_D9.svg/200px-Sweden_road_sign_D9.svg.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",zoomExtent:[11,20],polygon:[[[18.79273,47.37079],[18.79194,47.37048],[18.79139,47.37063],[18.79011,47.37176],[18.78916,47.37345],[18.78722,47.37566],[18.78603,47.37765],[18.78498,47.37905],[18.7837,47.38032],[18.78267,47.38195],[18.7814,47.38368],[18.77934,47.38713],[18.77666,47.3894],[18.76472,47.3967],[18.7617,47.39966],[18.75631,47.40328],[18.75837,47.40653],[18.7588,47.40776],[18.762,47.41217],[18.76304,47.41315],[18.76593,47.41471],[18.77041,47.41766],[18.77247,47.41809],[18.77248,47.4203],[18.8086,47.44041],[18.81742,47.43539],[18.82092,47.43572],[18.82804,47.43755],[18.83021,47.43526],[18.83585,47.43754],[18.84049,47.43346],[18.84765,47.43572],[18.851,47.43281],[18.869,47.43961],[18.87361,47.43597],[18.87499,47.43342],[18.87386,47.43248],[18.87604,47.42797],[18.8605,47.423],[18.86621,47.41798],[18.87243,47.41086],[18.8663,47.40773],[18.86964,47.40471],[18.86777,47.40207],[18.86509,47.40052],[18.87081,47.39838],[18.86772,47.39699],[18.86992,47.39655],[18.87649,47.39478],[18.87749,47.39495],[18.87867,47.39462],[18.88358,47.38996],[18.88291,47.38967],[18.88539,47.3853],[18.87748,47.38339],[18.88181,47.37605],[18.87914,47.37393],[18.88638,47.36923],[18.88206,47.36773],[18.87973,47.36641],[18.8747,47.36252],[18.87282,47.36137],[18.87028,47.36063],[18.86688,47.35853],[18.86234,47.35637],[18.85567,47.35199],[18.84874,47.34728],[18.83192,47.33841],[18.82497,47.34258],[18.8162,47.34925],[18.81079,47.35357],[18.80823,47.356],[18.80645,47.35854],[18.80708,47.35902],[18.80635,47.36021],[18.80465,47.36175],[18.80381,47.36335],[18.80055,47.36545],[18.79988,47.36617],[18.79416,47.36975],[18.79273,47.37079]],[[18.91871,47.40938],[18.91826,47.40998],[18.92067,47.41156],[18.9251,47.41372],[18.93473,47.41917],[18.94063,47.42241],[18.94982,47.41938],[18.95155,47.4175],[18.9569,47.41923],[18.9577,47.41878],[18.95755,47.41435],[18.96211,47.40507],[18.96266,47.40118],[18.96316,47.39903],[18.95446,47.39673],[18.95276,47.39526],[18.95202,47.39362],[18.95119,47.39356],[18.94692,47.39799],[18.94411,47.39845],[18.94161,47.39869],[18.93735,47.39633],[18.93617,47.39683],[18.93122,47.4],[18.9312,47.40023],[18.92924,47.40205],[18.92561,47.40605],[18.92466,47.40635],[18.92293,47.40926],[18.91871,47.40938]]],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",zoomExtent:[1,22],polygon:[[[17.83968,-32.79834],[17.88935,-32.69728],[18.00364,-32.69822],[18.09917,-32.74853],[18.28987,-32.55266],[18.29302,-32.04871],[18.10545,-31.6455],[17.85293,-31.3444],[17.548,-30.90217],[17.40445,-30.63747],[17.24937,-30.39917],[16.9937,-29.65436],[16.7988,-29.19437],[16.54941,-28.84159],[16.44987,-28.69188],[16.4491,-28.55158],[16.60026,-28.48257],[16.75141,-28.4487],[16.74622,-28.2459],[16.88551,-28.04729],[16.99295,-28.0244],[17.05297,-28.02571],[17.10076,-28.03388],[17.20115,-28.09305],[17.20263,-28.23284],[17.24746,-28.23382],[17.2508,-28.19889],[17.35119,-28.19759],[17.35156,-28.24427],[17.40158,-28.24524],[17.41491,-28.34898],[17.40083,-28.548],[17.4527,-28.54897],[17.45121,-28.64951],[17.49836,-28.68721],[17.60282,-28.683],[17.64997,-28.69679],[17.65259,-28.73815],[17.80139,-28.73815],[17.99943,-28.75606],[18.00027,-28.79562],[18.15745,-28.87181],[18.50638,-28.87181],[18.61536,-28.82959],[18.90875,-28.82775],[19.1047,-28.94885],[19.19691,-28.93785],[19.24301,-28.85162],[19.23149,-28.80296],[19.25873,-28.70099],[19.44315,-28.69732],[19.55003,-28.49583],[19.69673,-28.49399],[19.69882,-28.44794],[19.85076,-28.44333],[19.84971,-28.40278],[19.99536,-28.39909],[19.98937,-24.74979],[20.29167,-24.91923],[20.47246,-25.15017],[20.65324,-25.45294],[20.73326,-25.6802],[20.8281,-25.89635],[20.84292,-26.21585],[20.65028,-26.48409],[20.65324,-26.82049],[21.08891,-26.84693],[21.67277,-26.839],[21.7765,-26.66963],[21.97211,-26.64314],[22.28034,-26.32747],[22.57078,-26.1334],[22.77528,-25.67752],[23.00052,-25.27619],[23.46583,-25.27351],[23.88372,-25.59737],[24.2364,-25.6134],[24.60391,-25.78966],[25.1107,-25.73894],[25.50784,-25.68554],[25.64418,-25.48238],[25.84193,-24.78054],[25.84664,-24.75385],[26.39285,-24.63329],[26.47391,-24.56533],[26.509,-24.48424],[26.58619,-24.40758],[26.73006,-24.30145],[26.85674,-24.24995],[26.85744,-24.10269],[26.92155,-23.8991],[26.93183,-23.84619],[26.97148,-23.69943],[27.00061,-23.63676],[27.0578,-23.60526],[27.13605,-23.52034],[27.33396,-23.39738],[27.51441,-23.35939],[27.59581,-23.20855],[27.80986,-23.0995],[27.88285,-23.06205],[27.93829,-22.94965],[28.04076,-22.82551],[28.20568,-22.65529],[28.33972,-22.56394],[28.49061,-22.5607],[28.61088,-22.54002],[28.82818,-22.45502],[28.92853,-22.42323],[28.95941,-22.30901],[29.01626,-22.20834],[29.23241,-22.16935],[29.35312,-22.18429],[29.6549,-22.11864],[29.77771,-22.1362],[29.9293,-22.18494],[30.11668,-22.28303],[30.25634,-22.29148],[30.30336,-22.33952],[30.50618,-22.30576],[30.83743,-22.28498],[31.00586,-22.30771],[31.18342,-22.32329],[31.29306,-22.36746],[31.56806,-23.19034],[31.55683,-23.44308],[31.69311,-23.61752],[31.71197,-23.74114],[31.77747,-23.88006],[31.88863,-23.94811],[31.91444,-24.17467],[31.99483,-24.30409],[32.01667,-24.4406],[32.00773,-24.65366],[32.01964,-24.91407],[32.03552,-25.08498],[32.01964,-25.38214],[31.99285,-25.44938],[31.99979,-25.51657],[32.00575,-25.6079],[32.00575,-25.66248],[31.93627,-25.84037],[31.98094,-25.95465],[31.86878,-26.00373],[31.41621,-25.72777],[31.32291,-25.74386],[31.25046,-25.82965],[31.1393,-25.91627],[31.11647,-25.99124],[30.96561,-26.26658],[30.89217,-26.32797],[30.85346,-26.40356],[30.82269,-26.44888],[30.80226,-26.52407],[30.80384,-26.80821],[30.90209,-26.78075],[30.91003,-26.84895],[30.98249,-26.90826],[30.97653,-27.00292],[31.00344,-27.04416],[31.15433,-27.19804],[31.50156,-27.31112],[31.97002,-27.31112],[31.97002,-27.12047],[31.97697,-27.05066],[32.00025,-26.79839],[32.10698,-26.79846],[32.31145,-26.84795],[32.89999,-26.85161],[32.88609,-26.9817],[32.70943,-27.47854],[32.62407,-27.77751],[32.5814,-28.07479],[32.53872,-28.2288],[32.42756,-28.50216],[32.36404,-28.59457],[32.07026,-28.84698],[31.98788,-28.90695],[31.77648,-28.96949],[31.46385,-29.28593],[31.35963,-29.38543],[31.16808,-29.63074],[31.06486,-29.78935],[31.05345,-29.84705],[31.06699,-29.86403],[31.04555,-29.9502],[30.95186,-30.00339],[30.86518,-30.10241],[30.72447,-30.3925],[30.35563,-30.93089],[30.09724,-31.24583],[29.86731,-31.43043],[29.74094,-31.50147],[29.48131,-31.69787],[28.89432,-32.28989],[28.54971,-32.58946],[28.14365,-32.83207],[28.07487,-32.94169],[27.84509,-33.08287],[27.3758,-33.38607],[26.88054,-33.6459],[26.59169,-33.74808],[26.45273,-33.79358],[26.20675,-33.75489],[26.00779,-33.7224],[25.80555,-33.75243],[25.75111,-33.80065],[25.65291,-33.85436],[25.65291,-33.94698],[25.71958,-34.00401],[25.72028,-34.05112],[25.55089,-34.06315],[25.35046,-34.05026],[25.28106,-34.00203],[25.04763,-33.99946],[24.95472,-34.00436],[24.94966,-34.10104],[24.87704,-34.15065],[24.87629,-34.20053],[24.85326,-34.21896],[24.76453,-34.20179],[24.50014,-34.20033],[24.34867,-34.11638],[24.19888,-34.1019],[23.99634,-34.05144],[23.80175,-34.05243],[23.74936,-34.01119],[23.49735,-34.00901],[23.41552,-34.04346],[23.41543,-34.11404],[22.90009,-34.0993],[22.84124,-34.05479],[22.64703,-34.05026],[22.64598,-34.00728],[22.57002,-34.00641],[22.50505,-34.06459],[22.252,-34.06459],[22.22213,-34.10147],[22.16212,-34.1057],[22.17124,-34.15218],[22.15769,-34.21809],[22.00156,-34.21722],[21.9497,-34.322],[21.86115,-34.40071],[21.56147,-34.40201],[21.5468,-34.36612],[21.50174,-34.36699],[21.5007,-34.40201],[21.41949,-34.44652],[21.19787,-34.44782],[21.09882,-34.39913],[21.00337,-34.37539],[20.89319,-34.39971],[20.89766,-34.4854],[20.74468,-34.48281],[20.5042,-34.48626],[20.25272,-34.70148],[20.08035,-34.83619],[19.99233,-34.83791],[19.89907,-34.82758],[19.89383,-34.7936],[19.5973,-34.79618],[19.39297,-34.64202],[19.28771,-34.64048],[19.28614,-34.59866],[19.34744,-34.52445],[19.32853,-34.45344],[19.098,-34.44998],[19.07256,-34.38024],[19.00235,-34.35256],[18.95206,-34.39494],[18.7975,-34.39364],[18.79842,-34.10164],[18.50175,-34.10153],[18.49995,-34.36169],[18.44773,-34.362],[18.44799,-34.35227],[18.39744,-34.3514],[18.39717,-34.3023],[18.35657,-34.30056],[18.34793,-34.20204],[18.29721,-34.19503],[18.29511,-33.99371],[18.33745,-33.99141],[18.34766,-33.84924],[18.34793,-33.78155],[18.41247,-33.74488],[18.36155,-33.65016],[18.2992,-33.58559],[18.21668,-33.44887],[18.13899,-33.39741],[17.94735,-33.16026],[17.88552,-33.05757],[17.84859,-32.96685],[17.83968,-32.85073],[17.83968,-32.79834]]],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",zoomExtent:[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-Orthofoto2014",name:"South Tyrol Orthofoto 2014",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_EPSG3857&STYLE=default&TILEMATRIXSET=GoogleMapsCompatible&TILEMATRIX=GoogleMapsCompatible%3A{zoom}&TILEROW={y}&TILECOL={x}&FORMAT=image%2Fjpeg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,18],polygon:[[[11.71495,46.51227],[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.61936,46.43957],[11.62508,46.43957],[11.62508,46.44797],[11.63349,46.44587],[11.63769,46.45846],[11.64399,46.45846],[11.6608,46.44587],[11.66711,46.44587],[11.66711,46.47525],[11.69442,46.47735],[11.69652,46.48575],[11.70913,46.49624],[11.70913,46.50254],[11.71333,46.50254],[11.71495,46.51227]],[[11.61435,46.41535],[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.20644,46.4156],[11.20485,46.3997],[11.17754,46.3997],[11.17543,46.3871],[11.16703,46.38081],[11.16703,46.36821],[11.16283,46.36821],[11.16283,46.29895],[11.12501,46.29895],[11.12291,46.25488],[11.13131,46.25278],[11.12711,46.24858],[11.16283,46.24858],[11.16283,46.215],[11.24898,46.2129],[11.25108,46.2234],[11.2889,46.2234],[11.2889,46.24019],[11.3015,46.25278],[11.30991,46.25278],[11.31201,46.24858],[11.33722,46.25068],[11.34143,46.26747],[11.34563,46.26747],[11.34773,46.25698],[11.35613,46.24858],[11.41707,46.25278],[11.41917,46.32414],[11.49271,46.32204],[11.48851,46.33044],[11.49901,46.32834],[11.50111,46.34723],[11.52423,46.34723],[11.53894,46.34513],[11.53894,46.32834],[11.55995,46.32414],[11.58306,46.34932],[11.58306,46.37241],[11.60407,46.37241],[11.60617,46.38291],[11.61458,46.38291],[11.62508,46.3934],[11.62508,46.41229],[11.61435,46.41535]],[[11.20663,46.41745],[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.96285,46.47718],[10.96952,46.45217],[10.98423,46.45217],[10.98843,46.44587],[10.99894,46.44587],[11.01154,46.42068],[11.04096,46.42068],[11.08088,46.43537],[11.08298,46.47525],[11.15232,46.47525],[11.18804,46.48365],[11.19014,46.47525],[11.20695,46.47315],[11.20485,46.44587],[11.19855,46.44167],[11.19435,46.42698],[11.19014,46.42698],[11.19014,46.42068],[11.20695,46.42068],[11.20663,46.41745]],[[10.47433,46.55501],[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.46952,46.62628],[10.47785,46.61797],[10.47785,46.59069],[10.47365,46.59069],[10.47155,46.5676],[10.46314,46.55501],[10.47433,46.55501]],[[10.46925,46.62643],[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],[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.43626,46.79843],[10.43373,46.81106],[10.42532,46.80686],[10.42532,46.79847],[10.42112,46.79847],[10.41692,46.78587],[10.41692,46.75229],[10.3938,46.7376],[10.3896,46.72081],[10.3854,46.72081],[10.3791,46.69353],[10.3791,46.66834],[10.3833,46.66414],[10.3812,46.64735],[10.3896,46.64525],[10.3938,46.63056],[10.42532,46.62846],[10.44843,46.63476],[10.46925,46.62643]]],terms_url:"https://geoservices.buergernetz.bz.it/geokatalog/",terms_text:"© Autonomen Provinz Bozen/Provincia Autonoma di Bolzano CC-BY 3.0"},{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",zoomExtent:[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",zoomExtent:[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:"SPW2009",name:"SPW(allonie) 2009-2010 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2009_2010/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:"2010-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2012",name:"SPW(allonie) 2012-2013 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2012_2013/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:"2013-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2015",name:"SPW(allonie) 2015 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2015/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",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPW2016",name:"SPW(allonie) 2016 aerial imagery",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/IMAGERIE/ORTHO_2016/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-01-01T00:00:00.000Z",startDate:"2016-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{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.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{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=FALSE&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.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"SPWrelief2014",name:"SPW(allonie) shaded relief",type:"wms",template:"https://geoservices.wallonie.be/arcgis/services/RELIEF/WALLONIE_MNT_2013_2014_HILLSHADE/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:"2014-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[5.78257,49.87573],[5.73919,49.83362],[5.75516,49.79146],[5.78839,49.79665],[5.91064,49.66249],[5.84857,49.59723],[5.87102,49.57599],[5.81857,49.54638],[5.66079,49.55362],[5.61108,49.50603],[5.55603,49.52928],[5.47051,49.49737],[5.45708,49.56703],[5.37522,49.62333],[5.31486,49.61137],[5.33243,49.65263],[5.26851,49.69657],[5.16628,49.69303],[4.99753,49.80006],[4.85164,49.79345],[4.84754,49.86806],[4.89013,49.90893],[4.79117,49.958],[4.87762,50.15374],[4.82418,50.16932],[4.70207,50.09556],[4.69441,49.99625],[4.44551,49.93722],[4.30589,49.96829],[4.19746,49.9546],[4.1352,50.01508],[4.22825,50.07842],[4.19682,50.13519],[4.12714,50.1355],[4.2052,50.27347],[4.16262,50.28896],[4.13538,50.25784],[4.02795,50.3584],[3.88574,50.32701],[3.84578,50.35323],[3.74546,50.35005],[3.70994,50.30316],[3.65756,50.37076],[3.65552,50.4617],[3.60586,50.49632],[3.4993,50.48921],[3.51992,50.52362],[3.47439,50.53368],[3.37698,50.49109],[3.28634,50.52793],[3.26104,50.70131],[3.20602,50.71139],[3.17839,50.75609],[3.30562,50.75466],[3.36077,50.70962],[3.45439,50.77072],[3.64047,50.72242],[3.67752,50.77062],[3.75857,50.78045],[3.77568,50.74789],[3.8798,50.75146],[3.9097,50.69245],[4.05868,50.69439],[4.14853,50.72834],[4.2467,50.6894],[4.46355,50.75511],[4.52399,50.72724],[4.59727,50.76359],[4.63445,50.74272],[4.64309,50.79755],[4.76014,50.80544],[4.92545,50.74275],[5.00339,50.76594],[5.07039,50.70649],[5.16508,50.6957],[5.16984,50.72257],[5.30912,50.71802],[5.35029,50.74629],[5.47863,50.72352],[5.68786,50.81193],[5.68225,50.75651],[5.7707,50.75132],[5.81963,50.71396],[5.88333,50.70992],[5.89217,50.75518],[5.96561,50.76107],[6.04045,50.74546],[6.03959,50.71833],[6.11066,50.72299],[6.18169,50.62383],[6.26953,50.62519],[6.17812,50.54153],[6.22658,50.49432],[6.35036,50.48854],[6.34298,50.38033],[6.40542,50.32331],[6.30647,50.32019],[6.27889,50.26734],[6.17377,50.23165],[6.19232,50.18203],[6.147,50.17775],[6.13779,50.12985],[6.10245,50.17055],[5.96368,50.17263],[5.96133,50.13136],[5.89532,50.11216],[5.81968,50.01329],[5.83578,49.97892],[5.77502,49.9608],[5.73577,49.89684],[5.78257,49.87573]],[[2.99943,50.81035],[2.93719,50.79361],[2.96,50.7735],[2.92247,50.75729],[2.84203,50.75153],[2.86315,50.70826],[2.91065,50.69409],[2.94001,50.74543],[3.02932,50.77896],[2.99943,50.81035]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/SPW(allonie)2009-2010aerialimagery.png"},{id:"ssb-sentrum",name:"SSB City Centres overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_193&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/arealsentrum/",terms_text:"© SSB",description:"Downtown areas with significant commercial and service activities.",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{id:"ssb-tettsteder",name:"SSB Urban Areas overlay",type:"wms",template:"https://ogc.ssb.no/wms.ashx?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=layer_198&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[0,22],polygon:[[[31.90425,70.43681],[28.47652,71.32896],[23.6865,71.25143],[16.80906,70.07308],[11.16207,67.52539],[9.97554,64.81158],[4.21871,62.145],[4.37254,59.1872],[6.17431,57.8915],[7.93212,57.73936],[10.77758,58.86491],[11.7224,58.76251],[12.72216,60.11415],[13.05175,61.34935],[12.52439,63.61699],[14.23826,63.98561],[15.11717,65.90166],[18.69871,68.37491],[20.06101,68.26126],[21.00584,68.78415],[25.24656,68.3506],[26.93845,69.8472],[28.76219,69.61121],[28.5864,68.8556],[31.06931,69.51915],[31.90425,70.43681]]],terms_url:"https://www.ssb.no/beftett",terms_text:"© SSB",description:"Human settlements of at least 200 people with less than 200 meters between households",icon:"http://www.fosterhjemsforening.no/wp-content/uploads/2015/06/SSB_logo1.png",overlay:true},{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",zoomExtent:[8,21],polygon:[[[7.29431,46.92376],[7.29827,46.92747],[7.30616,46.93095],[7.30433,46.93623],[7.30686,46.94037],[7.32464,46.94328],[7.32845,46.94641],[7.34141,46.94608],[7.34385,46.94737],[7.34346,46.94879],[7.35136,46.94855],[7.35056,46.95021],[7.35309,46.95193],[7.3582,46.95118],[7.3685,46.95662],[7.37151,46.96073],[7.37503,46.95983],[7.37851,46.96147],[7.38062,46.96547],[7.38321,46.9663],[7.3938,46.96693],[7.40005,46.96918],[7.40829,46.96869],[7.42817,46.9738],[7.43271,46.97269],[7.43536,46.96843],[7.43785,46.96843],[7.44125,46.97679],[7.44569,46.97479],[7.44838,46.97564],[7.4477,46.97901],[7.44405,46.97807],[7.44127,46.97982],[7.45067,46.99015],[7.45221,46.98968],[7.45465,46.97782],[7.46804,46.97583],[7.47079,46.97],[7.47019,46.96741],[7.47816,46.97118],[7.48452,46.97016],[7.48613,46.9679],[7.48579,46.96468],[7.47847,46.9629],[7.48029,46.96068],[7.47893,46.95878],[7.47978,46.9566],[7.47701,46.95446],[7.48405,46.94999],[7.48339,46.9452],[7.49556,46.93962],[7.49351,46.93766],[7.4908,46.93876],[7.4895,46.93687],[7.47667,46.93695],[7.47811,46.93625],[7.4747,46.93392],[7.47535,46.93299],[7.4691,46.92924],[7.47077,46.9255],[7.45857,46.93484],[7.44764,46.93043],[7.43542,46.93497],[7.4338,46.93312],[7.43764,46.93074],[7.41469,46.93682],[7.41384,46.93157],[7.40708,46.93038],[7.40806,46.92563],[7.40213,46.9242],[7.40148,46.92119],[7.38757,46.93045],[7.38231,46.92728],[7.38002,46.92989],[7.38087,46.93241],[7.37487,46.93143],[7.37489,46.93271],[7.36807,46.93239],[7.36831,46.93043],[7.36041,46.92859],[7.36056,46.9272],[7.33878,46.92454],[7.33937,46.91967],[7.32746,46.91903],[7.32692,46.9236],[7.32437,46.92519],[7.30823,46.92229],[7.29431,46.92376]]],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",zoomExtent:[14,19],polygon:[[[7.3807,47.00952],[7.38073,47.02301],[7.43853,47.02303],[7.43865,47.01408],[7.45174,47.014],[7.45172,47.00503],[7.54111,47.005],[7.54111,46.99873],[7.54378,46.99871],[7.54375,46.98696],[7.55682,46.987],[7.55685,46.96003],[7.51744,46.96001],[7.51744,46.95108],[7.53051,46.95106],[7.53051,46.92407],[7.51741,46.92405],[7.51738,46.91505],[7.53042,46.91507],[7.53048,46.9061],[7.54358,46.90602],[7.54358,46.87905],[7.55659,46.87903],[7.55662,46.8611],[7.54349,46.86104],[7.5434,46.85212],[7.49095,46.85212],[7.49107,46.87907],[7.47794,46.87909],[7.47797,46.89707],[7.45168,46.89713],[7.45171,46.88808],[7.43855,46.88814],[7.43858,46.87015],[7.41233,46.87015],[7.41236,46.87907],[7.39917,46.87911],[7.3992,46.86108],[7.38613,46.86114],[7.3861,46.85218],[7.373,46.85216],[7.37303,46.86112],[7.34677,46.8611],[7.3468,46.88808],[7.25488,46.88796],[7.25485,46.90596],[7.24172,46.90592],[7.24169,46.91497],[7.22856,46.91493],[7.22833,46.96887],[7.24146,46.96891],[7.24149,46.98688],[7.26769,46.98694],[7.26777,46.99593],[7.28078,46.99595],[7.2809,47.0094],[7.3807,47.00952]]],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",zoomExtent:[0,21],polygon:[[[8.68,47.32],[8.74,47.32],[8.74,47.365],[8.68,47.365],[8.68,47.32]]],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",zoomExtent:[0,21],polygon:[[[8.44624,47.44143],[8.63178,47.43968],[8.62895,47.31377],[8.44381,47.31555],[8.44624,47.44143]]],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",zoomExtent:[0,21],polygon:[[[8.56681,47.34713],[8.56665,47.34706],[8.56563,47.34684],[8.56575,47.34666],[8.56509,47.34645],[8.54207,47.33502],[8.54073,47.33376],[8.5403,47.33396],[8.54019,47.33372],[8.54042,47.33358],[8.5388,47.33208],[8.53642,47.33076],[8.53622,47.33018],[8.53345,47.32992],[8.5318,47.3295],[8.53145,47.32846],[8.53102,47.32789],[8.52974,47.32777],[8.52969,47.32687],[8.52899,47.32698],[8.52813,47.32685],[8.52802,47.32635],[8.52755,47.32639],[8.52762,47.32616],[8.52579,47.32619],[8.52563,47.32575],[8.52426,47.32608],[8.5242,47.32486],[8.52372,47.32416],[8.52304,47.32433],[8.52193,47.32436],[8.52194,47.32394],[8.51932,47.32401],[8.51868,47.32386],[8.51768,47.3232],[8.51642,47.32308],[8.5156,47.32315],[8.51472,47.32272],[8.51295,47.3229],[8.51162,47.32222],[8.50957,47.32202],[8.5095,47.32165],[8.50788,47.32203],[8.50735,47.32173],[8.50529,47.32144],[8.50476,47.32121],[8.5043,47.32074],[8.50317,47.32022],[8.50241,47.32053],[8.50227,47.32082],[8.50152,47.32129],[8.50102,47.32198],[8.50095,47.32259],[8.5006,47.32278],[8.50078,47.3237],[8.50066,47.32451],[8.50098,47.32595],[8.5015,47.3265],[8.50159,47.32732],[8.50188,47.32765],[8.50132,47.32883],[8.5014,47.32903],[8.50069,47.32979],[8.50087,47.33053],[8.50063,47.3311],[8.50112,47.33183],[8.50075,47.33202],[8.50078,47.33224],[8.50106,47.3326],[8.50191,47.33303],[8.5022,47.33364],[8.50177,47.33412],[8.50152,47.33504],[8.50199,47.33666],[8.50161,47.33728],[8.49877,47.33968],[8.49808,47.34169],[8.49702,47.34247],[8.49709,47.34326],[8.49798,47.34365],[8.4981,47.34387],[8.49817,47.34453],[8.49773,47.34521],[8.49636,47.34648],[8.4951,47.34691],[8.49467,47.3476],[8.49285,47.34828],[8.49206,47.3495],[8.49145,47.34964],[8.49128,47.34983],[8.49089,47.35067],[8.49,47.35056],[8.48813,47.352],[8.48691,47.35203],[8.4868,47.3522],[8.48728,47.35311],[8.4871,47.3534],[8.48501,47.35469],[8.48463,47.35536],[8.48463,47.3567],[8.48426,47.35737],[8.48321,47.35814],[8.48272,47.35907],[8.48205,47.35954],[8.47879,47.36078],[8.47698,47.36029],[8.47365,47.36081],[8.47275,47.36079],[8.47169,47.36132],[8.47053,47.36166],[8.46951,47.36438],[8.4664,47.36574],[8.46583,47.3661],[8.46545,47.36664],[8.46485,47.36681],[8.46427,47.36728],[8.46418,47.36838],[8.4649,47.36897],[8.46482,47.36911],[8.46938,47.37136],[8.47042,47.3726],[8.47022,47.37395],[8.46868,47.37382],[8.46761,47.37357],[8.46544,47.37444],[8.46288,47.37603],[8.45995,47.3775],[8.45638,47.37801],[8.45116,47.37817],[8.45047,47.37836],[8.44847,47.37967],[8.44801,47.38025],[8.45174,47.38062],[8.45371,47.38027],[8.45614,47.38072],[8.45669,47.38094],[8.45673,47.38244],[8.45745,47.38222],[8.45843,47.38231],[8.45841,47.38263],[8.45745,47.38325],[8.45767,47.3834],[8.45756,47.38371],[8.45807,47.38388],[8.46004,47.38594],[8.46088,47.38704],[8.46121,47.38795],[8.46104,47.38803],[8.46381,47.39053],[8.46518,47.39132],[8.46556,47.39113],[8.46618,47.39113],[8.46727,47.39065],[8.46697,47.39131],[8.46739,47.3929],[8.4671,47.39334],[8.46607,47.39378],[8.4651,47.39453],[8.46484,47.39481],[8.46488,47.39508],[8.46535,47.39492],[8.46854,47.39461],[8.47018,47.39401],[8.47066,47.39439],[8.47191,47.39388],[8.47208,47.39408],[8.47152,47.3943],[8.47151,47.3949],[8.4721,47.39517],[8.47301,47.39506],[8.47349,47.396],[8.46516,47.39829],[8.46568,47.39922],[8.46759,47.39873],[8.46806,47.39957],[8.46615,47.40006],[8.4677,47.403],[8.4699,47.40298],[8.47551,47.40381],[8.47815,47.40387],[8.47819,47.40508],[8.47738,47.40517],[8.47705,47.40619],[8.47729,47.40914],[8.47703,47.40935],[8.47543,47.40971],[8.47583,47.41077],[8.47605,47.41072],[8.47628,47.41102],[8.47665,47.41097],[8.47725,47.41194],[8.47488,47.41241],[8.47394,47.41222],[8.47303,47.41146],[8.47268,47.41058],[8.47101,47.41094],[8.47113,47.41137],[8.47085,47.41167],[8.47044,47.41159],[8.47031,47.41253],[8.46876,47.41225],[8.46801,47.41334],[8.46863,47.41363],[8.46857,47.41408],[8.46955,47.41484],[8.47007,47.41557],[8.46913,47.41649],[8.46913,47.41693],[8.46962,47.41752],[8.47158,47.41763],[8.4772,47.41974],[8.47688,47.42016],[8.47783,47.42212],[8.47895,47.42172],[8.47937,47.42113],[8.47972,47.42141],[8.48131,47.42134],[8.48171,47.423],[8.48294,47.42266],[8.48292,47.42222],[8.48609,47.42155],[8.48658,47.42164],[8.48683,47.42186],[8.48796,47.42201],[8.48851,47.42271],[8.49019,47.42234],[8.491,47.4239],[8.49006,47.42435],[8.49007,47.42532],[8.49027,47.42536],[8.49017,47.42578],[8.48552,47.42712],[8.48481,47.42784],[8.48466,47.42873],[8.48437,47.42896],[8.48445,47.42979],[8.48579,47.43103],[8.49562,47.43281],[8.50027,47.43442],[8.50207,47.43467],[8.50364,47.43402],[8.50997,47.43213],[8.51155,47.43116],[8.51274,47.43085],[8.516,47.43174],[8.51628,47.43175],[8.51681,47.43133],[8.51872,47.4319],[8.51979,47.43167],[8.52463,47.43126],[8.52549,47.43316],[8.5303,47.43207],[8.53063,47.43266],[8.533,47.43228],[8.53374,47.43251],[8.53467,47.432],[8.53521,47.43188],[8.53606,47.43187],[8.5374,47.4314],[8.53964,47.43126],[8.5401,47.4311],[8.54033,47.43186],[8.54363,47.43143],[8.54284,47.43289],[8.54311,47.43288],[8.54451,47.4325],[8.54459,47.43262],[8.54607,47.43207],[8.54858,47.43142],[8.55009,47.43128],[8.55098,47.43102],[8.55199,47.43104],[8.55535,47.43066],[8.5561,47.42803],[8.55684,47.42624],[8.55783,47.42554],[8.55697,47.4249],[8.55736,47.42472],[8.5569,47.42424],[8.55723,47.4241],[8.55419,47.4208],[8.56082,47.41817],[8.56129,47.41829],[8.56235,47.41632],[8.56282,47.41643],[8.56323,47.41565],[8.56622,47.41632],[8.56692,47.41629],[8.56735,47.41649],[8.5678,47.41684],[8.56875,47.41855],[8.56903,47.41871],[8.5696,47.41868],[8.56944,47.41926],[8.57223,47.41893],[8.57367,47.42004],[8.57378,47.4178],[8.57342,47.41711],[8.57386,47.41438],[8.57384,47.41324],[8.57331,47.41257],[8.5726,47.41207],[8.573,47.41144],[8.58806,47.40797],[8.58894,47.40756],[8.59312,47.40704],[8.59728,47.40631],[8.59722,47.406],[8.59608,47.40612],[8.59378,47.40222],[8.59622,47.40154],[8.5948,47.39918],[8.59725,47.39851],[8.59644,47.39715],[8.59637,47.39663],[8.59623,47.39646],[8.59453,47.39712],[8.59392,47.39647],[8.59335,47.39614],[8.59208,47.39691],[8.59172,47.39681],[8.59148,47.397],[8.58828,47.3958],[8.58905,47.39501],[8.58995,47.39478],[8.58818,47.39351],[8.58752,47.39321],[8.58747,47.39297],[8.58619,47.3928],[8.58442,47.39195],[8.58369,47.39008],[8.58305,47.38905],[8.58316,47.38831],[8.58437,47.38834],[8.58432,47.38894],[8.58492,47.39011],[8.58528,47.3904],[8.58696,47.39017],[8.5869,47.38977],[8.58765,47.38905],[8.58698,47.38793],[8.59181,47.38638],[8.59307,47.38565],[8.59299,47.38523],[8.59354,47.38522],[8.59274,47.38417],[8.59082,47.38476],[8.59013,47.38381],[8.58966,47.384],[8.58956,47.38373],[8.59217,47.38311],[8.59151,47.38244],[8.59384,47.38081],[8.59407,47.38061],[8.59406,47.38029],[8.59556,47.3796],[8.59574,47.37927],[8.59721,47.37849],[8.59674,47.37782],[8.59702,47.37716],[8.5976,47.37661],[8.59705,47.37589],[8.59778,47.37557],[8.59828,47.3751],[8.59855,47.37473],[8.59813,47.37447],[8.6002,47.37331],[8.60053,47.3734],[8.60096,47.37312],[8.60194,47.37198],[8.60192,47.37171],[8.60324,47.37131],[8.60607,47.36871],[8.60745,47.36816],[8.60812,47.36761],[8.61067,47.3673],[8.612,47.36684],[8.61308,47.36776],[8.61344,47.36779],[8.61366,47.36802],[8.61549,47.3677],[8.61645,47.36841],[8.61665,47.36828],[8.61764,47.36681],[8.61709,47.36626],[8.61682,47.36535],[8.61565,47.36466],[8.61495,47.36458],[8.61557,47.36342],[8.61566,47.36273],[8.61482,47.36263],[8.6147,47.36151],[8.61929,47.36121],[8.61996,47.36104],[8.62174,47.36007],[8.62257,47.35983],[8.62187,47.35946],[8.62133,47.35746],[8.62351,47.35592],[8.62352,47.35561],[8.62544,47.35466],[8.62416,47.35397],[8.62245,47.35364],[8.62209,47.35334],[8.61989,47.35367],[8.61976,47.35385],[8.61844,47.35382],[8.61839,47.35425],[8.61708,47.35414],[8.61569,47.35442],[8.6152,47.3541],[8.61386,47.35402],[8.61255,47.35437],[8.61156,47.35394],[8.61107,47.35352],[8.61042,47.35337],[8.60946,47.35352],[8.60776,47.35333],[8.60607,47.35363],[8.60506,47.35359],[8.6038,47.353],[8.60305,47.35219],[8.6032,47.35207],[8.60294,47.35175],[8.603,47.35076],[8.60262,47.35073],[8.6016,47.35073],[8.60104,47.35105],[8.60026,47.35112],[8.5996,47.35145],[8.59859,47.35145],[8.59824,47.35165],[8.59689,47.3514],[8.59666,47.35161],[8.59596,47.35169],[8.59564,47.3519],[8.59494,47.35161],[8.59454,47.35175],[8.5939,47.35161],[8.5935,47.35211],[8.59229,47.3523],[8.59189,47.35278],[8.59118,47.35321],[8.59047,47.35271],[8.59014,47.35286],[8.58846,47.35289],[8.58797,47.35307],[8.58748,47.35267],[8.5863,47.35288],[8.58591,47.35231],[8.5853,47.35201],[8.58462,47.35141],[8.58417,47.35129],[8.58438,47.35116],[8.58398,47.35085],[8.58348,47.35104],[8.58335,47.35087],[8.58221,47.35101],[8.58246,47.35062],[8.57851,47.34873],[8.57827,47.34888],[8.57786,47.34865],[8.57686,47.34878],[8.57688,47.34859],[8.57625,47.34839],[8.57308,47.34751],[8.573,47.34765],[8.57214,47.34744],[8.57163,47.34728],[8.5717,47.34712],[8.57029,47.34672],[8.56968,47.3476],[8.56741,47.34674],[8.56681,47.34713]]],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",zoomExtent:[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",icon:"https://stamen.com/wp-content/uploads/2016/07/stamen_compass_rose_small-01.png"},{id:"stockholm-orto",name:"Stockholm Orthophoto",type:"wms",template:"http://openmap.stockholm.se/bios/wms/app/baggis/web/WMS_STHLM_ORTOFOTO_2015?FORMAT=image/png&TRANSPARENT=TRUE&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=p_1002820&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[5,21],polygon:[[[17.8755,59.2625],[17.94411,59.27307],[18.09551,59.22603],[18.19582,59.22786],[18.20297,59.24886],[18.12538,59.30779],[18.1786,59.32566],[18.09876,59.3721],[18.04264,59.37816],[18.00796,59.34334],[17.93655,59.37641],[17.97483,59.40246],[17.90882,59.4417],[17.8854,59.43792],[17.88918,59.41382],[17.84077,59.38568],[17.81708,59.40054],[17.77725,59.39984],[17.75622,59.3916],[17.79899,59.36204],[17.94993,59.31121],[17.85622,59.28412],[17.8755,59.2625]]],terms_url:"http://dataportalen.stockholm.se/dataportalen/",terms_text:"© Stockholm municipality, CC0",best:true,description:"Orthophotos from the municipality of Stockholm 2015, CC0 license",icon:"https://upload.wikimedia.org/wikipedia/commons/thumb/4/4d/Stockholm_vapen_bra.svg/196px-Stockholm_vapen_bra.svg.png"},{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",zoomExtent:[8,21],polygon:[[[-0.75248,51.08219],[-0.75952,51.08563],[-0.80143,51.14579],[-0.83989,51.14407],[-0.83577,51.18024],[-0.85295,51.20113],[-0.85227,51.20962],[-0.84952,51.2179],[-0.82669,51.24037],[-0.8121,51.24692],[-0.77365,51.24596],[-0.75442,51.23811],[-0.75408,51.23392],[-0.74464,51.23338],[-0.74307,51.28472],[-0.7515,51.30695],[-0.76644,51.3121],[-0.78206,51.32702],[-0.78154,51.33881],[-0.73743,51.37205],[-0.71923,51.37697],[-0.67958,51.3848],[-0.68078,51.39015],[-0.65314,51.39176],[-0.63014,51.39058],[-0.62911,51.39701],[-0.62344,51.39776],[-0.61314,51.42956],[-0.60025,51.44591],[-0.58671,51.44454],[-0.57624,51.4532],[-0.56268,51.45235],[-0.54774,51.447],[-0.53727,51.44486],[-0.5371,51.45267],[-0.54396,51.45459],[-0.54053,51.46989],[-0.53092,51.47609],[-0.50912,51.47448],[-0.5086,51.46957],[-0.49006,51.46828],[-0.45264,51.46069],[-0.44869,51.44293],[-0.44148,51.44186],[-0.44183,51.43694],[-0.41127,51.43801],[-0.40149,51.42795],[-0.38071,51.42624],[-0.38054,51.41617],[-0.34913,51.41382],[-0.3275,51.40375],[-0.30398,51.39904],[-0.30192,51.37547],[-0.30948,51.36969],[-0.31119,51.35297],[-0.29557,51.35415],[-0.29231,51.36733],[-0.2851,51.36808],[-0.27875,51.37719],[-0.26553,51.38372],[-0.24115,51.3848],[-0.21231,51.36283],[-0.21077,51.34986],[-0.19086,51.35029],[-0.15429,51.33388],[-0.14966,51.30577],[-0.10743,51.29665],[-0.08872,51.30996],[-0.08786,51.32208],[-0.0652,51.32154],[-0.06417,51.32648],[-0.05198,51.32637],[-0.05284,51.33463],[-0.03308,51.34309],[0.00192,51.33763],[0.01188,51.3282],[0.01393,51.29944],[0.02029,51.29944],[0.02406,51.30727],[0.03316,51.30867],[0.04552,51.30545],[0.05239,51.28774],[0.06166,51.25778],[0.06406,51.24155],[0.04621,51.21263],[0.04071,51.21091],[0.04483,51.19898],[0.04947,51.19973],[0.05582,51.19446],[0.06114,51.17907],[0.06234,51.15421],[0.05771,51.14171],[0.02046,51.13654],[-0.0446,51.13364],[-0.1567,51.13525],[-0.15721,51.129],[-0.22879,51.11834],[-0.24733,51.11834],[-0.25008,51.12114],[-0.29935,51.1137],[-0.32218,51.11198],[-0.32235,51.10584],[-0.3596,51.10196],[-0.35891,51.11133],[-0.38638,51.11176],[-0.3869,51.10625],[-0.4281,51.09472],[-0.48568,51.09516],[-0.48713,51.08723],[-0.52974,51.08654],[-0.53023,51.07899],[-0.61046,51.07655],[-0.60997,51.08067],[-0.6578,51.07922],[-0.65828,51.07434],[-0.68365,51.07075],[-0.6998,51.07083],[-0.72966,51.07449],[-0.75248,51.08219]]]},{id:"Swietochlowice-2008",name:"Świętochłowice: Orthophotomap 2008 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2008&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2008-01-01T00:00:00.000Z",startDate:"2008-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2009",name:"Świętochłowice: Orthophotomap 2009 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2009&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{id:"Swietochlowice-2012",name:"Świętochłowice: Orthophotomap 2012 (aerial image)",type:"wms",template:"https://swietochlowice.geoportal2.pl/map/wms/wms.php?SERVICE=WMS&REQUEST=GetMap&VERSION=1.1.1&LAYERS=ortofotomapa2012&STYLES=&FORMAT=image/jpeg&BBOX={bbox}&WIDTH={width}&HEIGHT={height}&SRS={proj}",projection:"EPSG:4326",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.92818,50.32151],[18.93028,50.31766],[18.93402,50.31392],[18.93193,50.31119],[18.92556,50.30575],[18.92429,50.30354],[18.92964,50.30206],[18.93083,50.3004],[18.9283,50.2961],[18.93573,50.29356],[18.93885,50.28965],[18.9371,50.28727],[18.93966,50.28206],[18.93402,50.27553],[18.92953,50.27543],[18.93037,50.27338],[18.93413,50.27104],[18.93239,50.26883],[18.92716,50.26926],[18.90447,50.27371],[18.89758,50.27612],[18.89569,50.28028],[18.89783,50.28566],[18.89712,50.2878],[18.88292,50.29258],[18.88031,50.29473],[18.88311,50.29894],[18.88819,50.30164],[18.88326,50.30717],[18.88444,50.31183],[18.89149,50.31809],[18.89306,50.32558],[18.89568,50.32704],[18.92818,50.32151]]],terms_text:"Urząd Miasta Świętochłowice"},{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",zoomExtent:[10,22],polygon:[[[20.14599,46.22811],[20.13323,46.22904],[20.12584,46.22987],[20.12233,46.23099],[20.12085,46.23175],[20.11897,46.23351],[20.11312,46.24136],[20.11203,46.2433],[20.11157,46.245],[20.11119,46.24709],[20.11129,46.24877],[20.11159,46.25097],[20.11222,46.2528],[20.11299,46.25427],[20.11354,46.25535],[20.11477,46.2568],[20.13523,46.27685],[20.13664,46.27751],[20.13789,46.27803],[20.13939,46.27835],[20.14088,46.27846],[20.16115,46.27816],[20.16211,46.27816],[20.16359,46.2777],[20.16618,46.27615],[20.16878,46.27386],[20.16961,46.27144],[20.16959,46.27045],[20.17009,46.27044],[20.17399,46.26433],[20.17662,46.25829],[20.1948,46.25492],[20.18587,46.24481],[20.18466,46.24531],[20.17804,46.23831],[20.17818,46.23771],[20.17953,46.2371],[20.17257,46.23002],[20.16983,46.23504],[20.16877,46.23629],[20.16703,46.23785],[20.16594,46.23873],[20.16544,46.239],[20.16548,46.239],[20.16352,46.24014],[20.16021,46.2412],[20.15927,46.24153],[20.15927,46.24158],[20.15835,46.24185],[20.15495,46.24229],[20.15108,46.23515],[20.14938,46.23246],[20.14599,46.22811]]],terms_url:"http://www.geo.u-szeged.hu",terms_text:"SZTE TFGT - University of Szeged",best:true,description:"Inner part of Szeged"},{id:"TW_NLSC_WMS_EMAP6",name:"Taiwan e-Map Open Data",type:"tms",template:"https://wmts.nlsc.gov.tw/wmts/EMAP6_OPENDATA/default/GoogleMapsCompatible/{zoom}/{y}/{x}",zoomExtent:[0,15],polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_LANDSECT",name:"Taiwan Land-Section Data",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=LANDSECT&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TW_NLSC_WMS_Village",name:"Taiwan Village Boundaries",type:"wms",template:"https://wms.nlsc.gov.tw/wms?VERSION=1.1.1&FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=Village&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[121.2237,25.76997],[122.2251,26.60305],[122.9312,22.57058],[120.6771,20.72799],[118.2509,23.26265],[118.3036,23.30751],[118.1978,24.34453],[118.1036,24.36172],[118.2283,24.49486],[118.4416,24.55302],[118.6024,24.46068],[120.0474,25.38843],[119.8935,25.78169],[119.787,26.2048],[120.4578,26.53253],[121.2237,25.76997]]],terms_url:"https://maps.nlsc.gov.tw/",terms_text:"© National Land Surveying and Mapping Center, Taiwan OGDL 1.0",icon:"https://osmlab.github.io/editor-layer-index/sources/asia/tw/Taiwane-MapOpenData.png"},{id:"TEClines",name:"TEC bus lines",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Lignes/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"TECstops",name:"TEC bus stops",type:"wms",template:"https://geodata.tec-wl.be/arcgis/services/Poteaux/MapServer/WMSServer?FORMAT=image/png&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=0&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",polygon:[[[5.40236,49.50688],[5.81984,49.54253],[6.1714,49.62089],[5.85829,49.68846],[5.7704,49.85343],[5.894,50.11832],[6.15492,50.13593],[6.39662,50.36775],[6.28126,50.46576],[6.11372,50.7933],[5.72646,50.77941],[5.70998,50.85229],[5.61385,50.80024],[5.46278,50.79677],[5.21284,50.70119],[4.94917,50.80371],[4.75966,50.80718],[4.72121,50.88869],[4.60585,50.77941],[4.48775,50.85749],[4.36964,50.85056],[4.15266,50.72728],[3.59236,50.76725],[3.29848,50.76377],[3.04579,50.80024],[2.86177,50.72728],[2.89748,50.68553],[3.0815,50.76725],[3.19685,50.68031],[3.28749,50.52691],[3.67201,50.47625],[3.68574,50.31692],[3.99062,50.27305],[4.14992,50.17465],[4.24055,50.08661],[4.15266,49.99842],[4.18562,49.96486],[4.55366,49.94542],[4.69923,50.03372],[4.81184,50.0919],[4.84206,50.01607],[4.86677,49.90475],[4.85854,49.80382],[5.08925,49.7648],[5.34743,49.60843],[5.40236,49.50688]]],icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/TECbusstops.png",overlay:true},{id:"teotonio_vilela",name:"Teotonio Vilela AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.31164,-9.95468],[-36.31158,-9.94382],[-36.31145,-9.93197],[-36.31127,-9.92436],[-36.31123,-9.91848],[-36.31119,-9.91637],[-36.31141,-9.91324],[-36.3111,-9.90922],[-36.31108,-9.90318],[-36.31099,-9.89379],[-36.31089,-9.8842],[-36.31078,-9.87412],[-36.31068,-9.86457],[-36.3318,-9.86432],[-36.34001,-9.86437],[-36.3478,-9.86425],[-36.35917,-9.8642],[-36.37047,-9.86404],[-36.38448,-9.86386],[-36.40164,-9.86364],[-36.40221,-9.9225],[-36.40249,-9.93177],[-36.40259,-9.94183],[-36.40248,-9.94804],[-36.40266,-9.9537],[-36.3855,-9.95384],[-36.38283,-9.95392],[-36.37096,-9.95399],[-36.36232,-9.95423],[-36.34747,-9.95422],[-36.33287,-9.95446],[-36.3291,-9.95456],[-36.32089,-9.95459],[-36.31164,-9.95468]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[0,20],polygon:[[[-99.99854,34.56018],[-95.55655,33.99257],[-93.89679,33.61039],[-93.98468,32.04103],[-93.41614,31.02505],[-93.74531,29.57268],[-96.50492,28.23159],[-97.36942,26.95467],[-97.04867,25.8053],[-99.07342,26.32559],[-100.76599,29.02532],[-102.33154,29.84339],[-103.13355,28.88112],[-104.28879,29.28831],[-104.72698,29.94816],[-104.72697,30.23535],[-106.5345,31.78457],[-106.75767,31.78457],[-106.75766,32.04386],[-106.61848,32.04385],[-103.11949,32.04376],[-103.09544,36.50046],[-103.05798,36.54269],[-100.00042,36.54222],[-99.99854,34.56018]]],terms_url:"https://tnris.org/maps-and-data/online-mapping-services",terms_text:"Texas Natural Resources Information System"},{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",zoomExtent:[0,22],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-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:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/TIGER2017RoadsOverlay.png",overlay:true},{id:"US-TIGER-Roads-2018",name:"TIGER Roads 2018",type:"tms",template:"https://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/openstreetmapus/cjo1wbulo3ub82ro1c9onlzmh/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1Ijoib3BlbnN0cmVldG1hcHVzIiwiYSI6ImNpcnF4Ym43dDBoOXZmYW04bWhlNWdrY2EifQ.4SFexuTUuKkZeerO3dgtmw",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",zoomExtent:[0,22],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-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:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/TIGER2017RoadsOverlay.png",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",zoomExtent:[15,22],polygon:[[[10.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],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.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],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.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],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.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],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.43998,47.59768],[10.47886,47.59925],[10.50277,47.58656],[10.4838,47.55979],[10.51312,47.5435],[10.57177,47.54582],[10.57004,47.56212],[10.60109,47.58074],[10.63904,47.5691],[10.70804,47.57027],[10.71149,47.54932],[10.76841,47.55048],[10.78566,47.52603],[10.89605,47.55048],[10.93572,47.5237],[10.934,47.50506],[10.89088,47.49573],[10.95125,47.49107],[10.9547,47.46776],[11.003,47.43276],[10.99092,47.40825],[11.10304,47.40475],[11.11511,47.41993],[11.20998,47.4456],[11.26863,47.44093],[11.26691,47.41059],[11.29451,47.4421],[11.33073,47.46076],[11.38248,47.45843],[11.3704,47.47592],[11.4394,47.53069],[11.467,47.51787],[11.57394,47.5237],[11.57567,47.55863],[11.59809,47.59121],[11.63431,47.60633],[11.66881,47.5947],[11.793,47.60284],[11.83958,47.59238],[11.84993,47.61098],[12.00689,47.63656],[12.03622,47.62494],[12.07761,47.62726],[12.10866,47.61912],[12.19491,47.62261],[12.15351,47.68768],[12.15868,47.7167],[12.18111,47.71206],[12.21906,47.72482],[12.24148,47.75382],[12.27253,47.7515],[12.2846,47.73178],[12.26563,47.69581],[12.33635,47.7109],[12.37602,47.69581],[12.44329,47.70277],[12.45364,47.69232],[12.45364,47.6749],[12.51057,47.63191],[12.53126,47.64586],[12.58991,47.63424],[12.57956,47.61098],[12.66581,47.5947],[12.67961,47.57492],[12.64511,47.55048],[12.66753,47.53185],[12.68478,47.50389],[12.71238,47.48175],[12.66753,47.45609],[12.64166,47.45959],[12.65028,47.44326],[12.62096,47.40709],[12.57439,47.38607],[12.55024,47.39658],[12.49159,47.37205],[12.50884,47.35102],[12.48814,47.32063],[12.43467,47.32297],[12.41397,47.30426],[12.36395,47.30894],[12.3122,47.32764],[12.2708,47.29841],[12.17766,47.29373],[12.14833,47.28437],[12.11729,47.29958],[12.09831,47.27501],[12.12591,47.25042],[12.09659,47.19771],[12.11039,47.14846],[12.14143,47.10974],[12.13799,47.08977],[12.15006,47.07568],[12.00517,47.04395],[11.92065,47.02985],[11.83095,46.99103],[11.78783,46.98633],[11.77403,46.9675],[11.73091,46.96514],[11.70676,46.98986],[11.64294,46.99456],[11.61189,47.00515],[11.53254,46.97809],[11.49287,47.00868],[11.44457,46.9675],[11.4049,46.96161],[11.34453,46.98633],[11.20309,46.9569],[11.17549,46.96161],[11.17721,46.94395],[11.14616,46.92275],[11.12546,46.92275],[11.10822,46.90389],[11.11511,46.88857],[11.08234,46.85319],[11.09614,46.8237],[11.05129,46.80245],[11.02369,46.76229],[10.91848,46.77056],[10.88398,46.75756],[10.84085,46.77292],[10.82361,46.76938],[10.79083,46.78946],[10.75633,46.77883],[10.72529,46.79064],[10.74771,46.82724],[10.69424,46.84494],[10.67354,46.86971],[10.60799,46.85319],[10.55452,46.82724],[10.52002,46.83904],[10.46827,46.83668],[10.45103,46.8815],[10.47517,46.93217],[10.41308,46.95572],[10.3941,46.98868],[10.3665,46.98044],[10.33891,46.94748],[10.32856,46.91803],[10.29751,46.91332],[10.25956,46.9251],[10.23886,46.86263],[10.16642,46.83904],[10.13537,46.8473],[10.13192,46.87207],[10.10604,46.88621],[10.09224,46.92746],[10.12502,46.95219],[10.14572,47.00044],[10.11294,47.02514],[10.15262,47.04983],[10.13019,47.06276],[10.13364,47.09095],[10.15952,47.12617],[10.20091,47.1426],[10.19229,47.20005],[10.20954,47.21294],[10.18711,47.23989],[10.20091,47.25628],[10.16814,47.2633],[10.16814,47.28086],[10.20264,47.29139],[10.24404,47.28905],[10.33373,47.32063],[10.38893,47.39074],[10.4148,47.39424],[10.4562,47.43626],[10.44758,47.48175],[10.41998,47.50506],[10.4424,47.55514],[10.41308,47.57143],[10.43998,47.59768]],[[12.4019,47.16019],[12.35705,47.13908],[12.35015,47.11208],[12.31048,47.10739],[12.25528,47.07215],[12.21388,47.05923],[12.20008,47.02632],[12.14488,47.03102],[12.11556,47.0075],[12.13626,46.95926],[12.16731,46.9357],[12.14316,46.91096],[12.18973,46.90036],[12.21733,46.86617],[12.25528,46.88386],[12.27425,46.88268],[12.2984,46.83432],[12.27598,46.82016],[12.27943,46.77765],[12.35015,46.77174],[12.3812,46.715],[12.44329,46.68425],[12.51402,46.67004],[12.56576,46.64873],[12.62958,46.65347],[12.70203,46.65347],[12.70375,46.69844],[12.72963,46.70081],[12.72273,46.73747],[12.80207,46.74929],[12.85382,46.74456],[12.90384,46.77174],[12.92799,46.75992],[12.95732,46.77647],[12.97974,46.79772],[12.89522,46.83314],[12.89522,46.84848],[12.8452,46.86381],[12.84692,46.91568],[12.7969,46.93099],[12.78828,46.94748],[12.7486,46.96867],[12.73653,46.99691],[12.78138,47.0416],[12.7624,47.051],[12.7141,47.04513],[12.71065,47.07803],[12.62268,47.12617],[12.56921,47.14142],[12.55196,47.13321],[12.52609,47.15433],[12.48297,47.16488],[12.46054,47.14846],[12.43467,47.15785],[12.41915,47.14377],[12.4019,47.16019]]],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",zoomExtent:[0,20],polygon:[[[5.96175,50.17631],[6.02627,50.18496],[6.03318,50.16395],[6.06069,50.15536],[6.07668,50.15913],[6.07824,50.17255],[6.10176,50.17199],[6.1225,50.16437],[6.1201,50.15594],[6.1277,50.14993],[6.11323,50.13739],[6.12369,50.13719],[6.14093,50.1305],[6.13555,50.11899],[6.13808,50.10263],[6.13108,50.09964],[6.13547,50.09119],[6.12194,50.09059],[6.12634,50.07817],[6.13186,50.07348],[6.12117,50.064],[6.11444,50.06139],[6.11563,50.05817],[6.12361,50.06323],[6.13661,50.04178],[6.13034,50.02975],[6.14821,50.02307],[6.13868,50.01572],[6.13594,50.01485],[6.13138,50.01905],[6.13024,50.01819],[6.13934,50.01116],[6.1517,50.01058],[6.14546,49.99689],[6.13966,49.9994],[6.13852,49.99829],[6.14218,49.99535],[6.15023,49.99518],[6.15625,49.98867],[6.17305,49.98589],[6.17348,49.98344],[6.17035,49.98376],[6.16549,49.97115],[6.17151,49.96298],[6.1763,49.962],[6.17995,49.95386],[6.18339,49.9548],[6.17983,49.96307],[6.18331,49.9686],[6.19277,49.97158],[6.19978,49.95352],[6.20707,49.95672],[6.21269,49.9514],[6.22502,49.95039],[6.22044,49.94369],[6.22824,49.93726],[6.22635,49.92766],[6.21913,49.92354],[6.22986,49.92125],[6.23603,49.91355],[6.23187,49.91064],[6.22769,49.91062],[6.23229,49.9072],[6.23381,49.90028],[6.24692,49.89535],[6.25781,49.88724],[6.26301,49.88101],[6.27646,49.87725],[6.28113,49.87957],[6.29166,49.87548],[6.2977,49.86673],[6.30989,49.87107],[6.31532,49.8673],[6.31465,49.86057],[6.32361,49.85188],[6.32158,49.8409],[6.32741,49.83673],[6.33656,49.83998],[6.33937,49.8507],[6.36465,49.85164],[6.4022,49.82098],[6.42643,49.81629],[6.42807,49.81186],[6.43097,49.81129],[6.44161,49.81547],[6.44344,49.81233],[6.45366,49.81275],[6.46454,49.81975],[6.47057,49.82385],[6.49681,49.81277],[6.50669,49.80993],[6.51155,49.80238],[6.51485,49.80513],[6.5196,49.81446],[6.52981,49.81048],[6.53225,49.80686],[6.53083,49.80116],[6.50622,49.78899],[6.51917,49.78344],[6.51105,49.77422],[6.52056,49.76818],[6.52052,49.76134],[6.50373,49.75086],[6.50263,49.73298],[6.50727,49.72938],[6.51809,49.7242],[6.51642,49.72129],[6.51176,49.72016],[6.50479,49.725],[6.49891,49.72639],[6.49558,49.72443],[6.50712,49.71655],[6.50788,49.71215],[6.5046,49.71227],[6.42714,49.66237],[6.4399,49.66025],[6.44251,49.65591],[6.42178,49.61809],[6.39898,49.60094],[6.37941,49.59526],[6.37551,49.58809],[6.38443,49.5801],[6.38119,49.57509],[6.36909,49.5783],[6.35791,49.57166],[6.3849,49.55817],[6.38009,49.54856],[6.35855,49.53296],[6.35932,49.52481],[6.37076,49.50545],[6.37056,49.45732],[6.3334,49.46493],[6.32189,49.47244],[6.29503,49.47928],[6.28789,49.48379],[6.27191,49.49995],[6.24133,49.50693],[6.19669,49.50331],[6.17337,49.50577],[6.16086,49.50085],[6.1671,49.49006],[6.14018,49.48525],[6.12937,49.48803],[6.12725,49.47081],[6.1014,49.46726],[6.10483,49.45076],[6.08167,49.45417],[6.07722,49.46139],[6.05917,49.46306],[6.05222,49.46028],[6.04421,49.44553],[6.02529,49.44703],[6.02154,49.45127],[6.01574,49.44885],[5.99412,49.45301],[5.97657,49.44885],[5.97773,49.45955],[5.97232,49.46087],[5.96891,49.48202],[5.9616,49.49026],[5.91578,49.49835],[5.89033,49.4948],[5.86332,49.50006],[5.84897,49.50826],[5.84828,49.51397],[5.83641,49.51817],[5.83187,49.52639],[5.84308,49.53081],[5.83562,49.54114],[5.81625,49.53325],[5.8052,49.54272],[5.85943,49.57158],[5.86866,49.587],[5.86289,49.58525],[5.8511,49.58379],[5.84712,49.58961],[5.84565,49.5981],[5.8694,49.6106],[5.88182,49.63815],[5.89998,49.63907],[5.89934,49.66239],[5.85656,49.67628],[5.85628,49.68211],[5.8757,49.71118],[5.86481,49.72331],[5.84325,49.71822],[5.82191,49.72128],[5.82489,49.73767],[5.82073,49.74878],[5.78626,49.79079],[5.76517,49.78961],[5.75094,49.79094],[5.74159,49.82126],[5.74581,49.82435],[5.7372,49.83353],[5.74053,49.84142],[5.74701,49.84048],[5.74624,49.84783],[5.75399,49.84878],[5.74066,49.85152],[5.75229,49.85922],[5.74955,49.87554],[5.77567,49.87438],[5.77505,49.88057],[5.7346,49.89341],[5.73303,49.90285],[5.75783,49.91737],[5.76039,49.93252],[5.77073,49.93711],[5.76878,49.94239],[5.7688,49.96104],[5.78672,49.96816],[5.80524,49.96677],[5.80652,49.97321],[5.83129,49.97995],[5.83462,49.98656],[5.81806,49.99936],[5.81561,50.01437],[5.84792,50.02809],[5.86189,50.04581],[5.85087,50.0563],[5.85781,50.07186],[5.881,50.08069],[5.89196,50.12041],[5.95286,50.13384],[5.96175,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.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],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.91731,47.40854],[18.91691,47.40849],[18.91606,47.40885],[18.91565,47.40905],[18.91458,47.40938],[18.91385,47.4097],[18.91376,47.40976],[18.91314,47.41038],[18.9122,47.41098],[18.91041,47.41175],[18.90932,47.41258],[18.90841,47.41317],[18.90676,47.41443],[18.90481,47.41568],[18.90362,47.41597],[18.90317,47.41616],[18.90062,47.41742],[18.90042,47.41755],[18.89968,47.41797],[18.89888,47.41818],[18.89814,47.41835],[18.89752,47.41855],[18.89666,47.41901],[18.8958,47.41954],[18.89421,47.4205],[18.89055,47.42209],[18.88743,47.42332],[18.88554,47.42424],[18.88436,47.42476],[18.88189,47.42553],[18.88085,47.42598],[18.8801,47.42629],[18.87956,47.42649],[18.87741,47.42738],[18.87602,47.42789],[18.87508,47.42836],[18.87281,47.42934],[18.87164,47.42968],[18.8714,47.43001],[18.87259,47.4323],[18.87273,47.43278],[18.87274,47.43324],[18.87244,47.43482],[18.87206,47.43526],[18.86891,47.43712],[18.86561,47.4375],[18.86466,47.43774],[18.86404,47.43809],[18.86378,47.43791],[18.8634,47.43784],[18.863,47.43798],[18.85195,47.44715],[18.85217,47.44847],[18.8593,47.45387],[18.85839,47.45512],[18.85777,47.45568],[18.85718,47.456],[18.8572,47.45636],[18.86015,47.45839],[18.86194,47.4595],[18.86099,47.46071],[18.85979,47.46201],[18.85929,47.46236],[18.85859,47.46272],[18.85713,47.46333],[18.85634,47.4636],[18.85628,47.46403],[18.85719,47.46528],[18.85663,47.46551],[18.85653,47.4658],[18.85693,47.46656],[18.85836,47.46953],[18.85826,47.4698],[18.85827,47.46991],[18.85838,47.47019],[18.85844,47.47027],[18.85852,47.47033],[18.85862,47.47036],[18.85873,47.47038],[18.8589,47.47036],[18.86146,47.46973],[18.86277,47.46929],[18.86617,47.46785],[18.86794,47.46656],[18.86997,47.46524],[18.8708,47.46457],[18.87268,47.46333],[18.87536,47.46113],[18.87687,47.45927],[18.88943,47.45987],[18.89024,47.45988],[18.90371,47.45534],[18.90427,47.4552],[18.90493,47.45506],[18.90542,47.4551],[18.90567,47.45505],[18.90629,47.45477],[18.90648,47.45453],[18.9066,47.45447],[18.90678,47.45439],[18.90811,47.45399],[18.90837,47.45395],[18.9089,47.45384],[18.90954,47.4537],[18.91326,47.45317],[18.91353,47.4532],[18.91372,47.45317],[18.91386,47.45307],[18.91431,47.45294],[18.91598,47.453],[18.91807,47.45317],[18.91846,47.453],[18.91903,47.45161],[18.92173,47.4508],[18.92246,47.45069],[18.92418,47.45025],[18.92756,47.44989],[18.92972,47.44951],[18.93221,47.44922],[18.93347,47.44932],[18.93921,47.44935],[18.94229,47.44903],[18.94549,47.4489],[18.94826,47.4487],[18.95003,47.44824],[18.9547,47.44722],[18.95749,47.44692],[18.95802,47.44715],[18.95844,47.44708],[18.95877,47.44666],[18.96145,47.4393],[18.96368,47.4358],[18.96598,47.43288],[18.96899,47.4297],[18.9701,47.42704],[18.97009,47.42679],[18.96695,47.4246],[18.95735,47.41842],[18.95676,47.4184],[18.95606,47.41813],[18.95385,47.41739],[18.95144,47.41665],[18.95131,47.41664],[18.9327,47.41703],[18.93257,47.41696],[18.93201,47.41674],[18.93149,47.4164],[18.93114,47.41612],[18.92123,47.41091],[18.91957,47.40987],[18.91927,47.40961],[18.91731,47.40854]]],terms_url:"http://www.torokbalint.hu/",terms_text:"Törökbálint",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",zoomExtent:[0,22],polygon:[[[1.192,43.63288],[1.20154,43.63297],[1.20111,43.65549],[1.2228,43.6557],[1.22262,43.66534],[1.22753,43.66538],[1.22754,43.66564],[1.23376,43.66569],[1.23376,43.66502],[1.23512,43.66503],[1.23509,43.66707],[1.24436,43.66716],[1.24416,43.67439],[1.2494,43.67443],[1.2494,43.67466],[1.25557,43.67472],[1.25557,43.67445],[1.25695,43.67447],[1.25688,43.67853],[1.28749,43.67883],[1.28708,43.70132],[1.30882,43.70146],[1.30865,43.71277],[1.33033,43.71295],[1.33002,43.73052],[1.33671,43.73058],[1.33673,43.73122],[1.37343,43.73105],[1.37358,43.72458],[1.46045,43.72529],[1.46078,43.7028],[1.48249,43.70295],[1.48298,43.66921],[1.50468,43.66936],[1.50484,43.65812],[1.52655,43.65827],[1.52669,43.64703],[1.54837,43.64716],[1.54854,43.63594],[1.57022,43.63608],[1.57051,43.61358],[1.54882,43.61343],[1.5491,43.59095],[1.57077,43.59107],[1.57094,43.57983],[1.57937,43.57989],[1.57948,43.57377],[1.58091,43.57378],[1.58109,43.55738],[1.57123,43.55731],[1.57165,43.52355],[1.39848,43.52226],[1.39865,43.51101],[1.3121,43.51025],[1.3119,43.52152],[1.29026,43.52131],[1.28986,43.54382],[1.31152,43.54401],[1.31133,43.55526],[1.30369,43.55519],[1.30361,43.55951],[1.29554,43.55943],[1.29554,43.55955],[1.28956,43.55945],[1.28929,43.57754],[1.26757,43.57736],[1.2674,43.58861],[1.25355,43.5885],[1.25338,43.59563],[1.2518,43.59563],[1.2518,43.59494],[1.23504,43.59478],[1.23504,43.5946],[1.22396,43.5946],[1.22394,43.59947],[1.21397,43.5993],[1.21388,43.60464],[1.20206,43.60448],[1.20195,43.61048],[1.19243,43.61037],[1.192,43.63288]]],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",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],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",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],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",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole"},{id:"Toulouse-Orthophotoplan-2017",name:"Toulouse - Orthophotoplan 2017",type:"wms",template:"https://wms.plan.toulouse.fr/geocache/wms?FORMAT=image/jpeg&VERSION=1.1.1&SERVICE=WMS&REQUEST=GetMap&LAYERS=ortho2017&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",zoomExtent:[0,22],polygon:[[[1.11351,43.68676],[1.13518,43.68708],[1.13489,43.69835],[1.17829,43.69903],[1.17799,43.71028],[1.19966,43.71061],[1.19934,43.72187],[1.24274,43.72253],[1.24243,43.73375],[1.26415,43.73409],[1.26383,43.74536],[1.28553,43.74565],[1.28525,43.75693],[1.30692,43.75723],[1.30664,43.76848],[1.32834,43.76879],[1.32808,43.78003],[1.43673,43.78158],[1.43731,43.7591],[1.45901,43.75937],[1.45933,43.74815],[1.48103,43.7484],[1.48133,43.73718],[1.50303,43.73741],[1.50359,43.71497],[1.52531,43.71518],[1.52561,43.70401],[1.54727,43.70426],[1.54757,43.69304],[1.5692,43.69329],[1.56957,43.68203],[1.5912,43.68227],[1.59174,43.6598],[1.61342,43.66003],[1.61372,43.64883],[1.63538,43.64908],[1.63841,43.51407],[1.29216,43.50947],[1.29186,43.5207],[1.27021,43.5204],[1.26988,43.53164],[1.24823,43.53133],[1.2476,43.55378],[1.22596,43.55349],[1.22568,43.56472],[1.20398,43.56442],[1.20331,43.5869],[1.18162,43.58656],[1.18102,43.60904],[1.15928,43.60869],[1.15896,43.61995],[1.13726,43.61962],[1.13659,43.64209],[1.11491,43.64176],[1.11351,43.68676]]],terms_url:"https://wiki.openstreetmap.org/wiki/Toulouse/ToulouseMetropoleData",terms_text:"ToulouseMetropole",best:true},{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",zoomExtent:[0,20],polygon:[[[0.54575,47.46526],[0.54585,47.46082],[0.53922,47.4607],[0.53935,47.45624],[0.5328,47.4561],[0.5329,47.45157],[0.52619,47.4514],[0.52659,47.44249],[0.50009,47.44207],[0.50024,47.43758],[0.4936,47.43743],[0.4937,47.43293],[0.46061,47.43246],[0.46072,47.42798],[0.4541,47.42781],[0.45493,47.40539],[0.46154,47.40545],[0.46191,47.39649],[0.46843,47.3966],[0.46913,47.37864],[0.47571,47.37876],[0.47621,47.3652],[0.48283,47.36535],[0.48296,47.36083],[0.47635,47.36074],[0.47665,47.35173],[0.47005,47.35162],[0.4702,47.34713],[0.46375,47.34701],[0.45714,47.34241],[0.45729,47.33791],[0.45067,47.33781],[0.45084,47.33331],[0.44422,47.3332],[0.44438,47.32871],[0.43114,47.3285],[0.43163,47.315],[0.43824,47.31511],[0.43838,47.31062],[0.47145,47.31114],[0.47131,47.31566],[0.47789,47.31575],[0.47807,47.31128],[0.48468,47.31136],[0.48486,47.30687],[0.49144,47.30698],[0.49174,47.29797],[0.48516,47.29787],[0.48543,47.28887],[0.47885,47.28877],[0.47916,47.27978],[0.48578,47.2799],[0.48591,47.27539],[0.49254,47.2755],[0.49267,47.27101],[0.4993,47.27111],[0.49943,47.26661],[0.51927,47.26692],[0.51942,47.26242],[0.52602,47.26252],[0.52587,47.26702],[0.5457,47.26734],[0.54555,47.27183],[0.55877,47.27204],[0.55863,47.27652],[0.56523,47.27663],[0.56508,47.28112],[0.57168,47.28123],[0.57152,47.28572],[0.57814,47.28583],[0.57799,47.29033],[0.5846,47.29043],[0.58431,47.29942],[0.5975,47.29961],[0.59766,47.29514],[0.65716,47.296],[0.6573,47.29151],[0.6705,47.29172],[0.67035,47.29621],[0.68362,47.29637],[0.68343,47.30089],[0.69006,47.30096],[0.68992,47.30547],[0.7362,47.30612],[0.73608,47.31061],[0.7559,47.31089],[0.75577,47.31539],[0.76238,47.31547],[0.76223,47.31999],[0.77549,47.32015],[0.77497,47.33882],[0.77458,47.35163],[0.76804,47.35159],[0.76759,47.36053],[0.77424,47.36062],[0.77335,47.39213],[0.76674,47.39202],[0.76644,47.40108],[0.77306,47.40111],[0.77289,47.41013],[0.76618,47.41002],[0.76603,47.4145],[0.75276,47.4143],[0.75298,47.40981],[0.74624,47.4097],[0.74594,47.42322],[0.73923,47.42315],[0.73887,47.43661],[0.73233,47.43652],[0.73219,47.44106],[0.7255,47.44098],[0.72542,47.44535],[0.73188,47.44548],[0.73185,47.45011],[0.73845,47.45023],[0.73831,47.45463],[0.74494,47.45474],[0.74432,47.4772],[0.73107,47.47697],[0.7309,47.48154],[0.71762,47.48126],[0.71779,47.47684],[0.69777,47.4765],[0.69805,47.47198],[0.69145,47.47189],[0.69173,47.46302],[0.6851,47.46293],[0.68494,47.46735],[0.67826,47.46733],[0.67798,47.47622],[0.67141,47.47616],[0.67104,47.4882],[0.65773,47.48797],[0.65782,47.48504],[0.65119,47.48483],[0.65147,47.47586],[0.64482,47.47572],[0.64493,47.47126],[0.6118,47.47075],[0.61188,47.46631],[0.60528,47.46612],[0.60542,47.46166],[0.59888,47.46155],[0.59902,47.45709],[0.57249,47.45669],[0.57218,47.46565],[0.54575,47.46526]]],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",zoomExtent:[0,22],polygon:[[[0.77512,47.32983],[0.77427,47.35617],[0.77053,47.35611],[0.77024,47.36512],[0.77398,47.36517],[0.7728,47.40148],[0.7904,47.40147],[0.78988,47.4103],[0.79117,47.41047],[0.79108,47.41942],[0.79392,47.41942],[0.79319,47.43733],[0.79834,47.43742],[0.79808,47.45544],[0.80044,47.45541],[0.80138,47.46426],[0.80074,47.46899],[0.79396,47.47331],[0.78405,47.47323],[0.78387,47.47871],[0.77606,47.47859],[0.77585,47.48204],[0.77066,47.48219],[0.77044,47.4859],[0.76096,47.49092],[0.75718,47.49092],[0.73753,47.50336],[0.7259,47.50588],[0.71113,47.50576],[0.70418,47.50408],[0.69109,47.50038],[0.69045,47.49718],[0.67757,47.49683],[0.67757,47.49353],[0.66427,47.49301],[0.6635,47.48953],[0.65088,47.48958],[0.65133,47.48032],[0.64734,47.4803],[0.64747,47.47852],[0.64474,47.47846],[0.64479,47.47575],[0.64238,47.47578],[0.64225,47.47302],[0.63835,47.47294],[0.63792,47.47131],[0.60513,47.47079],[0.60513,47.46632],[0.59852,47.46603],[0.59878,47.46156],[0.592,47.46156],[0.59226,47.45976],[0.58084,47.45971],[0.58007,47.46145],[0.57234,47.46139],[0.57222,47.46512],[0.55874,47.46489],[0.5466,47.46052],[0.53269,47.45355],[0.52677,47.45315],[0.52677,47.45152],[0.52231,47.45123],[0.52256,47.44804],[0.51977,47.44776],[0.52007,47.44247],[0.4975,47.4416],[0.49716,47.44049],[0.49355,47.44015],[0.49355,47.43573],[0.47943,47.43575],[0.46171,47.42819],[0.45643,47.42088],[0.45489,47.41229],[0.45506,47.40218],[0.46149,47.40193],[0.46167,47.39641],[0.46879,47.39602],[0.47016,47.35173],[0.45677,47.3515],[0.45729,47.34254],[0.43085,47.34196],[0.43196,47.30602],[0.47154,47.3067],[0.47257,47.28004],[0.48527,47.28004],[0.48578,47.27084],[0.49935,47.27107],[0.49917,47.26245],[0.55273,47.26304],[0.55222,47.27201],[0.56561,47.27224],[0.56526,47.28156],[0.59118,47.28156],[0.59067,47.29099],[0.66912,47.29169],[0.6832,47.29564],[0.6832,47.30077],[0.69658,47.30123],[0.69641,47.3024],[0.71006,47.30245],[0.72293,47.30589],[0.72285,47.31043],[0.74165,47.31084],[0.75426,47.31392],[0.7625,47.31815],[0.76207,47.32013],[0.76619,47.32009],[0.76956,47.32207],[0.77233,47.32508],[0.77336,47.3267],[0.77512,47.32983]]],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:"https://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",zoomExtent:[7,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],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",zoomExtent:[13,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],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=Vagnummer,Vaghinder,Rastplats,Rastficka,Hallplats,Farthinder,BroTunnel,ATK_Matplats&STYLES=&SRS={proj}&WIDTH={width}&HEIGHT={height}&BBOX={bbox}",projection:"EPSG:3857",zoomExtent:[3,20],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],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",zoomExtent:[15,19],polygon:[[[12.80182,55.19612],[14.22729,55.27286],[18.44604,56.69244],[19.74242,57.98481],[20.0061,59.5371],[19.08394,60.19308],[20.49499,63.2497],[24.25231,65.57437],[23.81835,67.92514],[23.23607,68.34655],[20.43456,69.17038],[18.08349,68.5644],[16.50145,67.88382],[14.43602,66.14275],[11.82128,63.30775],[12.20031,60.31063],[10.62377,58.5482],[12.64251,56.03062],[12.80182,55.19612]]],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://{switch:a,b,c,d}.tiles.mapbox.com/styles/v1/glassman/cjf4qjmps0tgv2qpahj977mvz/tiles/256/{zoom}/{x}/{y}?access_token=pk.eyJ1IjoiZ2xhc3NtYW4iLCJhIjoiRjk3dWdwYyJ9.Tg_fMJWxygeKBgVTrZHmGA",zoomExtent:[0,20],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]],description:"Highway: Green casing = unclassified. Brown casing = track. Surface: gravel = light brown fill, Asphalt = black, paved = gray, ground =white, concrete = blue, grass = green. Seasonal = white bars",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USForestService-overlay.png",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",zoomExtent:[0,19],polygon:[[[-124.76179,48.41301],[-124.60595,45.90245],[-124.99343,40.05576],[-122.53697,36.85661],[-119.97759,33.00641],[-117.67593,32.46302],[-114.86123,32.47999],[-111.00893,31.33601],[-108.19927,31.326],[-108.18711,31.77551],[-106.53072,31.78209],[-106.48421,31.74645],[-106.42932,31.75206],[-106.28689,31.56133],[-106.20525,31.4467],[-105.02053,30.5361],[-104.58819,29.69979],[-103.25189,28.89087],[-102.71736,29.39206],[-102.1514,29.74757],[-101.25529,29.48105],[-100.00624,28.00822],[-99.23511,26.4476],[-98.01091,25.9928],[-97.43502,25.8266],[-96.95553,25.98216],[-96.80617,27.79782],[-95.55633,28.58761],[-93.74053,29.47421],[-90.90285,28.85645],[-88.01567,28.99443],[-88.01625,30.00389],[-86.02775,30.00475],[-84.01879,28.99618],[-81.9972,25.98268],[-81.99666,25.01349],[-84.01656,25.01258],[-84.01601,24.00527],[-80.02,24.0071],[-79.89011,26.85507],[-80.02453,32.01613],[-75.41474,35.05319],[-74.02112,39.57279],[-72.00202,40.99125],[-69.87974,40.99205],[-69.84893,43.26199],[-66.94528,44.71049],[-67.75966,47.099],[-69.25051,47.51223],[-70.46149,46.21766],[-71.41227,45.25488],[-72.02225,45.00598],[-75.07988,44.98029],[-76.90231,43.80246],[-78.76239,43.62496],[-79.15798,43.44626],[-79.00601,42.80053],[-82.66248,41.68895],[-82.17616,43.58854],[-83.2814,46.13885],[-87.50645,48.01427],[-88.34922,48.29633],[-89.43531,47.98378],[-93.99811,49.00671],[-95.11054,49.412],[-96.01312,49.00605],[-123.32289,49.00429],[-123.22752,48.18499],[-124.76179,48.41301]],[[-160.57876,22.50629],[-160.57822,21.49846],[-158.74706,21.24398],[-157.50832,20.9958],[-155.99619,18.77902],[-154.62178,18.7587],[-154.68902,19.88057],[-156.29276,21.22259],[-157.50474,21.9985],[-159.00937,22.50702],[-160.57876,22.50629]],[[-167.15715,68.72197],[-164.8554,67.02551],[-168.0022,66.00175],[-169.00874,66.00155],[-169.00754,64.99877],[-172.51433,63.87673],[-173.8197,59.74014],[-162.50181,58.00058],[-160.0159,58.00124],[-160.01497,57.00003],[-160.50548,56.9999],[-165.80926,54.82485],[-178.0001,52.24465],[-177.9993,51.25543],[-171.46891,51.82153],[-162.40251,53.95666],[-159.00757,55.0025],[-158.01907,55.00278],[-151.99632,55.99919],[-151.50034,57.99879],[-151.50129,58.99198],[-138.516,58.99532],[-138.51505,57.99864],[-133.99482,54.00317],[-130.00444,54.00434],[-130.00708,57.00005],[-131.97588,56.99952],[-135.12299,59.7566],[-138.00718,59.9918],[-139.17159,60.41272],[-140.9874,61.01186],[-140.9684,69.95351],[-156.17689,71.56333],[-160.41363,70.73977],[-163.02183,69.97074],[-164.9717,68.99469],[-167.15715,68.72197]]]},{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",zoomExtent:[0,21],polygon:[[[8.45788,47.44582],[8.57392,47.44477],[8.57362,47.43124],[8.60266,47.43096],[8.60231,47.41746],[8.6318,47.41716],[8.6295,47.33628],[8.57162,47.33679],[8.57152,47.32292],[8.54236,47.3236],[8.54212,47.31013],[8.48418,47.31062],[8.48478,47.33762],[8.45582,47.33787],[8.45609,47.35135],[8.42713,47.35161],[8.42864,47.43259],[8.45745,47.43231],[8.45788,47.44582]]],terms_text:"Stadt Zürich Open Government Data"},{id:"UkraineKyiv2014DZK",name:"Ukraine - Kyiv 2014 (DZK)",type:"tms",template:"http://map.land.gov.ua/map/ortho_kiev/{zoom}/{x}/{-y}.jpg",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[30.30752,50.57184],[30.33155,50.57402],[30.37687,50.57925],[30.42288,50.58143],[30.4318,50.58579],[30.44416,50.58797],[30.45515,50.58754],[30.46545,50.58449],[30.46819,50.57751],[30.49085,50.57489],[30.51351,50.57489],[30.52519,50.57402],[30.55608,50.55221],[30.58424,50.53869],[30.5966,50.53781],[30.60896,50.5365],[30.64329,50.5352],[30.65496,50.53563],[30.65496,50.54305],[30.66045,50.54916],[30.66801,50.55439],[30.67762,50.55876],[30.68792,50.56137],[30.70783,50.55614],[30.71127,50.56356],[30.71127,50.57838],[30.72157,50.58231],[30.71882,50.58972],[30.72981,50.59103],[30.74011,50.58841],[30.76208,50.58536],[30.77306,50.58274],[30.78336,50.57795],[30.80259,50.57141],[30.81014,50.56617],[30.82182,50.55439],[30.82525,50.53956],[30.81701,50.53432],[30.79504,50.52909],[30.78474,50.52559],[30.76276,50.51992],[30.76208,50.5125],[30.75315,50.50769],[30.74354,50.50376],[30.73805,50.49721],[30.74629,50.49197],[30.75521,50.48847],[30.74835,50.48236],[30.75178,50.47537],[30.75315,50.46794],[30.74835,50.46138],[30.75178,50.45439],[30.78886,50.43646],[30.7971,50.43165],[30.80328,50.41765],[30.8225,50.40846],[30.82044,50.40102],[30.82319,50.39358],[30.81289,50.39095],[30.80122,50.39139],[30.78954,50.39314],[30.77787,50.3927],[30.77856,50.3857],[30.77169,50.38001],[30.76208,50.37519],[30.75109,50.37256],[30.73873,50.37256],[30.72775,50.37475],[30.71813,50.37957],[30.71539,50.36512],[30.71127,50.35855],[30.70577,50.35241],[30.69753,50.34716],[30.68586,50.34453],[30.65084,50.34058],[30.63848,50.34014],[30.62681,50.33795],[30.62887,50.3305],[30.64947,50.29279],[30.66663,50.28314],[30.67144,50.27656],[30.6632,50.27085],[30.65153,50.26997],[30.64535,50.27612],[30.63368,50.27787],[30.62132,50.27656],[30.61857,50.2691],[30.62956,50.25637],[30.6378,50.25154],[30.64535,50.23792],[30.64398,50.2309],[30.63917,50.22387],[30.62956,50.21992],[30.6069,50.2164],[30.59591,50.2186],[30.59042,50.23353],[30.5863,50.241],[30.57531,50.25505],[30.56501,50.25944],[30.5657,50.2669],[30.56432,50.29718],[30.56638,50.30463],[30.5657,50.31209],[30.55677,50.31691],[30.54441,50.31735],[30.52587,50.32699],[30.51489,50.3305],[30.50253,50.33182],[30.48055,50.33664],[30.47163,50.34146],[30.46957,50.34935],[30.47025,50.35679],[30.46201,50.36205],[30.4524,50.35679],[30.44004,50.35548],[30.43661,50.36512],[30.43111,50.37212],[30.43661,50.37826],[30.43455,50.3857],[30.40914,50.39883],[30.39678,50.40014],[30.3906,50.40671],[30.37069,50.41546],[30.36314,50.42159],[30.3597,50.42902],[30.3597,50.43646],[30.35696,50.44389],[30.3446,50.44477],[30.32056,50.44258],[30.29585,50.44477],[30.28349,50.44477],[30.27799,50.43864],[30.27525,50.43165],[30.26563,50.42771],[30.25396,50.42902],[30.24572,50.42377],[30.23542,50.42771],[30.2416,50.43427],[30.2416,50.44214],[30.23679,50.4487],[30.23885,50.45613],[30.24297,50.46313],[30.24915,50.46968],[30.25671,50.47493],[30.26083,50.48192],[30.26563,50.48847],[30.26907,50.49983],[30.26151,50.50595],[30.26357,50.51381],[30.26975,50.51992],[30.28898,50.52821],[30.29722,50.53345],[30.30271,50.54],[30.30203,50.54741],[30.30477,50.55483],[30.32743,50.55221],[30.33086,50.55919],[30.32262,50.56486],[30.31233,50.56835],[30.30752,50.57184]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"Ukraine-orto10000-2012",name:"Ukraine - Orthophotomaps 2012",type:"tms",template:"http://212.26.144.110/tile2/orto_10000/{zoom}/{x}/{-y}.jpg",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",zoomExtent:[0,16],polygon:[[[23.6193,51.65491],[24.09803,51.64047],[24.39723,51.89353],[25.19178,51.95913],[26.12263,51.92224],[26.49829,51.80933],[27.09005,51.77026],[27.62861,51.62603],[28.02422,51.59093],[28.28021,51.68172],[28.37662,51.5806],[28.82542,51.5682],[29.19111,51.64253],[29.41718,51.4399],[29.67316,51.51238],[29.82276,51.47512],[30.21837,51.50824],[30.54417,51.30709],[30.63726,51.38599],[30.51425,51.63634],[30.983,52.09005],[31.2822,52.07984],[31.48832,52.13497],[32.11,52.05531],[32.31279,52.11864],[32.43912,52.32434],[32.93114,52.28368],[33.29683,52.39337],[33.75561,52.35277],[34.35734,51.78055],[34.14457,51.76409],[34.05813,51.67965],[34.22103,51.47098],[34.25095,51.30085],[34.7197,51.19056],[35.11199,51.21139],[35.1818,51.08626],[35.38792,51.03402],[35.40787,50.62878],[35.62063,50.38563],[36.06944,50.4513],[36.21571,50.41106],[36.31212,50.28802],[36.4717,50.32624],[36.59138,50.2519],[37.46571,50.45977],[37.735,50.11353],[38.05747,49.9384],[38.19377,49.95765],[38.19045,50.07514],[38.35002,50.08154],[38.41651,49.98972],[38.73899,49.97476],[39.00827,49.83344],[39.14457,49.89987],[39.27755,49.78195],[39.54018,49.74544],[39.79949,49.58406],[40.18845,49.6013],[40.0588,49.50424],[40.20508,49.24666],[39.93247,49.06185],[39.71638,49.01608],[40.08872,48.85448],[39.79617,48.78443],[39.69311,48.65283],[39.86266,48.5693],[39.99231,48.31348],[39.83274,47.92287],[39.74297,47.83144],[39.57675,47.81135],[38.86532,47.85153],[38.77555,47.68618],[38.38327,47.60106],[38.30348,47.52704],[38.30016,47.23891],[38.13393,47.05577],[37.5455,47.05124],[37.31279,46.87654],[37.20973,46.92651],[36.96039,46.83107],[36.7443,46.61685],[36.72436,46.7719],[36.4451,46.72407],[36.10601,46.4728],[36.20574,46.66022],[35.92316,46.64424],[35.43114,46.39948],[35.10202,45.97138],[35.0455,45.75145],[35.47436,45.33],[35.86,45.53297],[35.9963,45.43274],[36.11598,45.51899],[36.66452,45.4514],[36.65454,45.34168],[36.50494,45.31363],[36.47502,45.24111],[36.48832,45.04884],[35.81013,44.98539],[35.5076,45.11222],[35.42782,44.93364],[35.12196,44.76394],[34.67649,44.75686],[33.985,44.37078],[33.68912,44.38504],[33.38327,44.50608],[33.35002,44.589],[33.55282,44.93128],[33.42981,45.1263],[33.19377,45.14271],[32.83141,45.33935],[32.60534,45.30896],[32.44577,45.3557],[32.50893,45.47005],[32.87795,45.68181],[33.57941,45.90665],[33.58938,46.02681],[33.25694,46.07065],[33.02422,45.97138],[31.61133,46.19506],[31.27555,46.61457],[30.87662,46.56887],[30.43446,45.98756],[29.69643,45.55159],[29.79284,45.46306],[29.73965,45.15913],[29.47369,45.41407],[29.18114,45.38373],[28.74896,45.22004],[28.56611,45.23409],[28.29018,45.33],[28.23367,45.49103],[28.31678,45.56789],[28.483,45.54228],[28.47303,45.73753],[28.95175,46.03143],[29.02489,46.18125],[28.9318,46.49569],[29.18779,46.57116],[29.59337,46.45448],[29.81944,46.46593],[29.95574,46.68759],[29.8959,46.8197],[29.56013,46.96963],[29.54683,47.29982],[29.14789,47.50234],[29.23101,47.77562],[29.17117,47.934],[28.86864,47.99411],[28.63593,48.16513],[28.44311,48.06525],[28.36332,48.17178],[28.25694,48.15404],[27.735,48.43494],[27.55547,48.45258],[26.92383,48.34884],[26.36532,48.17178],[26.1193,47.97408],[25.3846,47.91618],[24.91585,47.70408],[24.52024,47.94291],[24.18446,47.90058],[23.58274,48.00523],[23.43646,47.96963],[23.15388,48.10522],[23.07077,47.98743],[22.858,47.9585],[22.76824,48.09856],[22.58539,48.103],[22.51558,48.2161],[22.11332,48.4217],[22.49896,49.06621],[22.58872,49.11193],[22.87795,49.04006],[22.7217,49.18151],[22.71837,49.64652],[23.24364,50.105],[24.04484,50.49785],[24.05813,50.68779],[23.9451,50.81399],[24.10135,50.85388],[23.62928,51.29462],[23.6193,51.65491]]],description:"Works only from within Ukraine or with an Ukrainian proxy server."},{id:"uniao_dos_palmares",name:"União dos Palmares AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.97725,-9.20752],[-35.9772,-9.19398],[-35.97694,-9.19053],[-35.97678,-9.18607],[-35.97702,-9.18208],[-35.97704,-9.17968],[-35.97682,-9.17734],[-35.97664,-9.17517],[-35.97701,-9.17518],[-35.97696,-9.1707],[-35.97674,-9.17066],[-35.97661,-9.16645],[-35.97618,-9.16222],[-35.9761,-9.16026],[-35.97661,-9.16026],[-35.97672,-9.14608],[-35.97654,-9.14122],[-35.97666,-9.1332],[-35.97653,-9.12184],[-35.97648,-9.11748],[-35.98618,-9.11755],[-35.98947,-9.11733],[-36.00561,-9.11733],[-36.01859,-9.11736],[-36.04601,-9.11722],[-36.06734,-9.11698],[-36.06756,-9.16134],[-36.06771,-9.16405],[-36.06745,-9.16408],[-36.06756,-9.16657],[-36.06777,-9.16654],[-36.06798,-9.20701],[-36.0498,-9.20711],[-36.04671,-9.20698],[-36.02941,-9.20709],[-36.01355,-9.20718],[-35.99318,-9.20733],[-35.97725,-9.20752]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{id:"URBIS2009",name:"URBIS 2009 aerial imagery",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:Ortho2009&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2009-01-01T00:00:00.000Z",startDate:"2009-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2012",name:"URBIS 2012 aerial imagery",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:Ortho2012&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2012-01-01T00:00:00.000Z",startDate:"2012-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2014",name:"URBIS 2014 aerial imagery",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:Ortho2014&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2014-01-01T00:00:00.000Z",startDate:"2014-01-01T00:00:00.000Z",polygon:[[[4.4001,50.76373],[4.43093,50.77254],[4.43586,50.77237],[4.46549,50.78373],[4.48189,50.78835],[4.48269,50.79849],[4.46363,50.80686],[4.46407,50.81546],[4.48204,50.81699],[4.48103,50.82343],[4.47465,50.83505],[4.47403,50.84587],[4.46712,50.85447],[4.45257,50.85797],[4.45017,50.86151],[4.42968,50.86764],[4.43423,50.87384],[4.44147,50.87513],[4.44381,50.88004],[4.43534,50.88977],[4.43968,50.89475],[4.43287,50.90363],[4.42096,50.90917],[4.42023,50.91387],[4.38315,50.91381],[4.37879,50.90637],[4.37334,50.90289],[4.36241,50.906],[4.34824,50.90611],[4.33955,50.90685],[4.32771,50.90515],[4.31471,50.89842],[4.30413,50.89498],[4.2871,50.89192],[4.28725,50.88532],[4.29293,50.88265],[4.27948,50.8736],[4.27347,50.86822],[4.27364,50.85871],[4.27688,50.85575],[4.27644,50.84376],[4.26664,50.8405],[4.25488,50.83992],[4.24755,50.83453],[4.24799,50.82866],[4.24357,50.82599],[4.24376,50.81356],[4.25233,50.81268],[4.25649,50.80711],[4.27025,50.8073],[4.27222,50.80537],[4.28414,50.80241],[4.28885,50.80434],[4.29544,50.8043],[4.30046,50.79506],[4.31076,50.79299],[4.31444,50.78372],[4.32628,50.77221],[4.34194,50.76891],[4.34474,50.77029],[4.37535,50.76577],[4.3755,50.76381],[4.4001,50.76373]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBIS2015",name:"URBIS 2015 aerial imagery",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:Ortho2015&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2015-01-01T00:00:00.000Z",startDate:"2015-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{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.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{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.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"UrbISOrtho2018",name:"UrbIS-Ortho 2018",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:Ortho2018&WIDTH={width}&HEIGHT={height}&CRS={proj}&STYLES=&BBOX={bbox}",projection:"EPSG:3857",endDate:"2018-01-01T00:00:00.000Z",startDate:"2018-01-01T00:00:00.000Z",polygon:[[[4.37973,50.76382],[4.38917,50.76377],[4.43028,50.77517],[4.435,50.775],[4.46427,50.78645],[4.4817,50.79134],[4.48238,50.79617],[4.45921,50.80626],[4.45947,50.81661],[4.47972,50.82036],[4.46959,50.83537],[4.46899,50.84573],[4.46238,50.85396],[4.44968,50.85591],[4.44599,50.85992],[4.4253,50.86615],[4.43183,50.87628],[4.44007,50.87845],[4.43106,50.89014],[4.43595,50.89502],[4.4296,50.90103],[4.41655,50.90757],[4.41543,50.91342],[4.39578,50.91407],[4.38462,50.91093],[4.38119,50.90319],[4.3726,50.90032],[4.36213,50.9033],[4.34857,50.90341],[4.34025,50.90411],[4.32892,50.90249],[4.31647,50.89605],[4.30634,50.89274],[4.29004,50.88982],[4.29149,50.88495],[4.29553,50.88262],[4.29561,50.88094],[4.28274,50.87227],[4.27699,50.86713],[4.27802,50.85911],[4.28042,50.85721],[4.28094,50.84215],[4.27193,50.84036],[4.25467,50.83695],[4.25107,50.83288],[4.25227,50.82697],[4.24343,50.82182],[4.24403,50.81548],[4.25519,50.8151],[4.25802,50.80935],[4.27218,50.81011],[4.27579,50.80696],[4.2854,50.80506],[4.28901,50.80691],[4.29802,50.80593],[4.30282,50.79709],[4.31458,50.79454],[4.31621,50.78624],[4.32952,50.77381],[4.34205,50.77164],[4.34522,50.77337],[4.37853,50.76811],[4.37973,50.76382]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",best:true,icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{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.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{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.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISfr2013",name:"URBISfr numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisFR/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"URBISnl2013",name:"URBISnl numerical imagery (2013)",type:"wms",template:"https://gis.irisnet.be/arcgis/rest/services/basemap/urbisNL/MapServer/export?f=image&format=png8&transparent=False&SRS={proj}&bboxSR=3857&imageSR=3857&bbox={bbox}&size={width},{height}",projection:"EPSG:3857",endDate:"2013-01-01T00:00:00.000Z",startDate:"2013-01-01T00:00:00.000Z",polygon:[[[4.4347,50.77647],[4.45427,50.78367],[4.4635,50.78798],[4.48273,50.79313],[4.44715,50.80821],[4.44831,50.81147],[4.45788,50.81646],[4.45466,50.81838],[4.4768,50.82036],[4.46552,50.83549],[4.46835,50.83744],[4.46037,50.85218],[4.44578,50.85522],[4.44466,50.85809],[4.43891,50.86042],[4.43719,50.85868],[4.42612,50.86296],[4.42037,50.86789],[4.42973,50.87764],[4.43736,50.87867],[4.42681,50.89026],[4.43307,50.89464],[4.42277,50.90298],[4.41187,50.90753],[4.41376,50.91159],[4.4032,50.91381],[4.38758,50.9098],[4.37771,50.89713],[4.36303,50.90119],[4.34183,50.9026],[4.33093,50.90119],[4.31651,50.89389],[4.3057,50.8908],[4.29334,50.88847],[4.29428,50.88658],[4.29737,50.8849],[4.29918,50.87975],[4.28587,50.87201],[4.27858,50.86556],[4.28064,50.85944],[4.28999,50.85625],[4.28304,50.85354],[4.28793,50.84833],[4.28291,50.8479],[4.28158,50.83785],[4.27399,50.8392],[4.27184,50.8363],[4.25793,50.83571],[4.2545,50.83289],[4.25523,50.82839],[4.2509,50.82419],[4.24382,50.81928],[4.2566,50.81743],[4.25995,50.81106],[4.27274,50.81212],[4.2757,50.81087],[4.27708,50.80835],[4.28454,50.80732],[4.29274,50.80911],[4.2951,50.80881],[4.30162,50.81299],[4.3066,50.81239],[4.30205,50.80445],[4.30501,50.7987],[4.31527,50.79661],[4.31845,50.79403],[4.3193,50.78722],[4.32201,50.7832],[4.33089,50.7758],[4.3408,50.77354],[4.34677,50.77574],[4.3551,50.77354],[4.36527,50.77284],[4.38243,50.76917],[4.38303,50.76375],[4.43312,50.77802],[4.4347,50.77647]]],terms_text:"Realized by means of Brussels UrbIS®© - Distribution & Copyright CIRB",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/be/URBIS2015aerialimagery.png"},{id:"USGS-Imagery",name:"USGS Imagery",type:"tms",template:"https://ags-proxy.openstreetmap.us/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fbasemap.nationalmap.gov%2Farcgis%2Frest%2Fservices%2FUSGSImageryOnly%2FMapServer",zoomExtent:[12,20],polygon:[[[-123.25493,48.7529],[-123.25493,48.55923],[-123.19222,48.55923],[-123.19222,48.43484],[-122.94196,48.43484],[-122.94196,48.37208],[-122.88062,48.37208],[-122.88062,48.30948],[-122.81676,48.30948],[-122.81676,48.19046],[-123.00411,48.19046],[-123.00411,48.12759],[-123.05842,48.12759],[-123.05842,48.19051],[-123.25411,48.19051],[-123.25411,48.1275],[-123.37066,48.1275],[-123.37066,48.19084],[-124.05826,48.19084],[-124.05826,48.25344],[-124.18152,48.25344],[-124.18152,48.31647],[-124.43191,48.31647],[-124.43191,48.37826],[-124.55646,48.37826],[-124.55646,48.44083],[-124.75551,48.44083],[-124.75551,48.1915],[-124.81853,48.1915],[-124.81853,48.12284],[-124.7553,48.12284],[-124.7553,47.55353],[-124.38121,47.55353],[-124.38121,47.12187],[-124.19289,47.12187],[-124.19289,43.75694],[-124.44434,43.75694],[-124.44434,43.14256],[-124.63989,43.14256],[-124.63989,42.61945],[-124.44385,42.61945],[-124.44385,39.80807],[-123.88157,39.80807],[-123.88157,39.11028],[-123.75805,39.11028],[-123.75805,38.49688],[-123.27028,38.49688],[-123.27028,37.93319],[-122.81481,37.93319],[-122.81481,37.80196],[-122.56643,37.80196],[-122.56643,36.93196],[-121.8784,36.93196],[-121.8784,36.68976],[-122.00347,36.68976],[-122.00347,36.43411],[-121.94142,36.43411],[-121.94142,35.92976],[-121.5041,35.92976],[-121.5041,35.81003],[-121.37903,35.81003],[-121.37903,35.42392],[-120.94265,35.42392],[-120.94265,35.18497],[-120.8172,35.18497],[-120.8172,35.12199],[-120.69184,35.12199],[-120.69184,34.49668],[-120.50459,34.49668],[-120.50459,34.43397],[-120.00788,34.43397],[-120.00788,34.36826],[-119.52835,34.36826],[-119.52835,34.05764],[-119.0061,34.05764],[-119.0061,33.99753],[-118.50463,33.99753],[-118.50463,33.86946],[-118.44132,33.86946],[-118.44132,33.68653],[-118.06691,33.68653],[-118.06691,33.30638],[-117.503,33.30638],[-117.503,33.05003],[-117.31882,33.05003],[-117.31882,32.62059],[-117.1917,32.62059],[-117.1917,32.49746],[-116.7465,32.49746],[-116.7465,32.56092],[-115.99701,32.56092],[-115.99701,32.62649],[-114.88081,32.62649],[-114.88081,32.43408],[-114.62945,32.43408],[-114.62945,32.37316],[-114.44474,32.37316],[-114.44474,32.30754],[-114.25576,32.30754],[-114.25576,32.24446],[-114.06803,32.24446],[-114.06803,32.18291],[-113.81665,32.18291],[-113.81665,32.12076],[-113.63074,32.12076],[-113.63074,32.05651],[-113.44175,32.05651],[-113.44175,31.99844],[-113.2546,31.99844],[-113.2546,31.93254],[-113.06807,31.93254],[-113.06807,31.87181],[-112.81611,31.87181],[-112.81611,31.81042],[-112.63088,31.81042],[-112.63088,31.74647],[-112.44189,31.74647],[-112.44189,31.6856],[-112.25719,31.6856],[-112.25719,31.62104],[-112.00338,31.62104],[-112.00338,31.55958],[-111.81562,31.55958],[-111.81562,31.49702],[-111.62786,31.49702],[-111.62786,31.43399],[-111.4419,31.43399],[-111.4419,31.37339],[-111.25597,31.37339],[-111.25597,31.31132],[-108.18458,31.31132],[-108.18458,31.74595],[-106.50651,31.74595],[-106.50651,31.68423],[-106.37973,31.68423],[-106.37973,31.62175],[-106.31743,31.62175],[-106.31743,31.49682],[-106.25518,31.49682],[-106.25518,31.43449],[-106.19247,31.43449],[-106.19247,31.37213],[-106.00392,31.37213],[-106.00392,31.30933],[-105.94166,31.30933],[-105.94166,31.24575],[-105.87982,31.24575],[-105.87982,31.18362],[-105.81623,31.18362],[-105.81623,31.12072],[-105.69212,31.12072],[-105.69212,31.05848],[-105.63029,31.05848],[-105.63029,30.93283],[-105.50444,30.93283],[-105.50444,30.87159],[-105.4413,30.87159],[-105.4413,30.80846],[-105.37815,30.80846],[-105.37815,30.74718],[-105.19047,30.74718],[-105.19047,30.68432],[-105.12862,30.68432],[-105.12862,30.61997],[-105.00365,30.61997],[-105.00365,30.55891],[-104.9418,30.55891],[-104.9418,30.49632],[-104.8782,30.49632],[-104.8782,30.30983],[-104.81553,30.30983],[-104.81553,30.24783],[-104.75361,30.24783],[-104.75361,29.93539],[-104.69095,29.93539],[-104.69095,29.80902],[-104.62913,29.80902],[-104.62913,29.68436],[-104.56599,29.68436],[-104.56599,29.62235],[-104.50372,29.62235],[-104.50372,29.55954],[-104.44101,29.55954],[-104.44101,29.49748],[-104.25376,29.49748],[-104.25376,29.37167],[-104.1292,29.37167],[-104.1292,29.30916],[-104.06887,29.30916],[-104.06887,29.24673],[-103.81873,29.24673],[-103.81873,29.18431],[-103.75574,29.18431],[-103.75574,29.12232],[-103.56675,29.12232],[-103.56675,29.05981],[-103.50498,29.05981],[-103.50498,28.99675],[-103.31658,28.99675],[-103.31658,28.93469],[-103.05976,28.93469],[-103.05976,29.0593],[-102.99797,29.0593],[-102.99797,29.12129],[-102.93314,29.12129],[-102.93314,29.18486],[-102.8096,29.18486],[-102.8096,29.25262],[-102.87013,29.25262],[-102.87013,29.3081],[-102.80967,29.3081],[-102.80967,29.37155],[-102.74757,29.37155],[-102.74757,29.55819],[-102.68455,29.55819],[-102.68455,29.68477],[-102.49678,29.68477],[-102.49678,29.74577],[-102.30866,29.74577],[-102.30866,29.80866],[-102.19093,29.80866],[-102.19093,29.74601],[-101.50499,29.74601],[-101.50499,29.68468],[-101.38058,29.68468],[-101.38058,29.55945],[-101.31751,29.55945],[-101.31751,29.49589],[-101.19101,29.49589],[-101.19101,29.43261],[-101.0675,29.43261],[-101.0675,29.30881],[-100.94189,29.30881],[-100.94189,29.24562],[-100.81673,29.24562],[-100.81673,29.11904],[-100.75227,29.11904],[-100.75227,29.05782],[-100.69254,29.05782],[-100.69254,28.87204],[-100.62902,28.87204],[-100.62902,28.80954],[-100.56799,28.80954],[-100.56799,28.62255],[-100.50404,28.62255],[-100.50404,28.55838],[-100.44218,28.55838],[-100.44218,28.49683],[-100.37943,28.49683],[-100.37943,28.30929],[-100.31719,28.30929],[-100.31719,28.18357],[-100.25448,28.18357],[-100.25448,28.12139],[-100.12823,28.12139],[-100.12823,28.05921],[-100.06595,28.05921],[-100.06595,27.99661],[-100.00239,27.99661],[-100.00239,27.93322],[-99.94265,27.93322],[-99.94265,27.74547],[-99.81685,27.74547],[-99.81685,27.68343],[-99.75413,27.68343],[-99.75413,27.62215],[-99.62916,27.62215],[-99.62916,27.5589],[-99.56728,27.5589],[-99.56728,27.43538],[-99.50418,27.43538],[-99.50418,27.3774],[-99.56718,27.3774],[-99.56718,27.24637],[-99.50498,27.24637],[-99.50498,26.99656],[-99.44274,26.99656],[-99.44274,26.8728],[-99.38006,26.8728],[-99.38006,26.80682],[-99.31907,26.80682],[-99.31907,26.74736],[-99.25375,26.74736],[-99.25375,26.62101],[-99.19106,26.62101],[-99.19106,26.49567],[-99.13006,26.49567],[-99.13006,26.37138],[-99.00295,26.37138],[-99.00295,26.30938],[-98.81657,26.30938],[-98.81657,26.24578],[-98.69201,26.24578],[-98.69201,26.18371],[-98.44409,26.18371],[-98.44409,26.12172],[-98.38232,26.12172],[-98.38232,26.05965],[-98.25327,26.05965],[-98.25327,25.99869],[-98.01091,25.99869],[-98.01091,25.99323],[-97.69323,25.99323],[-97.69323,25.93341],[-97.63139,25.93341],[-97.63139,25.86959],[-97.50468,25.86959],[-97.50468,25.80735],[-97.30834,25.80735],[-97.30834,25.87312],[-97.24563,25.87312],[-97.24563,25.93537],[-97.11389,25.93537],[-97.11389,27.68092],[-97.0571,27.68092],[-97.0571,27.81082],[-95.58108,27.81082],[-95.58108,28.74688],[-94.27104,28.74688],[-94.27104,29.55941],[-92.50299,29.55941],[-92.50299,29.49748],[-91.87762,29.49748],[-91.87762,29.3727],[-91.37842,29.3727],[-91.37842,29.24683],[-91.3154,29.24683],[-91.3154,29.18443],[-91.12947,29.18443],[-91.12947,29.12326],[-91.00526,29.12326],[-91.00526,28.99684],[-89.45002,28.99684],[-89.45002,28.86774],[-88.81043,28.86774],[-88.81043,30.18419],[-85.87915,30.18419],[-85.87915,29.5455],[-84.83681,29.5455],[-84.83681,29.62252],[-84.74828,29.62252],[-84.74828,29.68362],[-84.68589,29.68362],[-84.68589,29.74684],[-83.6297,29.74684],[-83.6297,29.43244],[-83.31749,29.43244],[-83.31749,29.05794],[-82.87966,29.05794],[-82.87966,27.74535],[-82.81828,27.74535],[-82.81828,26.92909],[-82.37968,26.92909],[-82.37968,26.36942],[-81.87771,26.36942],[-81.87771,25.80597],[-81.50369,25.80597],[-81.50369,25.74748],[-81.44055,25.74748],[-81.44055,25.68515],[-81.31559,25.68515],[-81.31559,25.5601],[-81.25385,25.5601],[-81.25385,25.43424],[-81.1902,25.43424],[-81.1902,25.12343],[-81.12881,25.12343],[-81.12881,25.06194],[-81.06492,25.06194],[-81.06492,24.81578],[-81.62895,24.81578],[-81.62895,24.75384],[-81.69072,24.75384],[-81.69072,24.68994],[-81.81732,24.68994],[-81.81732,24.62792],[-82.191,24.62792],[-82.191,24.49629],[-81.62166,24.49629],[-81.62166,24.55948],[-81.37201,24.55948],[-81.37201,24.62207],[-81.05933,24.62207],[-81.05933,24.68483],[-80.93471,24.68483],[-80.93471,24.74748],[-80.74711,24.74748],[-80.74711,24.81006],[-80.36299,24.81006],[-80.36299,25.11759],[-80.12234,25.11759],[-80.12234,25.74724],[-80.05885,25.74724],[-80.05885,26.37083],[-79.99584,26.37083],[-79.99584,26.9398],[-80.05873,26.9398],[-80.05873,27.12775],[-80.12263,27.12775],[-80.12263,27.25343],[-80.1847,27.25343],[-80.1847,27.37812],[-80.24617,27.37812],[-80.24617,27.56587],[-80.30948,27.56587],[-80.30948,27.75303],[-80.37215,27.75303],[-80.37215,27.87745],[-80.43515,27.87745],[-80.43515,28.00334],[-80.49661,28.00334],[-80.49661,28.12773],[-80.55872,28.12773],[-80.55872,28.37235],[-80.49663,28.37235],[-80.49663,29.51603],[-81.12136,29.51603],[-81.12136,31.6847],[-80.60187,31.6847],[-80.60187,32.24753],[-79.4921,32.24753],[-79.4921,32.99703],[-79.11165,32.99703],[-79.11165,33.37295],[-78.61536,33.37295],[-78.61536,33.80976],[-77.9317,33.80976],[-77.9317,33.87182],[-77.86923,33.87182],[-77.86923,34.05525],[-77.68264,34.05525],[-77.68264,34.29746],[-77.24535,34.29746],[-77.24535,34.55986],[-76.49733,34.55986],[-76.49733,34.6228],[-76.43376,34.6228],[-76.43376,34.68493],[-76.37321,34.68493],[-76.37321,34.74677],[-76.30594,34.74677],[-76.30594,34.80855],[-76.2468,34.80855],[-76.2468,34.87284],[-76.18259,34.87284],[-76.18259,34.93353],[-76.12081,34.93353],[-76.12081,34.99524],[-75.9979,34.99524],[-75.9979,35.05782],[-75.87034,35.05782],[-75.87034,35.12191],[-75.74622,35.12191],[-75.74622,35.18189],[-75.49297,35.18189],[-75.49297,35.3083],[-75.43257,35.3083],[-75.43257,35.75425],[-75.49699,35.75425],[-75.49699,37.81056],[-75.3083,37.81056],[-75.3083,37.87201],[-75.2456,37.87201],[-75.2456,37.99548],[-75.18288,37.99548],[-75.18288,38.05851],[-75.11848,38.05851],[-75.11848,38.24691],[-75.05921,38.24691],[-75.05921,38.37043],[-74.99481,38.37043],[-74.99481,38.87184],[-74.48783,38.87184],[-74.48783,39.30894],[-74.17663,39.30894],[-74.17663,39.62247],[-74.0567,39.62247],[-74.0567,39.93318],[-73.9959,39.93318],[-73.9959,40.18549],[-73.93416,40.18549],[-73.93416,40.49595],[-73.8723,40.49595],[-73.8723,40.55271],[-71.80745,40.55271],[-71.80745,41.3088],[-70.88251,41.3088],[-70.88251,41.18498],[-70.74619,41.18498],[-70.74619,41.30919],[-70.43376,41.30919],[-70.43376,41.49639],[-69.93343,41.49639],[-69.93343,41.62308],[-69.86986,41.62308],[-69.86986,41.87769],[-69.93579,41.87769],[-69.93579,42.00323],[-69.99758,42.00323],[-69.99758,42.06502],[-70.06061,42.06502],[-70.06061,42.12943],[-70.55729,42.12943],[-70.55729,43.24871],[-70.49741,43.24871],[-70.49741,43.30922],[-70.37042,43.30922],[-70.37042,43.37196],[-70.30857,43.37196],[-70.30857,43.49699],[-70.18392,43.49699],[-70.18392,43.62235],[-70.05758,43.62235],[-70.05758,43.68502],[-69.74552,43.68502],[-69.74552,43.74766],[-69.24728,43.74766],[-69.24728,43.8107],[-69.05607,43.8107],[-69.05607,43.87172],[-68.99505,43.87172],[-68.99505,43.9982],[-68.49637,43.9982],[-68.49637,44.05974],[-68.3081,44.05974],[-68.3081,44.12214],[-68.18518,44.12214],[-68.18518,44.30814],[-67.9956,44.30814],[-67.9956,44.37275],[-67.8103,44.37275],[-67.8103,44.43518],[-67.49653,44.43518],[-67.49653,44.49688],[-67.37102,44.49688],[-67.37102,44.56006],[-67.18488,44.56006],[-67.18488,44.62133],[-67.12212,44.62133],[-67.12212,44.68679],[-67.05936,44.68679],[-67.05936,44.74737],[-66.93111,44.74737],[-66.93111,44.94066],[-66.99468,44.94066],[-66.99468,45.00245],[-67.05958,45.00245],[-67.05958,45.12734],[-67.1202,45.12734],[-67.1202,45.19101],[-67.24698,45.19101],[-67.24698,45.25344],[-67.31775,45.25344],[-67.31775,45.18984],[-67.37075,45.18984],[-67.37075,45.2534],[-67.43269,45.2534],[-67.43269,45.30834],[-67.37086,45.30834],[-67.37086,45.4397],[-67.43056,45.4397],[-67.43056,45.49501],[-67.37099,45.49501],[-67.37099,45.62645],[-67.6215,45.62645],[-67.6215,45.68961],[-67.68383,45.68961],[-67.68383,45.75326],[-67.74621,45.75326],[-67.74621,47.12682],[-67.87001,47.12682],[-67.87001,47.19003],[-67.93238,47.19003],[-67.93238,47.25397],[-67.99594,47.25397],[-67.99594,47.31497],[-68.12067,47.31497],[-68.12067,47.37808],[-68.44232,47.37808],[-68.44232,47.31661],[-68.63143,47.31661],[-68.63143,47.25447],[-68.9978,47.25447],[-68.9978,47.43989],[-69.06072,47.43989],[-69.06072,47.50476],[-69.25381,47.50476],[-69.25381,47.43981],[-69.31793,47.43981],[-69.31793,47.3786],[-69.44385,47.3786],[-69.44385,47.31563],[-69.50382,47.31563],[-69.50382,47.25258],[-69.56678,47.25258],[-69.56678,47.19109],[-69.63035,47.19109],[-69.63035,47.1287],[-69.69331,47.1287],[-69.69331,47.06543],[-69.75571,47.06543],[-69.75571,47.00428],[-69.81804,47.00428],[-69.81804,46.94153],[-69.8804,46.94153],[-69.8804,46.87925],[-69.94217,46.87925],[-69.94217,46.81774],[-70.00631,46.81774],[-70.00631,46.69203],[-70.07043,46.69203],[-70.07043,46.44259],[-70.19459,46.44259],[-70.19459,46.37859],[-70.2562,46.37859],[-70.2562,46.31526],[-70.32037,46.31526],[-70.32037,46.06512],[-70.3815,46.06512],[-70.3815,45.93552],[-70.32016,45.93552],[-70.32016,45.87948],[-70.44931,45.87948],[-70.44931,45.75387],[-70.507,45.75387],[-70.507,45.69169],[-70.63166,45.69169],[-70.63166,45.62916],[-70.75755,45.62916],[-70.75755,45.44147],[-70.88099,45.44147],[-70.88099,45.37806],[-71.13328,45.37806],[-71.13328,45.31515],[-71.38303,45.31515],[-71.38303,45.25342],[-71.50764,45.25342],[-71.50764,45.06557],[-73.94189,45.06557],[-73.94189,45.00312],[-74.74697,45.00312],[-74.74697,45.0649],[-74.8801,45.0649],[-74.8801,45.0029],[-75.06625,45.0029],[-75.06625,44.94152],[-75.25394,44.94152],[-75.25394,44.8776],[-75.37896,44.8776],[-75.37896,44.81535],[-75.44313,44.81535],[-75.44313,44.75361],[-75.56666,44.75361],[-75.56666,44.69099],[-75.62902,44.69099],[-75.62902,44.6285],[-75.75405,44.6285],[-75.75405,44.56638],[-75.81731,44.56638],[-75.81731,44.50289],[-75.87995,44.50289],[-75.87995,44.37849],[-76.13003,44.37849],[-76.13003,44.31592],[-76.1927,44.31592],[-76.1927,44.25344],[-76.31826,44.25344],[-76.31826,44.19167],[-76.3793,44.19167],[-76.3793,44.06537],[-76.44276,44.06537],[-76.44276,43.99638],[-76.31703,43.99638],[-76.31703,43.94146],[-76.50766,43.94146],[-76.50766,43.87233],[-76.383,43.87233],[-76.383,43.80919],[-76.25341,43.80919],[-76.25341,43.56652],[-76.50648,43.56652],[-76.50648,43.50339],[-76.63312,43.50339],[-76.63312,43.44323],[-76.69511,43.44323],[-76.69511,43.37869],[-76.81778,43.37869],[-76.81778,43.31807],[-77.682,43.31807],[-77.682,43.37894],[-78.05659,43.37894],[-78.05659,43.43969],[-78.43897,43.43969],[-78.43897,43.37944],[-78.88034,43.37944],[-78.88034,43.31497],[-79.12989,43.31497],[-79.12989,43.24293],[-79.06696,43.24293],[-79.06696,43.12999],[-79.12989,43.12999],[-79.12989,43.05773],[-79.07126,43.05773],[-79.07126,42.92949],[-78.94326,42.92949],[-78.94326,42.75422],[-79.06944,42.75422],[-79.06944,42.69416],[-79.13344,42.69416],[-79.13344,42.6297],[-79.19475,42.6297],[-79.19475,42.56635],[-79.37868,42.56635],[-79.37868,42.50334],[-79.4443,42.50334],[-79.4443,42.44106],[-79.56799,42.44106],[-79.56799,42.37753],[-79.69062,42.37753],[-79.69062,42.31711],[-79.81646,42.31711],[-79.81646,42.25345],[-80.00524,42.25345],[-80.00524,42.19092],[-80.19168,42.19092],[-80.19168,42.12726],[-80.3168,42.12726],[-80.3168,42.06699],[-80.50632,42.06699],[-80.50632,42.00343],[-80.69305,42.00343],[-80.69305,41.94151],[-80.94404,41.94151],[-80.94404,41.87812],[-81.19427,41.87812],[-81.19427,41.81665],[-81.31901,41.81665],[-81.31901,41.75455],[-81.44184,41.75455],[-81.44184,41.69096],[-81.50535,41.69096],[-81.50535,41.63016],[-82.74701,41.63016],[-82.74701,41.75369],[-82.88391,41.75369],[-82.88391,41.56561],[-82.99572,41.56561],[-82.99572,41.62704],[-83.12578,41.62704],[-83.12578,41.68784],[-83.24747,41.68784],[-83.24747,41.75369],[-83.37373,41.75369],[-83.37373,41.80928],[-83.3106,41.80928],[-83.3106,41.87161],[-83.24747,41.87161],[-83.24747,41.93614],[-83.18434,41.93614],[-83.18434,41.99609],[-83.12077,41.99609],[-83.12077,42.24648],[-83.05892,42.24648],[-83.05892,42.30896],[-82.86853,42.30896],[-82.86853,42.37177],[-82.80722,42.37177],[-82.80722,42.55855],[-82.75537,42.55855],[-82.75537,42.49549],[-82.5599,42.49549],[-82.5599,42.55855],[-82.49678,42.55855],[-82.49678,42.68336],[-82.43289,42.68336],[-82.43289,42.93422],[-82.37006,42.93422],[-82.37006,43.06481],[-82.43289,43.06481],[-82.43289,43.19176],[-82.49475,43.19176],[-82.49475,43.50346],[-82.55713,43.50346],[-82.55713,43.81609],[-82.61979,43.81609],[-82.61979,43.94221],[-82.68395,43.94221],[-82.68395,44.00226],[-82.74653,44.00226],[-82.74653,44.06705],[-82.87087,44.06705],[-82.87087,44.12919],[-83.00852,44.12919],[-83.00852,44.06648],[-83.13361,44.06648],[-83.13361,44.00539],[-83.24145,44.00539],[-83.24145,44.9962],[-83.18061,44.9962],[-83.18061,45.0673],[-83.24552,45.0673],[-83.24552,45.12874],[-83.30659,45.12874],[-83.30659,45.25515],[-83.37061,45.25515],[-83.37061,45.31659],[-83.43256,45.31659],[-83.43256,45.37921],[-83.61784,45.37921],[-83.61784,45.44197],[-83.80843,45.44197],[-83.80843,45.50362],[-84.05507,45.50362],[-84.05507,45.56479],[-84.12352,45.56479],[-84.12352,45.62878],[-84.18075,45.62878],[-84.18075,45.69147],[-84.31116,45.69147],[-84.31116,45.93371],[-83.821,45.93371],[-83.821,45.87251],[-83.49681,45.87251],[-83.49681,45.93371],[-83.43381,45.93371],[-83.43381,46.00169],[-83.49627,46.00169],[-83.49627,46.06682],[-83.56,46.06682],[-83.56,46.12616],[-83.99546,46.12616],[-83.99546,46.19317],[-84.05918,46.19317],[-84.05918,46.3815],[-84.11526,46.3815],[-84.11526,46.49536],[-84.05918,46.49536],[-84.05918,46.56827],[-84.25795,46.56827],[-84.25795,46.50512],[-84.30719,46.50512],[-84.30719,46.56827],[-84.44154,46.56827],[-84.44154,46.50453],[-84.99657,46.50453],[-84.99657,46.68429],[-84.92982,46.68429],[-84.92982,46.81808],[-85.31659,46.81808],[-85.31659,46.75358],[-87.55626,46.75358],[-87.55626,47.44074],[-87.68254,47.44074],[-87.68254,47.50356],[-88.25607,47.50356],[-88.25607,47.44337],[-88.44174,47.44337],[-88.44174,47.37899],[-88.50683,47.37899],[-88.50683,47.31539],[-88.63128,47.31539],[-88.63128,47.25398],[-88.75696,47.25398],[-88.75696,47.19347],[-88.88383,47.19347],[-88.88383,47.12847],[-88.94342,47.12847],[-88.94342,47.06621],[-89.07087,47.06621],[-89.07087,47.00268],[-89.25656,47.00268],[-89.25656,46.94108],[-90.36777,46.94108],[-90.36777,47.68448],[-90.307,47.68448],[-90.307,47.74602],[-89.99486,47.74602],[-89.99486,47.80827],[-89.80486,47.80827],[-89.80486,47.87006],[-89.67977,47.87006],[-89.67977,47.93396],[-89.49338,47.93396],[-89.49338,47.9958],[-89.42847,47.9958],[-89.42847,48.06564],[-89.99327,48.06564],[-89.99327,48.1283],[-90.74559,48.1283],[-90.74559,48.18931],[-90.80873,48.18931],[-90.80873,48.25221],[-91.06776,48.25221],[-91.06776,48.19167],[-91.19462,48.19167],[-91.19462,48.1279],[-91.68142,48.1279],[-91.68142,48.2526],[-91.93219,48.2526],[-91.93219,48.31425],[-91.99297,48.31425],[-91.99297,48.37808],[-92.31894,48.37808],[-92.31894,48.25291],[-92.37322,48.25291],[-92.37322,48.31534],[-92.43223,48.31534],[-92.43223,48.44114],[-92.49772,48.44114],[-92.49772,48.50178],[-92.56794,48.50178],[-92.56794,48.43958],[-92.62105,48.43958],[-92.62105,48.56508],[-92.80868,48.56508],[-92.80868,48.62869],[-92.80868,48.62674],[-92.93318,48.62674],[-92.93318,48.69221],[-93.00517,48.69221],[-93.00517,48.6283],[-93.12259,48.6283],[-93.12259,48.69221],[-93.31908,48.69221],[-93.31908,48.62674],[-93.50495,48.62674],[-93.50495,48.56352],[-93.74746,48.56352],[-93.74746,48.62674],[-93.81355,48.62674],[-93.81355,48.68988],[-94.24531,48.68988],[-94.24531,48.75543],[-94.61832,48.75543],[-94.61832,48.94104],[-94.6809,48.94104],[-94.6809,49.00297],[-94.74415,49.00297],[-94.74415,49.25361],[-94.80841,49.25361],[-94.80841,49.37841],[-95.11924,49.37841],[-95.11924,49.44253],[-95.19343,49.44253],[-95.19343,49.00353],[-96.87069,49.00353],[-96.87069,49.06561],[-99.00493,49.06561],[-99.00493,49.00507],[-109.36993,49.00507],[-109.36993,49.06682],[-109.50587,49.06682],[-109.50587,49.00507],[-114.183,49.00507],[-114.183,49.06873],[-114.75787,49.06873],[-114.75787,49.00507],[-115.43373,49.00507],[-115.43373,49.06714],[-116.50627,49.06714],[-116.50627,49.00507],[-117.30895,49.00507],[-117.30895,49.06598],[-119.88295,49.06598],[-119.88295,49.00507],[-120.12086,49.00507],[-120.12086,49.06784],[-121.44516,49.06784],[-121.44516,49.00507],[-121.93118,49.00507],[-121.93118,49.06561],[-122.81748,49.06561],[-122.81748,49.00291],[-122.87952,49.00291],[-122.87952,48.9347],[-122.81746,48.9347],[-122.81746,48.8102],[-122.75389,48.8102],[-122.75389,48.75338],[-122.87129,48.75338],[-122.87129,48.81539],[-123.00554,48.81539],[-123.00554,48.75295],[-123.12969,48.75295],[-123.12969,48.69022],[-123.18382,48.69022],[-123.18382,48.7529],[-123.25493,48.7529]],[[-122.93417,37.75215],[-122.93475,37.6842],[-123.0679,37.6849],[-123.06737,37.74753],[-123.12926,37.74785],[-123.12869,37.81569],[-123.05907,37.81532],[-123.05959,37.75281],[-122.93417,37.75215]],[[-71.62995,41.25409],[-71.49665,41.25414],[-71.49656,41.12297],[-71.62986,41.12291],[-71.62995,41.25409]],[[-70.31843,41.37752],[-70.31834,41.24482],[-70.19066,41.24487],[-70.19062,41.1886],[-69.9336,41.1887],[-69.93373,41.37919],[-69.99507,41.37917],[-69.99511,41.44316],[-70.07078,41.44313],[-70.0707,41.31449],[-70.24617,41.31443],[-70.24621,41.37755],[-70.31843,41.37752]],[[-68.94034,43.94041],[-68.68569,43.9405],[-68.68565,43.87218],[-68.74654,43.87216],[-68.7465,43.81025],[-68.80908,43.81023],[-68.80903,43.74673],[-68.87731,43.7467],[-68.87735,43.81178],[-68.94025,43.81176],[-68.94034,43.94041]],[[-123.12915,49.06451],[-122.99542,49.06451],[-122.99542,48.93432],[-123.12915,48.93432],[-123.12915,49.06451]],[[-82.94071,24.75359],[-82.87194,24.75359],[-82.87194,24.69057],[-82.74462,24.69057],[-82.74462,24.62146],[-82.8088,24.62146],[-82.8088,24.55949],[-82.94071,24.55949],[-82.94071,24.75359]]],description:"Public domain aerial imagery, mostly NAIP",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{id:"USGS-Scanned_Topographic",name:"USGS Topographic Maps",type:"tms",template:"https://caltopo.s3.amazonaws.com/topo/{zoom}/{x}/{y}.png",zoomExtent:[0,16],polygon:[[[-55.99594,52.00107],[-112.02896,52.00107],[-112.03995,56.01308],[-120.00494,56.00592],[-120.01712,60.01202],[-132.00197,60.00239],[-132.01208,63.00193],[-133.96883,63.0005],[-133.9724,63.99225],[-141.04429,63.98726],[-141.06879,69.92046],[-156.24893,71.51583],[-160.44571,70.83527],[-167.08145,68.42906],[-164.08218,67.03914],[-169.01504,65.68269],[-166.57608,64.50778],[-161.82999,64.05006],[-165.08194,63.2603],[-168.02628,59.78623],[-162.53311,59.73089],[-162.35733,58.55905],[-157.83096,58.31753],[-158.00674,57.52404],[-168.22403,53.51022],[-166.55411,53.14277],[-158.77579,54.88541],[-158.6824,55.74964],[-156.55106,56.00848],[-156.15555,56.77466],[-154.70535,56.14337],[-152.07413,57.37035],[-151.62918,58.22653],[-152.00821,58.98056],[-145.9877,60.24741],[-140.38467,59.48634],[-136.53946,57.8061],[-133.79288,54.83483],[-133.33145,53.14277],[-131.46378,51.69838],[-128.52493,51.74602],[-129.79385,50.90159],[-124.56436,47.49786],[-124.03702,45.48627],[-124.6962,42.90428],[-124.49844,40.34146],[-122.80655,37.53929],[-119.99405,33.37085],[-117.24747,32.5412],[-111.13907,31.1977],[-106.70059,31.23529],[-103.20694,28.64618],[-101.84463,29.8158],[-99.20792,26.28744],[-96.79092,25.75432],[-96.92276,27.96911],[-93.47305,29.68226],[-88.94669,28.87732],[-88.6171,30.17736],[-86.2001,30.36713],[-84.96963,29.43379],[-84.09073,30.06333],[-82.97012,28.95426],[-82.97012,27.26824],[-81.25626,25.07956],[-82.09122,24.56105],[-80.06973,24.76073],[-79.85001,27.11188],[-81.27823,30.70777],[-78.99307,33.20554],[-75.03799,35.5983],[-75.85098,37.24252],[-73.74161,40.4586],[-69.89639,41.60224],[-70.68741,43.17629],[-66.93008,44.69516],[-66.53458,43.08007],[-64.20547,43.35229],[-59.50333,45.73221],[-59.51431,46.24762],[-60.0032,46.25901],[-59.99222,47.24506],[-59.00894,47.2376],[-58.99796,47.50267],[-56.51504,47.50267],[-56.52603,46.7477],[-53.99918,46.7477],[-53.9772,46.48358],[-52.49405,46.46354],[-52.50504,48.75361],[-52.99667,48.75451],[-53.01315,49.99551],[-55.00168,50.0061],[-55.03738,53.74721],[-56.00418,53.73421],[-55.99594,52.00107]],[[-59.50127,43.74954],[-60.5024,43.74954],[-60.5024,44],[-59.9984,44],[-59.9984,44.2494],[-59.50127,44.2494],[-59.50127,43.74954]],[[-155.95024,20.49523],[-157.32675,20.49153],[-157.32903,21.23181],[-155.95251,21.23549],[-155.95024,20.49523]],[[-157.64488,21.24845],[-158.28534,21.24674],[-158.2869,21.74996],[-157.64643,21.75167],[-157.64488,21.24845]],[[-156.12602,20.3247],[-154.74617,20.32841],[-154.74174,18.87578],[-156.1216,18.87203],[-156.12602,20.3247]],[[-159.29077,22.24504],[-159.2893,21.76857],[-160.28917,21.76591],[-160.29064,22.24239],[-159.29077,22.24504]]],terms_url:"https://caltopo.com",terms_text:"© Caltopo",icon:"https://osmlab.github.io/editor-layer-index/sources/north-america/us/USGSTopographicMaps.png"},{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.63086,57.56889],[25.16968,58.04882],[22.54395,57.76866],[21.54419,57.53352],[21.01685,56.81892],[21.01685,56.03523],[22.03857,56.38958],[24.71924,56.33481],[26.75171,55.66519],[28.19092,56.13943],[27.78442,57.40946],[26.63086,57.56889]]]},{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}",zoomExtent:[0,19],polygon:[[[-123.27402,48.69297],[-123.00773,48.76726],[-123.00762,48.83158],[-122.7835,48.75842],[-122.6934,48.65852],[-122.76745,48.60361],[-122.74484,48.38708],[-123.24822,48.28353],[-123.11452,48.42261],[-123.21904,48.54857],[-123.27402,48.69297]]],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",zoomExtent:[0,19],polygon:[[[5.43565,44.99918],[5.43193,44.9229],[5.43624,44.92284],[5.43472,44.89001],[5.43303,44.88995],[5.43065,44.85026],[5.43387,44.85014],[5.43285,44.82638],[5.43548,44.82626],[5.43497,44.8139],[5.44106,44.81372],[5.43717,44.74098],[5.4546,44.74044],[5.45282,44.70425],[5.5211,44.70245],[5.5233,44.73858],[5.58904,44.73684],[5.59298,44.81263],[5.5879,44.81299],[5.58977,44.84947],[5.58823,44.84938],[5.58972,44.87351],[5.53863,44.87503],[5.53947,44.88686],[5.52834,44.88733],[5.53002,44.92012],[5.53319,44.92012],[5.53761,44.99624],[5.43565,44.99918]]],terms_text:"Parc Naturel du Vercors"},{id:"vicosa_al",name:"Viçosa AL",type:"wms",template:"http://geoserver.dados.al.gov.br:8080/geoserver/Alagoas/ows?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.198,-9.42067],[-36.19777,-9.41789],[-36.1978,-9.41528],[-36.19801,-9.41074],[-36.19789,-9.40857],[-36.19793,-9.40637],[-36.19797,-9.40561],[-36.19793,-9.40405],[-36.19799,-9.40312],[-36.19827,-9.40028],[-36.19829,-9.39496],[-36.19789,-9.39169],[-36.19844,-9.38932],[-36.19837,-9.3862],[-36.19794,-9.38167],[-36.19801,-9.37972],[-36.19834,-9.37867],[-36.19832,-9.37698],[-36.19817,-9.37586],[-36.19852,-9.37139],[-36.19822,-9.36239],[-36.19862,-9.35319],[-36.19849,-9.35097],[-36.19857,-9.34852],[-36.1988,-9.34668],[-36.1986,-9.34349],[-36.19877,-9.34084],[-36.19895,-9.33301],[-36.19877,-9.33039],[-36.28958,-9.33114],[-36.28938,-9.33319],[-36.2895,-9.33538],[-36.28925,-9.34124],[-36.28945,-9.34291],[-36.28928,-9.34521],[-36.28897,-9.37311],[-36.28915,-9.37481],[-36.28892,-9.37708],[-36.2889,-9.38541],[-36.28872,-9.38633],[-36.28872,-9.39343],[-36.28887,-9.39558],[-36.28877,-9.40129],[-36.28862,-9.40652],[-36.28872,-9.40715],[-36.28877,-9.42133],[-36.198,-9.42067]]],terms_url:"http://www.seplag.al.gov.br",terms_text:"Secretaria de Estado do Planejamento, Gestão e Patrimônio"},{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",zoomExtent:[12,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],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",zoomExtent:[10,19],polygon:[[[16.54475,48.17286],[16.54103,48.17657],[16.54978,48.17675],[16.54665,48.17162],[16.55629,48.16171],[16.55567,48.16446],[16.56161,48.16037],[16.57306,48.16319],[16.57603,48.13522],[16.54301,48.14333],[16.51377,48.15893],[16.4777,48.15744],[16.45536,48.13951],[16.43313,48.13788],[16.43701,48.11994],[16.42291,48.12306],[16.4083,48.11791],[16.40511,48.12198],[16.3246,48.13779],[16.31181,48.11945],[16.29806,48.12896],[16.2711,48.13385],[16.23607,48.13001],[16.2189,48.12377],[16.2181,48.12807],[16.23861,48.13205],[16.23843,48.13716],[16.22081,48.13555],[16.20986,48.14762],[16.22321,48.15318],[16.19798,48.15454],[16.19619,48.16396],[16.18183,48.17112],[16.19981,48.18616],[16.20739,48.20235],[16.20194,48.20479],[16.20962,48.20963],[16.1976,48.21479],[16.19778,48.22288],[16.18517,48.2232],[16.19911,48.22858],[16.19251,48.23671],[16.20677,48.26483],[16.24105,48.24837],[16.24154,48.23832],[16.25662,48.23988],[16.27043,48.25193],[16.26406,48.25492],[16.28556,48.25832],[16.29412,48.26395],[16.28617,48.2667],[16.28901,48.27051],[16.32741,48.27721],[16.34813,48.29048],[16.35351,48.28369],[16.3706,48.2817],[16.36714,48.28685],[16.37787,48.28832],[16.37557,48.29592],[16.37982,48.30201],[16.38536,48.30146],[16.38043,48.31507],[16.39518,48.32257],[16.39412,48.31926],[16.40287,48.31676],[16.41682,48.32253],[16.43803,48.31628],[16.44041,48.29192],[16.47547,48.27501],[16.48123,48.27343],[16.4835,48.27971],[16.48132,48.29351],[16.49645,48.29249],[16.51491,48.28554],[16.5067,48.2736],[16.51285,48.26784],[16.53263,48.2621],[16.54697,48.263],[16.53941,48.24284],[16.55274,48.239],[16.53627,48.20044],[16.54184,48.18206],[16.53631,48.17755],[16.54475,48.17286]]],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",zoomExtent:[10,19],polygon:[[[16.14995,48.10832],[16.14989,48.33315],[16.61873,48.33296],[16.61749,48.10813],[16.46644,48.10819],[16.46644,48.10744],[16.18104,48.10756],[16.18104,48.10831],[16.14995,48.10832]]],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",zoomExtent:[14,20],polygon:[[[6.24859,46.38252],[6.24848,46.38715],[6.24378,46.38944],[6.24182,46.39109],[6.2414,46.39159],[6.23919,46.39222],[6.23973,46.39373],[6.2379,46.3946],[6.23713,46.39698],[6.23071,46.40107],[6.22789,46.39903],[6.22326,46.40219],[6.22066,46.40189],[6.21582,46.40462],[6.21393,46.40698],[6.20989,46.40563],[6.20928,46.40528],[6.20985,46.40434],[6.20501,46.40332],[6.20527,46.40104],[6.20906,46.40131],[6.20951,46.4013],[6.2149,46.4008],[6.21154,46.39808],[6.21057,46.3968],[6.20954,46.39449],[6.21229,46.39243],[6.21374,46.39168],[6.21639,46.39079],[6.21296,46.38736],[6.21532,46.38514],[6.21403,46.38424],[6.2126,46.38232],[6.21211,46.38102],[6.21212,46.37992],[6.21231,46.37901],[6.21318,46.37697],[6.21454,46.37494],[6.21359,46.37463],[6.21365,46.37276],[6.22133,46.3699],[6.22752,46.36555],[6.22752,46.36541],[6.23738,46.37356],[6.24404,46.37842],[6.24859,46.38252]]],terms_url:"http://www.nyon.ch/fr/officiel/services-offices/informatique-et-population-776-3911",terms_text:"Ville de Nyon"},{id:"VGIN-BuildingFootprints_WM",name:"Virginia Building Footprints",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Building_Footprints%2FMapServer&transparent=true&layers=show%3A20",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=bcd049dfcdc342a7a08ec81644eeb339",terms_text:"Virginia Geographic Information Network (VGIN)",description:"Virginia Building Footprint Map Service",overlay:true},{id:"VGIN-Imagery_WM",name:"Virginia Imagery Service - Most Recent",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=https%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FMostRecentImagery%2FMostRecentImagery_WGS%2FMapServer&transparent=true&layers=show%3A0",endDate:"2018-08-01T00:00:00.000Z",startDate:"2013-04-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=36386a7e7dae4032a33cb0b83a1711f1",terms_text:"Virginia Geographic Information Network (VGIN)",description:"The most recently available VBMP orthoimagery for all of Virginia."},{id:"VGIN-PropertyLines_WM",name:"Virginia Property Lines",type:"tms",template:"http://tileify-ags.herokuapp.com/tiles/{zoom}/{x}/{y}?url=http%3A%2F%2Fgismaps.vita.virginia.gov%2Farcgis%2Frest%2Fservices%2FVA_Base_layers%2FVA_Parcels%2FMapServer&transparent=true",endDate:"2018-06-01T00:00:00.000Z",startDate:"2015-05-01T00:00:00.000Z",zoomExtent:[0,20],polygon:[[[-83.64853,36.6023],[-79.9118,36.55819],[-75.90179,36.56701],[-75.8606,36.985],[-75.19867,38.0178],[-76.15448,37.99183],[-76.25336,37.92253],[-76.62689,38.1648],[-76.90704,38.22524],[-77.05536,38.42132],[-77.19818,38.37396],[-77.28333,38.3675],[-77.31628,38.45789],[-77.25586,38.58253],[-77.15698,38.61043],[-77.11853,38.68337],[-77.0636,38.69409],[-77.05811,38.82259],[-77.07458,38.88462],[-77.20367,38.99357],[-77.3822,39.07038],[-77.47833,39.09809],[-77.53876,39.16627],[-77.4646,39.23651],[-77.59918,39.30455],[-77.74475,39.33005],[-77.84637,39.14284],[-78.36273,39.45528],[-78.3847,39.36616],[-78.36548,39.32792],[-78.4671,39.19182],[-78.60168,39.03199],[-78.69232,38.94659],[-78.89282,38.76479],[-78.99719,38.8504],[-79.13727,38.68551],[-79.31854,38.42993],[-79.5108,38.46004],[-79.56299,38.54817],[-79.65637,38.58253],[-79.71954,38.50519],[-79.70856,38.44068],[-79.94476,38.16911],[-80.00519,38.0243],[-80.21942,37.83148],[-80.32379,37.67513],[-80.22766,37.62511],[-80.36224,37.56417],[-80.32928,37.52498],[-80.49408,37.42907],[-80.53253,37.48794],[-80.78522,37.37889],[-80.86487,37.43561],[-80.9198,37.39635],[-80.88135,37.36143],[-81.02692,37.28935],[-81.26038,37.25219],[-81.37024,37.34396],[-81.47736,37.26312],[-81.55426,37.22595],[-81.71906,37.20189],[-81.98273,37.42689],[-81.96899,37.55329],[-82.40845,37.26531],[-82.74078,37.13186],[-82.73529,37.05299],[-82.90283,36.985],[-82.87811,36.90818],[-83.02643,36.85765],[-83.07587,36.85765],[-83.16101,36.74989],[-83.44666,36.69265],[-83.61145,36.64418],[-83.63892,36.63592],[-83.69385,36.61222],[-83.70003,36.6023],[-83.64853,36.6023]]],terms_url:"https://vgin.maps.arcgis.com/home/item.html?id=f1dccaf1f42e40cbba791feae2e23690",terms_text:"Virginia Geographic Information Network (VGIN)",description:"A statewide Parcel service showing property ownership outlines where available",overlay:true},{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.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{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.96805,47.54631],[9.96809,47.54627],[9.97125,47.54425],[9.96484,47.53803],[9.9684,47.52802],[9.96526,47.52089],[9.99569,47.50278],[9.98736,47.49847],[10.00076,47.48211],[10.02301,47.48411],[10.03743,47.48918],[10.04477,47.48762],[10.05413,47.47589],[10.05347,47.46686],[10.06468,47.46364],[10.06999,47.45595],[10.08057,47.45536],[10.08857,47.46029],[10.09164,47.45893],[10.09385,47.44046],[10.10559,47.42872],[10.09374,47.41688],[10.07418,47.41472],[10.06914,47.41018],[10.08624,47.39952],[10.08284,47.39381],[10.09984,47.35476],[10.11934,47.37561],[10.14169,47.36718],[10.16587,47.36887],[10.16958,47.3713],[10.1694,47.38583],[10.1813,47.38725],[10.18185,47.39243],[10.19508,47.38935],[10.19988,47.38334],[10.21259,47.38039],[10.22705,47.38889],[10.23619,47.38192],[10.23168,47.37897],[10.23716,47.37357],[10.21699,47.35436],[10.2171,47.34988],[10.20424,47.33675],[10.20742,47.33232],[10.19951,47.32646],[10.21113,47.31898],[10.21597,47.31106],[10.21236,47.31122],[10.19913,47.29754],[10.18964,47.29394],[10.17961,47.29603],[10.17208,47.27908],[10.17404,47.27025],[10.17834,47.27011],[10.17449,47.2637],[10.21884,47.25533],[10.22343,47.24983],[10.21087,47.2478],[10.19776,47.23666],[10.20791,47.2328],[10.21428,47.21684],[10.21269,47.20432],[10.19963,47.19539],[10.19951,47.18525],[10.21151,47.17124],[10.2092,47.16537],[10.20851,47.15948],[10.21321,47.1577],[10.2222,47.15323],[10.22166,47.14925],[10.21481,47.14352],[10.20333,47.14215],[10.20887,47.13164],[10.18629,47.12886],[10.18652,47.11946],[10.17288,47.12033],[10.16299,47.11361],[10.15766,47.11426],[10.15442,47.10578],[10.13243,47.08122],[10.13459,47.06392],[10.15085,47.06184],[10.15693,47.04883],[10.14418,47.03355],[10.12326,47.02209],[10.13284,47.01204],[10.15447,47.00545],[10.15961,46.99882],[10.15442,46.99299],[10.16001,46.984],[10.14463,46.98301],[10.13492,46.96584],[10.13501,46.95483],[10.12684,46.9435],[10.09772,46.92676],[10.09954,46.91712],[10.10921,46.90834],[10.10908,46.89431],[10.12497,46.88014],[10.14147,46.87468],[10.13967,46.86217],[10.14506,46.8511],[10.13941,46.84738],[10.12309,46.84848],[10.11912,46.84417],[10.10518,46.8409],[10.09195,46.85143],[10.09265,46.85818],[10.08712,46.86128],[10.05488,46.8617],[10.0509,46.86442],[10.05192,46.87405],[10.03891,46.88611],[10.03221,46.88802],[10.01782,46.90161],[10.00494,46.89889],[9.98243,46.9062],[9.97793,46.91603],[9.96657,46.91222],[9.95907,46.91602],[9.94612,46.91235],[9.93758,46.91324],[9.92153,46.91882],[9.91231,46.92606],[9.90632,46.9253],[9.89449,46.93164],[9.87613,46.93463],[9.88071,46.94011],[9.87657,46.94071],[9.87488,46.95039],[9.87872,46.95707],[9.87073,46.96321],[9.88482,46.98546],[9.8923,46.99036],[9.88878,47.00072],[9.8707,47.00965],[9.87115,47.01306],[9.88035,47.01722],[9.87779,47.02055],[9.85974,47.02321],[9.85273,47.01641],[9.83612,47.01253],[9.82353,47.01986],[9.80756,47.02356],[9.78491,47.03849],[9.74808,47.03692],[9.74185,47.04268],[9.71821,47.04337],[9.70701,47.04805],[9.7076,47.05381],[9.69756,47.05239],[9.68392,47.05765],[9.68184,47.0621],[9.67743,47.06141],[9.65821,47.05818],[9.64506,47.05978],[9.64158,47.05598],[9.63654,47.0517],[9.62633,47.05133],[9.60705,47.06077],[9.6134,47.0695],[9.61153,47.0794],[9.61869,47.07817],[9.62339,47.08258],[9.63346,47.08344],[9.63564,47.09553],[9.62858,47.10756],[9.62083,47.11032],[9.63503,47.12813],[9.62467,47.13265],[9.62258,47.14135],[9.62587,47.1459],[9.62059,47.15164],[9.6089,47.14775],[9.59679,47.16294],[9.57946,47.17116],[9.56456,47.17029],[9.57302,47.1756],[9.57259,47.19079],[9.58032,47.19578],[9.58477,47.20532],[9.5687,47.21968],[9.55851,47.22416],[9.55176,47.22377],[9.56679,47.24288],[9.53073,47.27058],[9.54619,47.28005],[9.55634,47.29829],[9.58805,47.3173],[9.59966,47.3455],[9.61073,47.35571],[9.62446,47.36615],[9.65876,47.36946],[9.67255,47.38021],[9.67311,47.39194],[9.65162,47.40463],[9.64551,47.4312],[9.64512,47.4378],[9.65799,47.44779],[9.65898,47.4522],[9.62234,47.45747],[9.60904,47.47054],[9.60292,47.46198],[9.59514,47.46331],[9.58217,47.48276],[9.5622,47.49592],[9.55057,47.53718],[9.5827,47.53592],[9.60465,47.52952],[9.73478,47.53396],[9.73517,47.54661],[9.74164,47.55499],[9.7471,47.55569],[9.74337,47.55867],[9.75207,47.56747],[9.74806,47.57052],[9.75632,47.57262],[9.75633,47.57963],[9.76197,47.58096],[9.76553,47.58912],[9.76933,47.58739],[9.77697,47.59544],[9.79151,47.59352],[9.79999,47.59611],[9.81414,47.58807],[9.82381,47.5871],[9.82728,47.57997],[9.82079,47.57076],[9.82562,47.55922],[9.8171,47.55333],[9.81579,47.54767],[9.85023,47.54164],[9.85839,47.53388],[9.87451,47.52854],[9.87804,47.53876],[9.87515,47.54343],[9.88125,47.54814],[9.8891,47.54399],[9.89935,47.54475],[9.90666,47.54217],[9.91358,47.53255],[9.92189,47.52964],[9.93352,47.53265],[9.94108,47.53822],[9.9637,47.53472],[9.95883,47.54313],[9.96318,47.54229],[9.96805,47.54631]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{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.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{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.54367,47.48479],[9.61451,47.45058],[9.61359,47.38272],[9.44246,47.24798],[9.44614,47.096],[9.42866,47.08911],[9.42498,47.01513],[9.85281,47.00196],[9.85741,46.89896],[9.9669,46.88952],[10.04511,46.8499],[10.15828,46.83353],[10.1592,46.89204],[10.14718,46.89248],[10.15115,46.94331],[10.16317,46.94287],[10.1647,46.96238],[10.17852,46.96681],[10.17576,47.10351],[10.22912,47.10226],[10.22084,47.24361],[10.26133,47.41261],[10.12423,47.40576],[10.09387,47.47795],[10.00462,47.50717],[9.98622,47.56121],[9.84361,47.56245],[9.84085,47.60714],[9.53999,47.60652],[9.54367,47.48479]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{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.17039,46.82979],[10.17108,46.93644],[10.18413,46.94113],[10.1855,47.10157],[10.23906,47.10437],[10.24283,47.15611],[10.25691,47.18704],[10.24558,47.27597],[10.25313,47.32347],[10.26893,47.32626],[10.26446,47.41102],[10.13194,47.4087],[10.13434,47.46107],[10.11752,47.46153],[10.11889,47.47337],[10.08731,47.47429],[10.08491,47.50724],[10.06843,47.507],[10.0674,47.5215],[10.02345,47.52428],[10.00079,47.57943],[9.84904,47.57757],[9.85042,47.61462],[9.72751,47.61277],[9.7203,47.59089],[9.70347,47.58915],[9.70313,47.54491],[9.68219,47.54491],[9.68047,47.55348],[9.56391,47.54931],[9.56202,47.53958],[9.55172,47.53958],[9.55172,47.53402],[9.52168,47.53471],[9.52701,47.30497],[9.50503,47.30264],[9.50091,47.23368],[9.52357,47.23228],[9.52426,47.16557],[9.54486,47.16405],[9.54383,47.15448],[9.57232,47.15401],[9.57026,47.12809],[9.59018,47.12867],[9.59189,47.10029],[9.57232,47.10017],[9.57713,47.02861],[9.72407,47.03048],[9.72304,47.01749],[9.77454,47.01562],[9.77626,47.00555],[9.79274,47.00391],[9.7948,46.99127],[9.83874,46.99314],[9.84012,46.90349],[9.89024,46.90725],[9.88543,46.88707],[9.95925,46.89141],[9.962,46.87675],[10.0001,46.87862],[9.99667,46.85715],[10.01864,46.85656],[10.02345,46.83073],[10.17039,46.82979]]],terms_url:"https://www.vorarlberg.at/vorarlberg/bauen_wohnen/bauen/vermessung_geoinformation/weitereinformationen/services/wmsdienste.htm",terms_text:"Datenquelle: Land Vorarlberg – data.vorarlberg.gv.at",icon:"https://osmlab.github.io/editor-layer-index/sources/europe/at/VoGISFlchenwidmungsplan.png"},{id:"wroclaw-orto2015",name:"Wrocław: Orthophotomap 2015 (aerial image)",type:"wms",template:"http://gis1.um.wroc.pl/arcgis/services/ogc/OGC_ortofoto_2015/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",zoomExtent:[0,23],polygon:[[[17.14217,51.12846],[17.15659,51.1499],[17.15933,51.16056],[17.15899,51.17886],[17.14371,51.18155],[17.13024,51.18128],[17.12466,51.17396],[17.11436,51.17746],[17.0778,51.17746],[17.07642,51.1766],[17.07548,51.16825],[17.06698,51.16745],[17.04698,51.17493],[17.03376,51.17729],[17.02741,51.17729],[17.02733,51.18246],[17.02252,51.18816],[17.01299,51.18816],[17.0093,51.18499],[17.00312,51.18504],[17.00261,51.20016],[16.99162,51.20559],[16.97008,51.20763],[16.96424,51.20989],[16.95394,51.20968],[16.94656,51.20586],[16.9233,51.2001],[16.90811,51.21043],[16.89927,51.21027],[16.89292,51.2071],[16.88322,51.2071],[16.88073,51.20489],[16.88047,51.19666],[16.88322,51.19048],[16.87403,51.18719],[16.87026,51.18203],[16.85455,51.18031],[16.8421,51.18488],[16.82434,51.18467],[16.82056,51.17875],[16.82099,51.16373],[16.82502,51.15647],[16.80915,51.15194],[16.80657,51.14613],[16.80648,51.1366],[16.80769,51.13595],[16.81687,51.13601],[16.8161,51.13337],[16.81636,51.12459],[16.82932,51.12329],[16.83266,51.11834],[16.82923,51.11386],[16.82923,51.10993],[16.83215,51.10869],[16.84949,51.10826],[16.85661,51.09899],[16.87901,51.09252],[16.88862,51.09258],[16.89197,51.09667],[16.92107,51.09662],[16.9209,51.09263],[16.91661,51.0812],[16.91686,51.07942],[16.93514,51.07948],[16.93849,51.0736],[16.95248,51.06686],[16.95068,51.05806],[16.95454,51.05369],[16.96188,51.0473],[16.96879,51.04568],[16.98072,51.04584],[16.98424,51.05197],[16.99969,51.04668],[17.00776,51.04422],[17.01973,51.04169],[17.03286,51.0419],[17.03415,51.04673],[17.04509,51.04339],[17.06363,51.04339],[17.07037,51.05286],[17.08363,51.04428],[17.095,51.04368],[17.10633,51.04376],[17.10835,51.04684],[17.10822,51.05377],[17.10226,51.05868],[17.11136,51.0716],[17.12341,51.07179],[17.12299,51.07856],[17.15088,51.07861],[17.17277,51.09344],[17.17277,51.09956],[17.17697,51.10303],[17.17676,51.1092],[17.16363,51.1203],[17.14217,51.12846]]],terms_text:"Urząd Miasta Wrocław",icon:"https://i.imgur.com/PRqROXB.png"},{id:"Zabrze-2011",name:"Zabrze: Orthophotomap 2011 (aerial image)",type:"wms",template:"http://siot.um.zabrze.pl/arcgis/services/UMZ_Ortofoto_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:4326",endDate:"2011-01-01T00:00:00.000Z",startDate:"2011-01-01T00:00:00.000Z",zoomExtent:[0,23],polygon:[[[18.74396,50.2753],[18.75586,50.27523],[18.75578,50.27633],[18.74516,50.28105],[18.74609,50.28886],[18.75084,50.28948],[18.74832,50.2957],[18.73379,50.29618],[18.73208,50.31571],[18.73613,50.31646],[18.73882,50.32763],[18.73725,50.33016],[18.73121,50.33169],[18.73054,50.3344],[18.73422,50.3371],[18.73428,50.34097],[18.73866,50.34308],[18.75419,50.34182],[18.75982,50.34624],[18.75438,50.34744],[18.75119,50.34979],[18.74603,50.36876],[18.75705,50.3692],[18.7639,50.36754],[18.77263,50.37628],[18.78436,50.37077],[18.78713,50.37295],[18.79821,50.37048],[18.80466,50.37561],[18.80165,50.37718],[18.80164,50.38222],[18.80509,50.38317],[18.81527,50.38167],[18.81446,50.37515],[18.82183,50.36883],[18.81737,50.36802],[18.82104,50.35843],[18.8159,50.35336],[18.81687,50.35076],[18.82294,50.35156],[18.83281,50.34962],[18.83474,50.3443],[18.84615,50.34448],[18.86293,50.32852],[18.8607,50.32776],[18.85088,50.33191],[18.84578,50.32923],[18.84891,50.32352],[18.83179,50.32028],[18.83192,50.30483],[18.84451,50.30286],[18.84429,50.29627],[18.82282,50.28615],[18.82845,50.28482],[18.82745,50.27972],[18.82322,50.27994],[18.8214,50.27414],[18.81392,50.27309],[18.79981,50.27351],[18.7987,50.2613],[18.7923,50.24641],[18.78261,50.24583],[18.76416,50.25145],[18.75396,50.25669],[18.75004,50.26402],[18.73991,50.26738],[18.73421,50.27084],[18.74396,50.2753]]],terms_text:"Urząd Miasta Zabrza"}];
23660
23661   var presets = {aerialway:{fields:["aerialway"],geometry:["point","vertex","line"],tags:{aerialway:"*"},terms:["ski lift","funifor","funitel"],searchable:false,name:"Aerialway"},aeroway:{icon:"maki-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},embankment:{geometry:["line"],tags:{embankment:"yes"},name:"Embankment",matchScore:0.2,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},seamark:{icon:"maki-harbor",fields:["seamark/type"],geometry:["point","vertex","line","area"],tags:{"seamark:type":"*"},searchable:false,name:"Seamark"},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":{icon:"temaki-storage_tank",fields:["lit"],geometry:["point","area"],tags:{advertising:"column"},name:"Advertising Column"},"aerialway/station":{icon:"maki-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:"maki-airport",geometry:["point","area"],fields:["name","iata","icao","operator","internet_access","internet_access/fee","internet_access/ssid"],terms:["aerodrome","aeroway","airplane","airport","jet","plane"],tags:{aeroway:"aerodrome"},matchScore:0.9,name:"Airport"},"aeroway/apron":{icon:"maki-airport",geometry:["area"],terms:["ramp"],fields:["ref","surface"],tags:{aeroway:"apron"},name:"Apron"},"aeroway/gate":{icon:"maki-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:"maki-heliport",geometry:["point","area"],fields:["ref"],terms:["helicopter","helipad","heliport"],tags:{aeroway:"helipad"},name:"Helipad"},"aeroway/runway":{icon:"fas-plane-departure",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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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/recycling":{icon:"maki-recycling",fields:["recycling_type","recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling"},name:"Recycling",searchable:false},"amenity/register_office":{icon:"maki-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:"maki-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:"maki-swimming",geometry:["point","vertex","area"],tags:{amenity:"swimming_pool"},reference:{key:"leisure",value:"swimming_pool"},name:"Swimming Pool",searchable:false},"amenity/animal_boarding":{icon:"maki-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:"maki-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:"maki-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:"maki-theatre",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],terms:[],tags:{amenity:"arts_centre"},name:"Arts Center"},"amenity/atm":{icon:"maki-bank",fields:["operator","network","cash_in","currency_multi","drive_through"],geometry:["point","vertex"],terms:["money","cash","machine"],tags:{amenity:"atm"},name:"ATM"},"amenity/bank":{icon:"maki-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:"maki-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:"maki-bbq",fields:["covered","fuel","access_simple"],geometry:["point"],terms:["bbq","grill"],tags:{amenity:"bbq"},name:"Barbecue/Grill"},"amenity/bench":{icon:"temaki-bench",fields:["backrest","material","seats","colour"],geometry:["point","vertex","line"],terms:["seat"],tags:{amenity:"bench"},name:"Bench"},"amenity/bicycle_parking":{icon:"maki-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:"maki-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:"maki-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:"maki-beer",fields:["name","address","building","opening_hours","smoking","outdoor_seating","brewery"],geometry:["point","area"],tags:{amenity:"biergarten"},terms:["beer","bier","booze"],name:"Biergarten"},"amenity/boat_rental":{fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"boat_rental"},name:"Boat Rental"},"amenity/bureau_de_change":{icon:"maki-bank",fields:["name","currency_multi","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["bureau de change","money changer"],tags:{amenity:"bureau_de_change"},name:"Currency Exchange"},"amenity/cafe":{icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],terms:["bistro","coffee","tea"],tags:{amenity:"cafe"},name:"Cafe"},"amenity/car_pooling":{icon:"maki-car",fields:["name","operator","capacity"],geometry:["point","area"],tags:{amenity:"car_pooling"},name:"Car Pooling"},"amenity/car_rental":{icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental"},name:"Car Rental"},"amenity/car_sharing":{icon:"maki-car",fields:["name","operator","capacity","payment_multi"],geometry:["point","area"],tags:{amenity:"car_sharing"},name:"Car Sharing"},"amenity/car_wash":{icon:"maki-car",fields:["address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"car_wash"},name:"Car Wash"},"amenity/casino":{icon:"maki-casino",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:"fas-charging-station",fields:["operator","capacity"],geometry:["point"],tags:{amenity:"charging_station"},terms:["EV","Electric Vehicle","Supercharger"],name:"Charging Station"},"amenity/childcare":{icon:"maki-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:"maki-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:"maki-doctor",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:"maki-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:"maki-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:"temaki-clock",fields:["name","support","display","visibility","date","faces"],geometry:["point","vertex"],tags:{amenity:"clock"},name:"Clock"},"amenity/college":{icon:"maki-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:"maki-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:"maki-car",geometry:["point","area"],tags:{amenity:"compressed_air"},name:"Compressed Air"},"amenity/courthouse":{icon:"maki-town-hall",fields:["name","operator","address","building_area"],geometry:["point","area"],tags:{amenity:"courthouse"},name:"Courthouse"},"amenity/crematorium":{icon:"maki-cemetery",fields:["name","website","phone","opening_hours","wheelchair"],geometry:["area","point"],tags:{amenity:"crematorium"},terms:["cemetery","funeral"],name:"Crematorium"},"amenity/dentist":{icon:"maki-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/dive_centre":{icon:"maki-swimming",fields:["name","operator","address","building_area","opening_hours","payment_multi","scuba_diving"],geometry:["point","area"],terms:["diving","scuba"],tags:{amenity:"dive_centre"},name:"Dive Center"},"amenity/doctors":{icon:"maki-doctor",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:"maki-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:"maki-drinking-water",geometry:["point"],tags:{amenity:"drinking_water"},terms:["fountain","potable"],name:"Drinking Water"},"amenity/driving_school":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"driving_school"},name:"Driving School"},"amenity/embassy":{icon:"maki-embassy",fields:["name","country","address","building_area"],geometry:["point","area"],tags:{amenity:"embassy"},name:"Embassy"},"amenity/fast_food":{icon:"maki-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/fast_food/burger":{icon:"maki-fast-food",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"burger"},reference:{key:"cuisine",value:"burger"},name:"Burger Fast Food"},"amenity/fast_food/chicken":{icon:"fas-drumstick-bite",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["breakfast","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"chicken"},reference:{key:"cuisine",value:"chicken"},name:"Chicken Fast Food"},"amenity/fast_food/fish_and_chips":{icon:"fas-fish",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","french fries"],tags:{amenity:"fast_food",cuisine:"fish_and_chips"},reference:{key:"cuisine",value:"fish_and_chips"},name:"Fish & Chips Fast Food"},"amenity/fast_food/kebab":{icon:"maki-restaurant",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"kebab"},reference:{key:"cuisine",value:"kebab"},name:"Kebab Fast Food"},"amenity/fast_food/pizza":{icon:"maki-restaurant-pizza",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"fast_food",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Fast Food"},"amenity/fast_food/sandwich":{icon:"maki-restaurant",fields:["name","cuisine","operator","address","building_area","opening_hours","takeaway","delivery","drive_through","smoking","outdoor_seating"],geometry:["point","area"],terms:["breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"fast_food",cuisine:"sandwich"},reference:{key:"cuisine",value:"sandwich"},name:"Sandwich Fast Food"},"amenity/fire_station":{icon:"maki-fire-station",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:[],tags:{amenity:"fire_station"},name:"Fire Station"},"amenity/food_court":{icon:"maki-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:"temaki-fountain",fields:["name"],geometry:["point","area"],tags:{amenity:"fountain"},name:"Fountain"},"amenity/fuel":{icon:"maki-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:"maki-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:"maki-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:"temaki-binoculars",fields:["access_simple"],geometry:["point","vertex","area"],terms:["game","gun","lookout","rifle","shoot*","wild","watch"],tags:{amenity:"hunting_stand"},name:"Hunting Stand"},"amenity/ice_cream":{icon:"maki-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:"temaki-antenna",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:"maki-school",fields:["name","operator","address"],geometry:["point","area"],terms:["kindergarden","pre-school"],tags:{amenity:"kindergarten"},name:"Preschool/Kindergarten Grounds"},"amenity/language_school":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours","language_multi"],geometry:["point","area"],terms:["esl"],tags:{amenity:"language_school"},name:"Language School"},"amenity/library":{icon:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building","opening_hours"],geometry:["point","area"],tags:{amenity:"marketplace"},name:"Marketplace"},"amenity/monastery":{icon:"maki-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/money_transfer":{icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],terms:["money order","check","bill","currency","finance","wire transfer","cable","person to person","cash to cash","exchange"],tags:{amenity:"money_transfer"},name:"Money Transfer Station"},"amenity/motorcycle_parking":{icon:"fas-motorcycle",fields:["capacity","operator","covered","access_simple"],geometry:["point","vertex","area"],tags:{amenity:"motorcycle_parking"},name:"Motorcycle Parking"},"amenity/music_school":{icon:"maki-school",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["school of music"],tags:{amenity:"music_school"},name:"Music School"},"amenity/nightclub":{icon:"maki-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:"maki-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:"maki-car",fields:["name","operator","parking","capacity","fee","access_simple","supervised","park_ride","surface","maxstay"],geometry:["point","vertex","area"],tags:{amenity:"parking"},terms:["automobile parking","car lot","car parking","rv parking","truck parking","vehicle parking"],name:"Parking Lot"},"amenity/parking/multi-storey":{icon:"maki-car",fields:["name","operator","building","levels","height","address","capacity","fee","access_simple"],geometry:["area"],tags:{amenity:"parking",parking:"multi-storey"},addTags:{building:"parking",amenity:"parking",parking:"multi-storey"},removeTags:{building:"parking",amenity:"parking",parking:"multi-storey"},reference:{key:"parking",value:"multi-storey"},terms:["car","indoor parking","multistorey car park","parkade","parking building","parking deck","parking garage","parking ramp","parking structure"],name:"Multilevel Parking Garage"},"amenity/payment_centre":{icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["check","tax pay","bill pay","currency","finance","cash","money"],tags:{amenity:"payment_centre"},name:"Payment Center"},"amenity/payment_terminal":{icon:"maki-bank",fields:["name","brand","address","opening_hours","payment_multi"],geometry:["point"],terms:["interactive kiosk","ekiosk","atm","bill pay","tax pay","phone pay","finance","cash","money transfer","card"],tags:{amenity:"payment_terminal"},name:"Payment Terminal"},"amenity/pharmacy":{icon:"maki-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:["apothecary","drug*","med*","prescription"],name:"Pharmacy"},"amenity/place_of_worship":{icon:"maki-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:"maki-religious-buddhist",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:"maki-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:"temaki-hinduism",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:"maki-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:"maki-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:"temaki-shinto",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:"temaki-sikhism",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:"temaki-taoism",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:"maki-museum",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["museum","astronomy","observatory"],tags:{amenity:"planetarium"},name:"Planetarium"},"amenity/police":{icon:"maki-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:"maki-post",fields:["operator","collection_times","drive_through","ref"],geometry:["point","vertex"],tags:{amenity:"post_box"},terms:["letter","post"],name:"Mailbox"},"amenity/post_office":{icon:"maki-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:"maki-prison",fields:["name","operator","address"],geometry:["point","area"],terms:["cell","jail"],tags:{amenity:"prison"},name:"Prison Grounds"},"amenity/pub":{icon:"maki-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:"maki-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:"maki-library",fields:["name","operator","capacity","website"],geometry:["point","area"],terms:["library","bookcrossing"],tags:{amenity:"public_bookcase"},name:"Public Bookcase"},"amenity/ranger_station":{icon:"maki-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:"maki-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_container":{icon:"maki-recycling",fields:["recycling_accepts","collection_times"],geometry:["point","area"],terms:["bin","can","bottle","glass","garbage","rubbish","scrap","trash"],tags:{amenity:"recycling",recycling_type:"container"},reference:{key:"amenity",value:"recycling"},name:"Recycling Container"},"amenity/restaurant":{icon:"maki-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/restaurant/american":{icon:"maki-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",cuisine:"american"},reference:{key:"cuisine",value:"american"},name:"American Restaurant"},"amenity/restaurant/asian":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"asian"},reference:{key:"cuisine",value:"asian"},name:"Asian Restaurant"},"amenity/restaurant/chinese":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"chinese"},reference:{key:"cuisine",value:"chinese"},name:"Chinese Restaurant"},"amenity/restaurant/french":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"french"},reference:{key:"cuisine",value:"french"},name:"French Restaurant"},"amenity/restaurant/german":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"german"},reference:{key:"cuisine",value:"german"},name:"German Restaurant"},"amenity/restaurant/greek":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","gyros","pitas","olives"],tags:{amenity:"restaurant",cuisine:"greek"},reference:{key:"cuisine",value:"greek"},name:"Greek Restaurant"},"amenity/restaurant/indian":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","curry"],tags:{amenity:"restaurant",cuisine:"indian"},reference:{key:"cuisine",value:"indian"},name:"Indian Restaurant"},"amenity/restaurant/italian":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","pasta","pizza"],tags:{amenity:"restaurant",cuisine:"italian"},reference:{key:"cuisine",value:"italian"},name:"Italian Restaurant"},"amenity/restaurant/japanese":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"japanese"},reference:{key:"cuisine",value:"japanese"},name:"Japanese Restaurant"},"amenity/restaurant/mexican":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","dine","dining","dinner","drive-in","eat","grill","lunch","table","tacos","burritos","enchiladas","fajitas","nachos","tortillas","salsa","tamales","quesadillas"],tags:{amenity:"restaurant",cuisine:"mexican"},reference:{key:"cuisine",value:"mexican"},name:"Mexican Restaurant"},"amenity/restaurant/noodle":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","ramen noodles","soup","soba noodles","cellophane noodles","rice noodles"],tags:{amenity:"restaurant",cuisine:"noodle"},reference:{key:"cuisine",value:"noodle"},name:"Noodle Restaurant"},"amenity/restaurant/pizza":{icon:"maki-restaurant-pizza",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","dine","dining","dinner","drive-in","eat","lunch","table","deep dish","thin crust","slice"],tags:{amenity:"restaurant",cuisine:"pizza"},reference:{key:"cuisine",value:"pizza"},name:"Pizza Restaurant"},"amenity/restaurant/seafood":{icon:"maki-restaurant-seafood",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","dine","dining","dinner","drive-in","eat","grill","lunch","table","fish","shellfish","molluscs","crustaceans","clams","oysters","lobsters","crab","shrimp","squid","octopus"],tags:{amenity:"restaurant",cuisine:"seafood"},reference:{key:"cuisine",value:"seafood"},name:"Seafood Restaurant"},"amenity/restaurant/steakhouse":{icon:"maki-slaughterhouse",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table","steak house","chop house","beef"],tags:{amenity:"restaurant",cuisine:"steak_house"},reference:{key:"cuisine",value:"steak_house"},name:"Steakhouse"},"amenity/restaurant/sushi":{icon:"fas-fish",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"sushi"},reference:{key:"cuisine",value:"sushi"},name:"Sushi Restaurant"},"amenity/restaurant/thai":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"thai"},reference:{key:"cuisine",value:"thai"},name:"Thai Restaurant"},"amenity/restaurant/turkish":{icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"turkish"},reference:{key:"cuisine",value:"turkish"},name:"Turkish Restaurant"},"amenity/restaurant/vietnamese":{icon:"maki-restaurant-noodle",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],terms:["bar","breakfast","cafe","café","canteen","dine","dining","dinner","drive-in","eat","grill","lunch","table"],tags:{amenity:"restaurant",cuisine:"vietnamese"},reference:{key:"cuisine",value:"vietnamese"},name:"Vietnamese Restaurant"},"amenity/sanitary_dump_station":{icon:"temaki-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:"maki-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:"maki-shelter",fields:["name","shelter_type","building_area","bench","bin"],geometry:["point","vertex","area"],terms:["lean-to","gazebo","picnic"],tags:{amenity:"shelter"},name:"Shelter"},"amenity/shelter/gazebo":{icon:"maki-shelter",fields:["name","building_area","bench","lit"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"gazebo"},name:"Gazebo"},"amenity/shelter/lean_to":{icon:"maki-shelter",fields:["name","operator","building_area"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"lean_to"},name:"Lean-To"},"amenity/shelter/picnic_shelter":{icon:"maki-shelter",fields:["name","shelter_type","building_area","lit","bin"],geometry:["point","area"],tags:{amenity:"shelter",shelter_type:"picnic_shelter"},reference:{key:"shelter_type",value:"picnic_shelter"},terms:["pavilion"],name:"Picnic Shelter"},"amenity/shelter/public_transport":{icon:"maki-shelter",fields:["name","shelter_type","building_area","bench","lit"],geometry:["point","area"],terms:["bus stop","metro stop","waiting"],tags:{amenity:"shelter",shelter_type:"public_transport"},reference:{key:"shelter_type",value:"public_transport"},name:"Transit Shelter"},"amenity/shower":{icon:"temaki-shower",fields:["operator","opening_hours","fee","supervised","building_area","access_simple"],geometry:["point","vertex","area"],terms:["rain closet"],tags:{amenity:"shower"},name:"Shower"},"amenity/smoking_area":{icon:"fas-smoking",fields:["name","shelter","bin","bench","opening_hours"],geometry:["point","vertex","area"],terms:[],tags:{amenity:"smoking_area"},name:"Smoking Area"},"amenity/social_facility":{icon:"temaki-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:"temaki-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:"maki-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:"temaki-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:"maki-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:"maki-karaoke",fields:["name","studio","address","building_area"],geometry:["point","area"],terms:["recording","radio","television"],tags:{amenity:"studio"},name:"Studio"},"amenity/taxi":{icon:"fas-taxi",fields:["name","operator","capacity"],geometry:["point","vertex","area"],terms:["cab"],tags:{amenity:"taxi"},name:"Taxi Stand"},"amenity/telephone":{icon:"maki-telephone",fields:["operator","phone","fee","payment_multi","covered","indoor","booth"],geometry:["point","vertex"],tags:{amenity:"telephone"},terms:["phone"],name:"Telephone"},"amenity/theatre":{icon:"maki-theatre",fields:["name","operator","address","building_area"],geometry:["point","area"],terms:["theatre","performance","play","musical"],tags:{amenity:"theatre"},name:"Theater"},"amenity/theatre/type/amphi":{icon:"maki-theatre",fields:["name","operator","address","lit"],geometry:["point","area"],terms:["open air","outdoor","greek","ampi"],tags:{amenity:"theatre","theatre:type":"amphi"},name:"Amphitheatre"},"amenity/toilets":{icon:"maki-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:"maki-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:"maki-college",fields:["name","operator","address","internet_access","internet_access/ssid"],geometry:["point","area"],terms:["college"],tags:{amenity:"university"},name:"University Grounds"},"amenity/vehicle_inspection":{icon:"maki-car",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["car inspection"],tags:{amenity:"vehicle_inspection"},name:"Vehicle Inspection"},"amenity/vending_machine":{icon:"temaki-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:"temaki-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:"temaki-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:"temaki-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:"temaki-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:"temaki-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:"temaki-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:"temaki-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:"temaki-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:"temaki-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:"temaki-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:"maki-fuel",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:"temaki-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:"temaki-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:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],terms:["mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup;parcel_mail_in"},reference:{key:"vending",value:"parcel_pickup;parcel_mail_in"},name:"Parcel Pickup/Dropoff Locker"},"amenity/vending_machine/parcel_pickup":{icon:"temaki-vending_machine",fields:["vending","operator"],geometry:["point"],terms:["amazon","locker","mail","parcel","pickup"],tags:{amenity:"vending_machine",vending:"parcel_pickup"},reference:{key:"vending",value:"parcel_pickup"},name:"Parcel Pickup Locker"},"amenity/vending_machine/parking_tickets":{icon:"temaki-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:"temaki-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:"temaki-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:"temaki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-drinking-water",geometry:["area","vertex","point"],tags:{amenity:"water_point"},name:"RV Drinking Water"},"amenity/watering_place":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"temaki-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:"maki-amusement-park",fields:["name","operator"],geometry:["point","area"],terms:["theme park","amusement ride","labyrinth"],tags:{attraction:"maze"},name:"Maze"},"attraction/pirate_ship":{icon:"maki-danger",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:"maki-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:"maki-amusement-park",fields:["name","operator","opening_hours"],geometry:["point","area"],terms:["theme park","amusement ride"],tags:{attraction:"roller_coaster"},name:"Roller Coaster"},"attraction/summer_toboggan":{fields:["name","operator","opening_hours"],geometry:["line"],terms:["alpine slide","mountain coaster"],tags:{attraction:"summer_toboggan"},name:"Summer Toboggan"},"attraction/train":{icon:"maki-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:"maki-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:"maki-roadblock",geometry:["point","vertex","line","area"],tags:{barrier:"*"},fields:["barrier"],name:"Barrier",matchScore:0.4},"barrier/entrance":{icon:"maki-entrance-alt1",geometry:["vertex"],tags:{barrier:"entrance"},name:"Entrance",searchable:false},"barrier/block":{icon:"maki-roadblock",fields:["access"],geometry:["point","vertex"],tags:{barrier:"block"},name:"Block"},"barrier/bollard":{icon:"maki-roadblock",fields:["access"],geometry:["point","vertex","line"],tags:{barrier:"bollard"},name:"Bollard"},"barrier/border_control":{icon:"maki-roadblock",fields:["access","building_area"],geometry:["vertex","area"],tags:{barrier:"border_control"},name:"Border Control"},"barrier/cattle_grid":{icon:"maki-barrier",geometry:["vertex"],tags:{barrier:"cattle_grid"},name:"Cattle Grid"},"barrier/city_wall":{icon:"maki-barrier",fields:["height"],geometry:["line","area"],tags:{barrier:"city_wall"},name:"City Wall"},"barrier/cycle_barrier":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"cycle_barrier"},name:"Cycle Barrier"},"barrier/ditch":{icon:"maki-roadblock",geometry:["line","area"],tags:{barrier:"ditch"},name:"Trench",matchScore:0.25},"barrier/fence":{icon:"maki-fence",fields:["fence_type","height"],geometry:["line"],tags:{barrier:"fence"},name:"Fence",matchScore:0.25},"barrier/fence/railing":{icon:"maki-barrier",geometry:["line"],tags:{barrier:"fence",fence_type:"railing"},fields:["height"],name:"Railing",terms:["railing","handrail","guard rail"],matchScore:0.5},"barrier/gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex","line"],tags:{barrier:"gate"},name:"Gate"},"barrier/guard_rail":{icon:"maki-barrier",geometry:["line"],tags:{barrier:"guard_rail"},name:"Guard Rail",terms:["guardrail","traffic barrier","crash barrier","median barrier","roadside barrier","Armco barrier"],matchScore:0.75},"barrier/hedge":{fields:["height"],geometry:["line","area"],tags:{barrier:"hedge"},name:"Hedge",matchScore:0.25},"barrier/kerb":{fields:["kerb","tactile_paving"],geometry:["vertex","line"],tags:{barrier:"kerb"},name:"Curb"},"barrier/kerb/flush":{icon:"maki-wheelchair",fields:["kerb","tactile_paving"],geometry:["vertex","line"],tags:{barrier:"kerb",kerb:"flush"},reference:{key:"kerb",value:"flush"},terms:["even curb","level curb","tactile curb"],name:"Flush Curb"},"barrier/kerb/lowered":{icon:"maki-wheelchair",fields:["kerb","tactile_paving"],geometry:["vertex","line"],tags:{barrier:"kerb",kerb:"lowered"},reference:{key:"kerb",value:"lowered"},terms:["curb cut","curb ramp","kerb ramp","dropped kerb","pram ramp"],name:"Lowered Curb"},"barrier/kissing_gate":{icon:"maki-barrier",fields:["access"],geometry:["vertex"],tags:{barrier:"kissing_gate"},name:"Kissing Gate"},"barrier/lift_gate":{icon:"maki-roadblock",fields:["access"],geometry:["vertex","line"],tags:{barrier:"lift_gate"},name:"Lift Gate"},"barrier/retaining_wall":{fields:["height"],geometry:["line","area"],tags:{barrier:"retaining_wall"},name:"Retaining Wall"},"barrier/stile":{icon:"maki-roadblock",fields:["access"],geometry:["vertex"],tags:{barrier:"stile"},name:"Stile"},"barrier/toll_booth":{icon:"maki-roadblock",fields:["access","building_area"],geometry:["vertex","area"],tags:{barrier:"toll_booth"},name:"Toll Booth"},"barrier/wall":{icon:"maki-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"]},"bridge/support":{icon:"fas-archway",fields:["bridge/support"],geometry:["point","vertex","area"],tags:{"bridge:support":"*"},name:"Bridge Support"},"bridge/support/pier":{icon:"fas-archway",fields:["bridge/support"],geometry:["point","vertex","area"],tags:{"bridge:support":"pier"},name:"Bridge Pier"},building:{icon:"maki-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:"maki-entrance-alt1",geometry:["vertex"],tags:{building:"entrance"},name:"Entrance/Exit",searchable:false},"building/train_station":{icon:"maki-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:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"apartments"},matchScore:0.5,name:"Apartments"},"building/barn":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"barn"},matchScore:0.5,name:"Barn"},"building/boathouse":{icon:"maki-harbor",fields:["name","levels","height","address"],geometry:["area"],tags:{building:"boathouse"},matchScore:0.5,terms:[],name:"Boathouse"},"building/bungalow":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"bungalow"},terms:["home","detached"],matchScore:0.5,name:"Bungalow"},"building/cabin":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"cabin"},matchScore:0.5,name:"Cabin"},"building/carport":{icon:"fas-warehouse",fields:["height","capacity"],geometry:["area"],tags:{building:"carport"},matchScore:0.5,terms:["covered parking space","garage","car","porch"],name:"Carport"},"building/cathedral":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"cathedral"},matchScore:0.5,name:"Cathedral Building"},"building/chapel":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"chapel"},matchScore:0.5,name:"Chapel Building"},"building/church":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"church"},matchScore:0.5,name:"Church Building"},"building/civic":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"civic"},matchScore:0.5,name:"Civic Building"},"building/college":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["university"],tags:{building:"college"},matchScore:0.5,name:"College Building"},"building/commercial":{icon:"maki-suitcase",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"commercial"},matchScore:0.5,name:"Commercial Building"},"building/construction":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"construction"},matchScore:0.5,name:"Building Under Construction"},"building/detached":{icon:"maki-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:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"dormitory"},matchScore:0.5,name:"Dormitory"},"building/farm_auxiliary":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"farm_auxiliary"},matchScore:0.5,name:"Farm Building"},"building/farm":{icon:"maki-farm",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"farm"},matchScore:0.5,name:"Farm House"},"building/garage":{icon:"fas-warehouse",fields:["name","capacity"],geometry:["area"],tags:{building:"garage"},matchScore:0.5,name:"Garage"},"building/garages":{icon:"fas-warehouse",fields:["name","capacity"],geometry:["area"],tags:{building:"garages"},matchScore:0.5,name:"Garages"},"building/grandstand":{icon:"maki-building",fields:["name","height"],geometry:["area"],tags:{building:"grandstand"},terms:["tribune","stand","stands","bleachers"],matchScore:0.5,name:"Grandstand"},"building/greenhouse":{icon:"maki-garden-center",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"greenhouse"},matchScore:0.5,name:"Greenhouse"},"building/hospital":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"hospital"},matchScore:0.5,name:"Hospital Building"},"building/hotel":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"hotel"},matchScore:0.5,name:"Hotel Building"},"building/house":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"house"},terms:["home","family","residence","dwelling"],matchScore:0.5,name:"House"},"building/hut":{icon:"maki-home",geometry:["area"],fields:["name"],tags:{building:"hut"},matchScore:0.5,name:"Hut"},"building/industrial":{icon:"maki-industry",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"industrial"},matchScore:0.5,name:"Industrial Building"},"building/kindergarten":{icon:"maki-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:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"mosque"},matchScore:0.5,name:"Mosque Building"},"building/pavilion":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],terms:["sports"],tags:{building:"pavilion"},matchScore:0.5,name:"Pavilion Building"},"building/public":{icon:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"public"},matchScore:0.5,name:"Public Building"},"building/residential":{icon:"maki-residential-community",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"residential"},matchScore:0.5,name:"Residential Building"},"building/retail":{icon:"maki-commercial",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"retail"},matchScore:0.5,name:"Retail Building"},"building/roof":{icon:"maki-shelter",fields:["name","address","layer"],geometry:["area"],tags:{building:"roof"},matchScore:0.5,name:"Roof"},"building/ruins":{icon:"temaki-ruins",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"ruins"},matchScore:0.5,name:"Building Ruins"},"building/school":{icon:"maki-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:"maki-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:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"service"},matchScore:0.5,name:"Service Building"},"building/shed":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"shed"},matchScore:0.5,name:"Shed"},"building/stable":{icon:"maki-horse-riding",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"stable"},matchScore:0.5,name:"Stable"},"building/stadium":{icon:"maki-stadium",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"stadium"},matchScore:0.5,name:"Stadium Building"},"building/static_caravan":{icon:"maki-home",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"static_caravan"},matchScore:0.5,name:"Static Mobile Home"},"building/temple":{icon:"maki-place-of-worship",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"temple"},matchScore:0.5,name:"Temple Building"},"building/terrace":{icon:"maki-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:"maki-building",fields:["name","address","levels","height","smoking"],geometry:["area"],tags:{building:"transportation"},matchScore:0.5,name:"Transportation Building"},"building/university":{icon:"maki-building",fields:["name","address","levels","height"],geometry:["area"],terms:["college"],tags:{building:"university"},matchScore:0.5,name:"University Building"},"building/warehouse":{icon:"maki-warehouse",fields:["name","address","levels","height"],geometry:["area"],tags:{building:"warehouse"},matchScore:0.5,name:"Warehouse"},"camp_site/camp_pitch":{icon:"maki-campsite",fields:["name","ref"],geometry:["point","area"],terms:["tent","rv"],tags:{camp_site:"camp_pitch"},name:"Camp Pitch"},club:{icon:"maki-heart",fields:["name","club","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{club:"*"},terms:["social"],name:"Club"},craft:{icon:"temaki-tools",fields:["name","craft","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"*"},terms:[],name:"Craft"},"craft/jeweler":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"basket_maker"},name:"Basket Maker"},"craft/beekeeper":{icon:"maki-farm",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"beekeeper"},name:"Beekeeper"},"craft/blacksmith":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"blacksmith"},name:"Blacksmith"},"craft/boatbuilder":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"boatbuilder"},matchScore:0.4,name:"Boat Builder"},"craft/bookbinder":{icon:"maki-library",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["book repair"],tags:{craft:"bookbinder"},name:"Bookbinder"},"craft/brewery":{icon:"temaki-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:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["woodworker"],tags:{craft:"carpenter"},name:"Carpenter"},"craft/carpet_layer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"carpet_layer"},name:"Carpet Layer"},"craft/caterer":{icon:"maki-restaurant",fields:["name","cuisine","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"caterer"},name:"Caterer"},"craft/chimney_sweeper":{icon:"temaki-chimney",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"chimney_sweeper"},name:"Chimney Sweeper"},"craft/clockmaker":{icon:"temaki-clock",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"clockmaker"},name:"Clockmaker"},"craft/confectionery":{icon:"maki-confectionary",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["sweet","candy"],tags:{craft:"confectionery"},name:"Candy Maker"},"craft/distillery":{icon:"temaki-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:"maki-clothing-store",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["seamstress"],tags:{craft:"dressmaker"},name:"Dressmaker"},"craft/electrician":{icon:"temaki-power",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["power","wire"],tags:{craft:"electrician"},name:"Electrician"},"craft/electronics_repair":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"electronics_repair"},name:"Electronics Repair Shop"},"craft/gardener":{icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["landscaper","grounds keeper"],tags:{craft:"gardener"},name:"Gardener"},"craft/glaziery":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["glass","stained-glass","window"],tags:{craft:"glaziery"},name:"Glaziery"},"craft/handicraft":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"handicraft"},name:"Handicraft"},"craft/hvac":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["heat*","vent*","air conditioning"],tags:{craft:"hvac"},name:"HVAC"},"craft/insulator":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"insulation"},name:"Insulator"},"craft/key_cutter":{icon:"fas-key",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"key_cutter"},name:"Key Cutter"},"craft/metal_construction":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"metal_construction"},name:"Metal Construction"},"craft/painter":{icon:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"painter"},name:"Painter"},"craft/photographer":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"photographer"},name:"Photographer"},"craft/photographic_laboratory":{icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["film"],tags:{craft:"photographic_laboratory"},name:"Photographic Laboratory"},"craft/plasterer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"plasterer"},name:"Plasterer"},"craft/plumber":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["pipe"],tags:{craft:"plumber"},name:"Plumber"},"craft/pottery":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["ceramic"],tags:{craft:"pottery"},name:"Pottery"},"craft/rigger":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"rigger"},name:"Rigger"},"craft/roofer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"roofer"},name:"Roofer"},"craft/saddler":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"saddler"},name:"Saddler"},"craft/sailmaker":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"sailmaker"},name:"Sailmaker"},"craft/sawmill":{icon:"maki-logging",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["lumber"],tags:{craft:"sawmill"},name:"Sawmill"},"craft/scaffolder":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"scaffolder"},name:"Scaffolder"},"craft/sculptor":{icon:"maki-art-gallery",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"sculptor"},name:"Sculptor"},"craft/shoemaker":{icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["cobbler"],tags:{craft:"shoemaker"},name:"Shoemaker"},"craft/stonemason":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["masonry"],tags:{craft:"stonemason"},name:"Stonemason"},"craft/tiler":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"tiler"},name:"Tiler"},"craft/tinsmith":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"tinsmith"},name:"Tinsmith"},"craft/upholsterer":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"upholsterer"},name:"Upholsterer"},"craft/watchmaker":{icon:"maki-watch",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"watchmaker"},name:"Watchmaker"},"craft/window_construction":{icon:"temaki-window",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["glass"],tags:{craft:"window_construction"},name:"Window Construction"},"craft/winery":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{craft:"winery"},name:"Winery"},"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:"fas-ambulance",fields:["name","operator","building_area","address"],geometry:["point","area"],terms:["EMS","EMT","rescue"],tags:{emergency:"ambulance_station"},name:"Ambulance Station"},"emergency/defibrillator":{icon:"maki-defibrillator",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["AED"],tags:{emergency:"defibrillator"},name:"Defibrillator"},"emergency/fire_alarm":{icon:"fas-bell",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_alarm_box"},name:"Fire Alarm Call Box"},"emergency/fire_extinguisher":{icon:"fas-fire-extinguisher",fields:["indoor","ref","operator"],geometry:["point","vertex"],tags:{emergency:"fire_extinguisher"},name:"Fire Extinguisher"},"emergency/fire_hydrant":{icon:"temaki-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/first_aid_kit":{icon:"fas-medkit",fields:["indoor","ref","operator"],geometry:["point","vertex"],terms:["bandage","first aid","med","med kit","medic*","medkit"],tags:{emergency:"first_aid_kit"},name:"First Aid Kit"},"emergency/life_ring":{icon:"fas-life-ring",fields:["ref","operator"],geometry:["point","vertex"],terms:["life buoy","kisby ring","kisbie ring","perry buoy"],tags:{emergency:"life_ring"},name:"Life Ring"},"emergency/lifeguard":{icon:"fas-life-ring",fields:["ref","operator","building_area","opening_hours"],geometry:["point","area"],terms:["CPR","rescue"],tags:{emergency:"lifeguard"},name:"Lifeguard"},"emergency/phone":{icon:"maki-emergency-phone",fields:["ref","operator","covered","indoor","booth"],geometry:["point","vertex"],tags:{emergency:"phone"},name:"Emergency Phone"},"emergency/siren":{icon:"fas-volume-up",fields:["siren/purpose","siren/type","ref","operator"],geometry:["point","vertex"],terms:["air raid","loud","noise","storm","tornado","warning"],tags:{emergency:"siren"},name:"Siren"},"emergency/water_tank":{icon:"maki-water",fields:["name","ref","operator"],geometry:["point","vertex"],terms:["water tank","cistern","reservoir"],tags:{emergency:"water_tank"},name:"Emergency Water Tank"},entrance:{icon:"maki-entrance-alt1",geometry:["vertex"],terms:["entrance","exit","door"],tags:{entrance:"*"},fields:["entrance","access_simple","address"],name:"Entrance/Exit"},ford:{geometry:["vertex"],tags:{ford:"yes"},name:"Ford"},"golf/bunker":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"bunker",natural:"sand"},terms:["hazard","bunker"],reference:{key:"golf",value:"bunker"},name:"Sand Trap"},"golf/fairway":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"fairway",landuse:"grass"},reference:{key:"golf",value:"fairway"},name:"Fairway"},"golf/green":{icon:"maki-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:"maki-golf",fields:["name","ref_golf_hole","par","handicap"],geometry:["line"],tags:{golf:"hole"},name:"Golf Hole"},"golf/lateral_water_hazard_area":{icon:"maki-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:"maki-golf",fields:["name"],geometry:["line"],tags:{golf:"lateral_water_hazard"},name:"Lateral Water Hazard"},"golf/rough":{icon:"maki-golf",fields:["name"],geometry:["area"],tags:{golf:"rough",landuse:"grass"},reference:{key:"golf",value:"rough"},name:"Rough"},"golf/tee":{icon:"maki-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:"maki-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:"maki-golf",fields:["name"],geometry:["line"],tags:{golf:"water_hazard"},name:"Water Hazard"},healthcare:{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"iD-highway-bridleway",geometry:["line"],tags:{highway:"bridleway"},terms:["bridleway","equestrian","horse","trail"],name:"Bridle Path"},"highway/bus_guideway":{icon:"iD-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:"iD-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/zebra-raised":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/crossing/zebra":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"zebra"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/crossing/marked-raised":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/crossing/marked":{icon:"temaki-pedestrian",fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],tags:{highway:"crossing",crossing:"marked"},reference:{key:"highway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk"},"highway/crossing/unmarked-raised":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],addTags:{highway:"crossing",crossing:"unmarked",traffic_calming:"table"},removeTags:{highway:"crossing",crossing:"unmarked",traffic_calming:"table"},tags:{highway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/crossing/unmarked":{fields:["crossing","kerb","tactile_paving"],geometry:["vertex"],addTags:{highway:"crossing",crossing:"unmarked"},removeTags:{highway:"crossing",crossing:"unmarked"},tags:{highway:"crossing"},reference:{key:"highway",value:"crossing"},terms:[],name:"Unmarked Crossing"},"highway/cycleway":{icon:"iD-highway-cycleway",fields:["name","oneway","surface","lit","width","structure","access"],geometry:["line"],tags:{highway:"cycleway"},terms:["bike"],name:"Cycle Path"},"highway/elevator":{icon:"temaki-elevator",fields:["access_simple","opening_hours","maxweight","ref"],geometry:["vertex"],tags:{highway:"elevator"},terms:["lift"],name:"Elevator"},"highway/footway":{icon:"iD-highway-footway",fields:["name","surface","lit","width","structure","access"],geometry:["line"],terms:["hike","hiking","trackway","trail","walk"],tags:{highway:"footway"},name:"Foot Path"},"highway/footway/zebra-raised":{icon:"iD-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","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)",searchable:false},"highway/footway/zebra":{icon:"iD-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","marked crossing","crosswalk"],name:"Marked Crosswalk",searchable:false},"highway/footway/conveying":{icon:"iD-highway-footway",fields:["name","conveying","access_simple","lit","width"],geometry:["line"],terms:["moving sidewalk","autwalk","skywalk","travolator","travelator","travellator","conveyor"],tags:{highway:"footway",conveying:"*"},name:"Moving Walkway"},"highway/footway/marked-raised":{icon:"iD-highway-footway",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"marked",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["zebra crossing","marked crossing","crosswalk","flat top","hump","speed","slow"],name:"Marked Crosswalk (Raised)"},"highway/footway/marked":{icon:"iD-highway-footway",fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],tags:{highway:"footway",footway:"crossing",crossing:"marked"},reference:{key:"footway",value:"crossing"},terms:["zebra crossing","marked crossing","crosswalk"],name:"Marked Crosswalk"},"highway/footway/sidewalk":{icon:"iD-highway-footway",fields:["surface","lit","width","structure","access"],geometry:["line"],tags:{highway:"footway",footway:"sidewalk"},reference:{key:"footway",value:"sidewalk"},terms:["pavement","sidepath"],name:"Sidewalk"},"highway/footway/unmarked-raised":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],addTags:{highway:"footway",footway:"crossing",crossing:"unmarked",traffic_calming:"table"},removeTags:{highway:"footway",footway:"crossing",crossing:"unmarked",traffic_calming:"table"},tags:{highway:"footway",footway:"crossing",traffic_calming:"table"},reference:{key:"traffic_calming",value:"table"},terms:["flat top","hump","speed","slow"],name:"Unmarked Crossing (Raised)"},"highway/footway/unmarked":{fields:["crossing","access","surface","kerb","tactile_paving"],geometry:["line"],addTags:{highway:"footway",footway:"crossing",crossing:"unmarked"},removeTags:{highway:"footway",footway:"crossing",crossing:"unmarked"},tags:{highway:"footway",footway:"crossing"},reference:{key:"footway",value:"crossing"},terms:[],name:"Unmarked Crossing"},"highway/give_way":{icon:"temaki-yield",fields:["direction_vertex"],geometry:["vertex"],tags:{highway:"give_way"},terms:["give way","yield","sign"],name:"Yield Sign"},"highway/living_street":{icon:"iD-highway-living-street",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","access","cycleway"],geometry:["line"],tags:{highway:"living_street"},name:"Living Street"},"highway/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["distance","direction_vertex"],tags:{highway:"milestone"},terms:["milestone","marker"],name:"Highway Milestone"},"highway/mini_roundabout":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"mini_roundabout"},fields:["direction_clock"],name:"Mini-Roundabout"},"highway/motorway_junction":{icon:"temaki-junction",fields:["ref_highway_junction","name"],geometry:["vertex"],tags:{highway:"motorway_junction"},terms:["exit"],name:"Motorway Junction / Exit"},"highway/motorway_link":{icon:"iD-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:["exit","ramp","road","street","on ramp","off ramp"],name:"Motorway Link"},"highway/motorway":{icon:"iD-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","road","street","thruway","turnpike"],name:"Motorway"},"highway/passing_place":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"passing_place"},terms:["turnout, pullout"],name:"Passing Place"},"highway/path":{icon:"iD-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:"temaki-pedestrian",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:"iD-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:"iD-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:["on ramp","off ramp","ramp","road","street"],name:"Primary Link"},"highway/primary":{icon:"iD-highway-primary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"primary"},terms:["road","street"],name:"Primary Road"},"highway/raceway":{icon:"iD-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:"iD-highway-residential",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],geometry:["line"],tags:{highway:"residential"},terms:["road","street"],name:"Residential Road"},"highway/rest_area":{icon:"maki-car",fields:["name"],geometry:["point","vertex","area"],tags:{highway:"rest_area"},terms:["rest stop"],name:"Rest Area"},"highway/road":{icon:"iD-highway-road",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"road"},terms:["road","street"],name:"Unknown Road"},"highway/secondary_link":{icon:"iD-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:["on ramp","off ramp","ramp","road","street"],name:"Secondary Link"},"highway/secondary":{icon:"iD-highway-secondary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"secondary"},terms:["road","street"],name:"Secondary Road"},"highway/service":{icon:"iD-highway-service",fields:["name","service","oneway","maxspeed","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"service"},terms:["road","street"],name:"Service Road"},"highway/service/alley":{icon:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"maki-car",fields:["name"],geometry:["point","vertex","area"],tags:{highway:"services"},terms:["services","travel plaza","service station"],name:"Service Area"},"highway/speed_camera":{icon:"maki-attraction",geometry:["point","vertex"],fields:["direction","ref","maxspeed"],tags:{highway:"speed_camera"},terms:[],name:"Speed Camera"},"highway/steps":{icon:"iD-highway-steps",fields:["surface","lit","width","incline_steps","handrail","step_count"],geometry:["line"],tags:{highway:"steps"},terms:["stairs","staircase"],name:"Steps"},"highway/steps/conveying":{icon:"maki-entrance",fields:["name","incline_steps","conveying","access_simple","lit","width","handrail","step_count"],geometry:["line"],terms:["moving staircase","moving stairway","people mover"],tags:{highway:"steps",conveying:"*"},name:"Escalator"},"highway/stop":{icon:"temaki-stop",fields:["stop","direction_vertex"],geometry:["vertex"],tags:{highway:"stop"},terms:["stop","halt","sign"],name:"Stop Sign"},"highway/street_lamp":{icon:"temaki-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:"iD-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:["on ramp","off ramp","ramp","road","street"],name:"Tertiary Link"},"highway/tertiary":{icon:"iD-highway-tertiary",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","ref_road_number","cycleway","access"],geometry:["line"],tags:{highway:"tertiary"},terms:["road","street"],name:"Tertiary Road"},"highway/track":{icon:"iD-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:"temaki-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:"iD-highway-trunk-link",fields:["name","ref_road_number","oneway","maxspeed","maxspeed/advisory","lanes","surface","structure","maxheight","access"],geometry:["line"],tags:{highway:"trunk_link"},terms:["on ramp","off ramp","ramp","road","street"],name:"Trunk Link"},"highway/trunk":{icon:"iD-highway-trunk",fields:["name","ref_road_number","oneway","maxspeed","lanes","surface","structure","maxheight","toll","access"],geometry:["line"],tags:{highway:"trunk"},terms:["road","street"],name:"Trunk Road"},"highway/turning_circle":{icon:"maki-circle-stroked",geometry:["vertex"],tags:{highway:"turning_circle"},terms:["cul-de-sac"],name:"Turning Circle"},"highway/turning_loop":{icon:"maki-circle",geometry:["vertex"],tags:{highway:"turning_loop"},terms:["cul-de-sac"],name:"Turning Loop (Island)"},"highway/unclassified":{icon:"iD-highway-unclassified",fields:["name","oneway","maxspeed","lanes","surface","structure","maxheight","cycleway","access"],geometry:["line"],tags:{highway:"unclassified"},terms:["road","street"],name:"Minor/Unclassified Road"},historic:{icon:"temaki-ruins",fields:["historic","inscription"],geometry:["point","vertex","area"],tags:{historic:"*"},name:"Historic Site"},"historic/archaeological_site":{icon:"temaki-ruins",fields:["name","site_type","historic/civilization","inscription"],geometry:["point","vertex","area"],tags:{historic:"archaeological_site"},name:"Archaeological Site"},"historic/boundary_stone":{icon:"temaki-milestone",fields:["name","inscription"],geometry:["point","vertex"],tags:{historic:"boundary_stone"},name:"Boundary Stone"},"historic/castle":{icon:"maki-castle",fields:["name","castle_type","building_area","historic/civilization"],geometry:["point","area"],tags:{historic:"castle"},name:"Castle"},"historic/memorial":{icon:"maki-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:"maki-monument",fields:["name","inscription"],geometry:["point","vertex","area"],tags:{historic:"monument"},name:"Monument"},"historic/ruins":{icon:"temaki-ruins",fields:["name","historic/civilization","inscription"],geometry:["point","vertex","area"],tags:{historic:"ruins"},name:"Ruins"},"historic/tomb":{icon:"maki-cemetery",fields:["name","tomb","building_area","inscription"],geometry:["point","area"],tags:{historic:"tomb"},name:"Tomb"},"historic/wayside_cross":{icon:"maki-religious-christian",fields:["name","inscription"],geometry:["point","vertex","area"],tags:{historic:"wayside_cross"},name:"Wayside Cross"},"historic/wayside_shrine":{icon:"maki-landmark",fields:["name","religion","denomination","inscription"],geometry:["point","vertex","area"],tags:{historic:"wayside_shrine"},name:"Wayside Shrine"},"historic/wreck":{icon:"temaki-ruins",fields:["name","access_simple","seamark/wreck/category","historic/wreck/date_sunk","historic/wreck/visible_at_low_tide","historic/wreck/visible_at_high_tide"],geometry:["point","area"],tags:{historic:"wreck"},addTags:{historic:"wreck","seamark:type":"wreck"},removeTags:{historic:"wreck","seamark:type":"wreck"},terms:["hull","mast","maritime","remains","ship","boat"],name:"Shipwreck"},"internet_access/wlan":{icon:"fas-wifi",geometry:["point","area"],fields:["internet_access/fee","internet_access/ssid"],terms:["wi-fi","wifi","hotspot"],tags:{internet_access:"wlan"},name:"Wi-Fi Hotspot"},junction:{icon:"temaki-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:"maki-farm",fields:["name","operator","crop"],geometry:["point","area"],tags:{landuse:"farm"},terms:[],name:"Farmland",searchable:false},"landuse/allotments":{icon:"maki-garden-center",geometry:["area"],fields:["name"],tags:{landuse:"allotments"},terms:["allotment","garden"],name:"Community Garden"},"landuse/aquaculture":{icon:"maki-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:"maki-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:"maki-cemetery",fields:["name","religion","denomination"],geometry:["area"],tags:{landuse:"cemetery"},terms:[],name:"Cemetery"},"landuse/churchyard":{icon:"maki-religious-christian",fields:["name","religion","denomination"],geometry:["area"],tags:{landuse:"churchyard"},terms:[],name:"Churchyard"},"landuse/commercial":{icon:"maki-suitcase",fields:["name"],geometry:["area"],tags:{landuse:"commercial"},terms:[],matchScore:0.9,name:"Commercial Area"},"landuse/construction":{icon:"temaki-tools",fields:["name","construction","operator"],geometry:["area"],tags:{landuse:"construction"},terms:[],name:"Construction"},"landuse/farmland":{icon:"maki-farm",fields:["name","operator","crop","produce"],geometry:["area"],tags:{landuse:"farmland"},terms:["crop","grow","plant"],name:"Farmland"},"landuse/farmyard":{icon:"maki-farm",fields:["name","operator","crop"],geometry:["area"],tags:{landuse:"farmyard"},terms:["crop","grow","plant"],name:"Farmyard"},"landuse/forest":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle","produce"],geometry:["area"],tags:{landuse:"forest"},terms:["cut","forest","lumber","tree"],name:"Forest"},"landuse/garages":{icon:"fas-warehouse",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:"maki-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:"maki-harbor",fields:["name","operator"],geometry:["area"],terms:["boat"],tags:{landuse:"harbour"},name:"Harbor"},"landuse/industrial":{icon:"maki-industry",fields:["name","industrial"],geometry:["area"],tags:{landuse:"industrial"},terms:[],matchScore:0.9,name:"Industrial Area"},"landuse/industrial/scrap_yard":{icon:"maki-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:"maki-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:"maki-garden",geometry:["area"],fields:["name"],tags:{landuse:"meadow"},terms:[],name:"Meadow"},"landuse/military":{icon:"temaki-military",fields:["name"],geometry:["area"],tags:{landuse:"military"},terms:[],matchScore:0.9,name:"Military Area"},"landuse/military/airfield":{icon:"maki-airfield",fields:["name","iata","icao"],geometry:["point","area"],tags:{military:"airfield"},addTags:{aeroway:"aerodrome",landuse:"military",military:"airfield"},removeTags:{aeroway:"aerodrome",landuse:"military",military:"airfield"},reference:{key:"military",value:"airfield"},terms:["aerodrome","aeroway","air force","airplane","airport","army","base","bomb","fight","force","guard","heli*","jet","marine","navy","plane","troop","war"],name:"Military Airfield"},"landuse/military/barracks":{icon:"temaki-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:"temaki-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:"maki-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:"maki-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:"temaki-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:"maki-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:"temaki-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:"temaki-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:"temaki-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:"temaki-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:"maki-park-alt1",fields:["name","operator","trees"],geometry:["area"],tags:{landuse:"orchard"},terms:["fruit"],name:"Orchard"},"landuse/plant_nursery":{icon:"maki-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:"maki-rail",fields:["operator"],geometry:["area"],tags:{landuse:"railway"},terms:["rail","train","track"],name:"Railway Corridor"},"landuse/recreation_ground":{icon:"maki-pitch",geometry:["area"],fields:["name"],tags:{landuse:"recreation_ground"},terms:["playing fields"],name:"Recreation Ground"},"landuse/religious":{icon:"maki-place-of-worship",geometry:["area"],fields:["name","religion","denomination"],tags:{landuse:"religious"},terms:[],name:"Religious Area"},"landuse/residential":{icon:"maki-building",geometry:["area"],tags:{landuse:"residential"},terms:[],matchScore:0.9,name:"Residential Area"},"landuse/retail":{icon:"maki-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:"maki-pitch",fields:["name","leisure"],geometry:["point","vertex","area"],tags:{leisure:"*"},name:"Leisure"},"leisure/adult_gaming_centre":{icon:"maki-casino",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:"maki-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/bandstand":{icon:"maki-music",fields:["name","building_area","operator"],geometry:["point","area"],tags:{leisure:"bandstand"},name:"Bandstand"},"leisure/beach_resort":{icon:"maki-beach",fields:["name","address","fee"],geometry:["point","area"],tags:{leisure:"beach_resort"},name:"Beach Resort"},"leisure/bird_hide":{icon:"temaki-binoculars",fields:["building_area"],geometry:["point","area"],tags:{leisure:"bird_hide"},terms:["machan","ornithology"],name:"Bird Hide"},"leisure/bleachers":{geometry:["point","area"],tags:{leisure:"bleachers"},terms:["crowd","bench","sports","stand","stands","seat","seating"],name:"Bleachers"},"leisure/bowling_alley":{icon:"temaki-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:"temaki-pedestrian",geometry:["point","area"],fields:["name"],terms:["open space"],tags:{leisure:"common"},name:"Common"},"leisure/dance":{icon:"maki-music",fields:["name","operator","address","building_area","dance/style","opening_hours"],geometry:["point","area"],terms:["ballroom","jive","swing","tango","waltz"],tags:{leisure:"dance"},name:"Dance Hall"},"leisure/dancing_school":{icon:"maki-music",fields:["name","operator","address","building_area","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:"maki-dog-park",geometry:["point","area"],fields:["name"],terms:[],tags:{leisure:"dog_park"},name:"Dog Park"},"leisure/firepit":{icon:"maki-fire-station",fields:["access_simple"],geometry:["point","area"],tags:{leisure:"firepit"},terms:["fireplace","campfire"],name:"Firepit"},"leisure/fishing":{icon:"fas-fish",fields:["name","access_simple"],geometry:["point","area"],tags:{leisure:"fishing"},terms:["angler"],name:"Fishing Spot"},"leisure/fitness_centre":{icon:"fas-dumbbell",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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-garden",fields:["name","access_simple"],geometry:["point","vertex","area"],tags:{leisure:"garden"},name:"Garden"},"leisure/golf_course":{icon:"maki-golf",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["links"],tags:{leisure:"golf_course"},name:"Golf Course"},"leisure/hackerspace":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-park",geometry:["point","area"],fields:["name"],tags:{leisure:"nature_reserve"},terms:["protected","wildlife"],name:"Nature Reserve"},"leisure/outdoor_seating":{icon:"maki-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:"maki-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:"maki-picnic-site",geometry:["point"],tags:{leisure:"picnic_table"},terms:["bench"],name:"Picnic Table"},"leisure/pitch":{icon:"maki-pitch",fields:["name","sport","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch"},terms:["field"],name:"Sport Pitch"},"leisure/pitch/american_football":{icon:"maki-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/badminton":{icon:"maki-tennis",fields:["name","surface","lit","access_simple"],geometry:["point","area"],tags:{leisure:"pitch",sport:"badminton"},reference:{key:"sport",value:"badminton"},terms:[],name:"Badminton Court"},"leisure/pitch/baseball":{icon:"maki-baseball",fields:["name","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"baseball"},reference:{key:"sport",value:"baseball"},terms:[],name:"Baseball Field"},"leisure/pitch/basketball":{icon:"maki-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:"maki-volleyball",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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-skateboard",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:"maki-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/softball":{icon:"maki-baseball",fields:["name","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"softball"},reference:{key:"sport",value:"softball"},terms:["softball","diamond"],name:"Softball Field"},"leisure/pitch/table_tennis":{icon:"maki-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:"maki-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:"maki-volleyball",fields:["name","surface","lit"],geometry:["point","area"],tags:{leisure:"pitch",sport:"volleyball"},reference:{key:"sport",value:"volleyball"},terms:[],name:"Volleyball Court"},"leisure/playground":{icon:"maki-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:"maki-lodging",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{leisure:"resort"},name:"Resort"},"leisure/running_track":{icon:"maki-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":{icon:"fas-thermometer-three-quarters",fields:["name","operator","address","opening_hours","access_simple","fee"],geometry:["point","area"],tags:{leisure:"sauna"},name:"Sauna"},"leisure/slipway":{icon:"maki-slipway",fields:["name","access_simple","fee"],geometry:["point","vertex","line"],terms:["boat launch","boat ramp","boat landing"],tags:{leisure:"slipway"},name:"Slipway"},"leisure/sports_centre":{icon:"maki-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:"maki-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:"maki-pitch",fields:["name","sport","address"],geometry:["point","area"],tags:{leisure:"stadium"},name:"Stadium"},"leisure/swimming_pool":{icon:"maki-swimming",fields:["name","access_simple","operator","address","lit","location_pool","length","swimming_pool"],geometry:["point","area"],terms:["dive","water","aquatics"],tags:{leisure:"swimming_pool"},name:"Swimming Pool"},"leisure/track":{icon:"iD-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:"maki-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:"temaki-storage_tank",fields:["name","man_made"],geometry:["point","vertex","line","area"],tags:{man_made:"*"},name:"Man Made"},"man_made/adit":{icon:"maki-triangle",geometry:["point","area"],fields:["operator","direction"],terms:["entrance","underground","mine","cave"],tags:{man_made:"adit"},name:"Adit"},"man_made/antenna":{icon:"temaki-antenna",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":{icon:"maki-bridge",fields:["name","bridge","layer","maxweight"],geometry:["area"],tags:{man_made:"bridge"},addTags:{man_made:"bridge",layer:"1"},removeTags:{man_made:"bridge",layer:"*"},reference:{key:"man_made",value:"bridge"},name:"Bridge"},"man_made/bunker_silo":{icon:"temaki-silo",fields:["content"],geometry:["point","area"],terms:["Silage","Storage"],tags:{man_made:"bunker_silo"},name:"Bunker Silo"},"man_made/chimney":{icon:"temaki-chimney",geometry:["point","area"],tags:{man_made:"chimney"},name:"Chimney"},"man_made/clearcut":{icon:"maki-logging",geometry:["area"],tags:{man_made:"clearcut"},terms:["cut","forest","lumber","tree","wood"],name:"Clearcut Forest"},"man_made/crane":{icon:"temaki-crane",fields:["operator","height","crane/type"],geometry:["point","line","vertex","area"],tags:{man_made:"crane"},name:"Crane"},"man_made/cutline":{icon:"maki-logging",geometry:["line"],tags:{man_made:"cutline"},name:"Cut line"},"man_made/embankment":{geometry:["line"],tags:{man_made:"embankment"},name:"Embankment"},"man_made/flagpole":{icon:"maki-embassy",fields:["operator","flag/type","country","lit","height"],geometry:["point","vertex"],tags:{man_made:"flagpole"},name:"Flagpole"},"man_made/gasometer":{icon:"temaki-storage_tank",fields:["content","building_area"],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:"maki-lighthouse",fields:["building_area"],geometry:["point","area"],tags:{man_made:"lighthouse"},name:"Lighthouse"},"man_made/mast":{icon:"maki-communications-tower",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/mast/communication":{icon:"maki-communications-tower",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","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Mast"},"man_made/mast/communication/mobile_phone":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point"],terms:["antenna","cell mast","cell phone mast","cell phone tower","cell tower","communication mast","communication tower","guyed tower","mobile phone tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:mobile_phone":"yes"},reference:{key:"communication:mobile_phone",value:"yes"},name:"Mobile Phone Mast"},"man_made/mast/communication/radio":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","radio mast","radio tower","transmission mast","transmission tower"],tags:{man_made:"mast","tower:type":"communication","communication:radio":"yes"},reference:{key:"communication:radio",value:"yes"},name:"Radio Broadcast Mast"},"man_made/mast/communication/television":{icon:"maki-communications-tower",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point"],terms:["antenna","broadcast tower","communication mast","communication tower","guyed tower","television mast","television tower","transmission mast","transmission tower","tv mast","tv tower"],tags:{man_made:"mast","tower:type":"communication","communication:television":"yes"},reference:{key:"communication:television",value:"yes"},name:"Television Broadcast Mast"},"man_made/monitoring_station":{icon:"temaki-antenna",geometry:["point","area"],fields:["monitoring_multi","operator"],terms:["weather","earthquake","seismology","air","gps"],tags:{man_made:"monitoring_station"},name:"Monitoring Station"},"man_made/observatory":{geometry:["point","area"],terms:["astronomical","meteorological"],tags:{man_made:"observatory"},name:"Observatory"},"man_made/petroleum_well":{icon:"temaki-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":{icon:"iD-highway-footway",fields:["name","surface","lit","width","access"],geometry:["line","area"],terms:["dock","jetty"],tags:{man_made:"pier"},name:"Pier"},"man_made/pipeline":{icon:"iD-pipeline-line",fields:["location","operator","substance","layer"],geometry:["line"],terms:["oil","natural gas","water","sewer","sewage"],tags:{man_made:"pipeline"},name:"Pipeline"},"man_made/pumping_station":{icon:"maki-water",geometry:["point","area"],tags:{man_made:"pumping_station"},name:"Pumping Station"},"man_made/silo":{icon:"temaki-silo",fields:["crop","building_area"],geometry:["point","area"],terms:["grain","corn","wheat"],tags:{man_made:"silo"},name:"Silo"},"man_made/storage_tank":{icon:"temaki-storage_tank",fields:["content","building_area"],geometry:["point","area"],terms:["water","oil","gas","petrol"],tags:{man_made:"storage_tank"},name:"Storage Tank"},"man_made/surveillance":{icon:"maki-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/surveillance/camera":{icon:"maki-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/survey_point":{icon:"maki-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:"temaki-tower",fields:["tower/type","tower/construction","height"],geometry:["point","area"],tags:{man_made:"tower"},name:"Tower"},"man_made/tower/communication":{icon:"temaki-tower",fields:["tower/type","tower/construction","height","communication_multi"],geometry:["point","area"],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:"tower","tower:type":"communication"},reference:{key:"tower:type",value:"communication"},name:"Communication Tower"},"man_made/tower/observation":{icon:"temaki-tower",fields:["tower/type","tower/construction","height"],geometry:["point","area"],terms:["lookout tower","fire tower"],tags:{man_made:"tower","tower:type":"observation"},reference:{key:"tower:type",value:"observation"},name:"Observation Tower"},"man_made/wastewater_plant":{icon:"maki-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:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_tower"},name:"Water Tower"},"man_made/water_well":{icon:"maki-water",fields:["operator"],geometry:["point","area"],tags:{man_made:"water_well"},name:"Water Well"},"man_made/water_works":{icon:"maki-water",fields:["name","operator","address"],geometry:["point","area"],tags:{man_made:"water_works"},name:"Water Works"},"man_made/watermill":{icon:"maki-watermill",fields:["building_area"],geometry:["point","area"],terms:["water","wheel","mill"],tags:{man_made:"watermill"},name:"Watermill"},"man_made/windmill":{icon:"maki-windmill",fields:["building_area"],geometry:["point","area"],terms:["wind","wheel","mill"],tags:{man_made:"windmill"},name:"Windmill"},"man_made/works":{icon:"maki-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:"maki-circle-stroked",fields:["manhole","operator","label","ref"],geometry:["point","vertex"],tags:{manhole:"*"},terms:["cover","hole","sewer","sewage","telecom"],name:"Manhole"},"manhole/drain":{icon:"maki-water",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"drain"},terms:["cover","drain","hole","rain","sewer","sewage","storm"],name:"Storm Drain"},"manhole/telecom":{icon:"maki-circle-stroked",fields:["operator","ref"],geometry:["point","vertex"],tags:{manhole:"telecom"},terms:["cover","phone","hole","telecom","telephone","bt"],name:"Telecom Manhole"},natural:{icon:"maki-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:"temaki-beach",geometry:["point","area"],fields:["name"],tags:{natural:"bay"},terms:[],name:"Bay"},"natural/beach":{icon:"temaki-beach",fields:["surface"],geometry:["point","area"],tags:{natural:"beach"},terms:["shore"],name:"Beach"},"natural/cave_entrance":{icon:"maki-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:"maki-triangle",fields:["name","height"],geometry:["point","vertex","line","area"],tags:{natural:"cliff"},terms:["crag","escarpment","rock face","scarp"],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:"maki-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/reef":{icon:"temaki-beach",geometry:["point","area"],tags:{natural:"reef"},terms:["barrier","coral","ocean","sand","shoal"],name:"Reef"},"natural/ridge":{geometry:["line"],tags:{natural:"ridge"},terms:["crest"],name:"Ridge"},"natural/saddle":{icon:"maki-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:"maki-water",fields:["name","intermittent"],geometry:["point","vertex"],tags:{natural:"spring"},terms:[],name:"Spring"},"natural/tree_row":{icon:"maki-park",fields:["leaf_type","leaf_cycle","denotation"],geometry:["line"],tags:{natural:"tree_row"},terms:[],name:"Tree Row"},"natural/tree":{icon:"maki-park",fields:["leaf_type_singular","leaf_cycle_singular","denotation"],geometry:["point","vertex"],tags:{natural:"tree"},terms:[],name:"Tree"},"natural/volcano":{icon:"maki-volcano",fields:["name","elevation","volcano/status","volcano/type"],geometry:["point","vertex"],tags:{natural:"volcano"},terms:["mountain","crater"],name:"Volcano"},"natural/water":{icon:"maki-water",fields:["water"],geometry:["area"],tags:{natural:"water"},name:"Water"},"natural/water/lake":{icon:"maki-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:"maki-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:"maki-water",fields:["name","intermittent"],geometry:["area"],tags:{natural:"water",water:"reservoir"},reference:{key:"natural",value:"water"},name:"Reservoir"},"natural/wetland":{icon:"maki-wetland",fields:["wetland"],geometry:["point","area"],tags:{natural:"wetland"},terms:["bog","marsh","reedbed","swamp","tidalflat"],name:"Wetland"},"natural/wood":{icon:"maki-park-alt1",fields:["name","leaf_type","leaf_cycle"],geometry:["point","area"],tags:{natural:"wood"},terms:["tree"],name:"Wood"},"noexit/yes":{icon:"maki-barrier",geometry:["vertex"],terms:["no exit","road end","dead end"],tags:{noexit:"yes"},reference:{key:"noexit",value:"*"},name:"No Exit"},office:{icon:"maki-suitcase",fields:["name","office","address","building_area","opening_hours","smoking"],geometry:["point","vertex","area"],tags:{office:"*"},terms:[],name:"Office"},"office/administrative":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"administrative"},terms:[],searchable:false,name:"Administrative Office"},"office/physician":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"physician"},searchable:false,name:"Physician"},"office/travel_agent":{icon:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"accountant"},terms:[],name:"Accountant Office"},"office/adoption_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"adoption_agency"},terms:[],name:"Adoption Agency"},"office/advertising_agency":{icon:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"architect"},terms:[],name:"Architect Office"},"office/association":{icon:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"charity"},terms:["charitable organization"],name:"Charity Office"},"office/company":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","smoking"],geometry:["point","area"],tags:{office:"company"},terms:[],name:"Corporate Office"},"office/coworking":{icon:"maki-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:"maki-school",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"educational_institution"},terms:[],name:"Educational Institution"},"office/employment_agency":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"employment_agency"},terms:["job"],name:"Employment Agency"},"office/energy_supplier":{icon:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"estate_agent"},terms:[],name:"Real Estate Office"},"office/financial":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"financial"},terms:[],name:"Financial Office"},"office/forestry":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"forestry"},terms:["forest","ranger"],name:"Forestry Office"},"office/foundation":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"foundation"},terms:[],name:"Foundation Office"},"office/government":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"insurance"},terms:[],name:"Insurance Office"},"office/it":{icon:"maki-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:"fas-balance-scale",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"lawyer"},terms:[],name:"Law Office"},"office/lawyer/notary":{icon:"maki-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:"fas-people-carry",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"moving_company"},terms:["relocation"],name:"Moving Company Office"},"office/newspaper":{icon:"maki-library",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"newspaper"},terms:[],name:"Newspaper Office"},"office/ngo":{icon:"maki-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:"maki-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:"maki-town-hall",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"political_party"},terms:[],name:"Political Party"},"office/private_investigator":{icon:"maki-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:"maki-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/religion":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours","religion","denomination"],geometry:["point","area"],tags:{office:"religion"},terms:[],name:"Religious Office"},"office/research":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"research"},terms:[],name:"Research Office"},"office/surveyor":{icon:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"surveyor"},terms:[],name:"Surveyor Office"},"office/tax_advisor":{icon:"maki-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:"maki-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:"maki-suitcase",fields:["name","address","building_area","opening_hours"],geometry:["point","area"],tags:{office:"therapist"},terms:["therapy"],name:"Therapist Office"},"office/water_utility":{icon:"maki-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/downhill":{icon:"maki-skiing",fields:["name","piste/type","piste/difficulty_downhill","piste/grooming_downhill","oneway","lit"],geometry:["line","area"],terms:["ski","alpine","snowboard","downhill","piste"],tags:{"piste:type":"downhill"},name:"Downhill Piste/Ski Run"},"piste/hike":{icon:"fas-snowflake",fields:["name","piste/type","piste/difficulty","piste/grooming_hike","oneway","lit"],geometry:["line","area"],terms:["hike","winter hiking","snowshoe","snowshoeing","piste","ski"],tags:{"piste:type":"hike"},name:"Snowshoeing or Winter Hiking Trail"},"piste/ice_skate":{icon:"fas-snowflake",fields:["name","piste/type","sport_ice","oneway","lit"],geometry:["line","area"],terms:["ice","skating","ski","piste"],tags:{"piste:type":"ice_skate"},name:"Ice Skating Piste"},"piste/nordic":{icon:"maki-skiing",fields:["name","piste/type","piste/difficulty_nordic","piste/grooming_nordic","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","skating","piste"],tags:{"piste:type":"nordic"},name:"Nordic or Crosscountry Piste/Ski Trail"},"piste/piste":{icon:"maki-skiing",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","nordic","crosscountry","downhill","alpine","snowboard","skitour","ski touring","sled","luge","sleigh","sledge","ski-joring","husky","horse","winter hiking","snowshoe","snowshoeing","ice","skating"],tags:{"piste:type":"*"},name:"Winter Sport Trails"},"piste/skitour":{icon:"maki-skiing",fields:["name","piste/type","piste/difficulty_skitour","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","skitour","crosscountry","ski touring","piste"],tags:{"piste:type":"skitour"},name:"Ski Touring Trail"},"piste/sled":{icon:"fas-snowflake",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","sled","luge","sleigh","sledge","piste"],tags:{"piste:type":"sled"},name:"Sled Piste"},"piste/sleigh":{icon:"fas-snowflake",fields:["name","piste/type","piste/difficulty","piste/grooming","oneway","lit"],geometry:["line","area"],terms:["ski","piste","sled","luge","sleigh","sledge","ski-joring","husky","horse"],tags:{"piste:type":"sleigh"},name:"Sleigh Piste"},"place/farm":{icon:"maki-farm",geometry:["point","area"],fields:["name"],tags:{place:"farm"},name:"Farm",searchable:false},"place/city_block":{icon:"maki-triangle-stroked",fields:["name"],geometry:["point","area"],tags:{place:"city_block"},name:"City Block"},"place/city":{icon:"maki-city",fields:["name","population"],geometry:["point","area"],tags:{place:"city"},name:"City"},"place/hamlet":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"hamlet"},name:"Hamlet"},"place/island":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"island"},name:"Island"},"place/islet":{icon:"maki-mountain",geometry:["point","area"],fields:["name"],terms:["archipelago","atoll","bar","cay","isle","islet","key","reef"],tags:{place:"islet"},name:"Islet"},"place/isolated_dwelling":{icon:"maki-home",geometry:["point","area"],fields:["name"],tags:{place:"isolated_dwelling"},name:"Isolated Dwelling"},"place/locality":{icon:"maki-triangle-stroked",geometry:["point","area"],fields:["name"],tags:{place:"locality"},name:"Locality"},"place/neighbourhood":{icon:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"neighbourhood"},terms:["neighbourhood"],name:"Neighborhood"},"place/plot":{icon:"maki-triangle-stroked",fields:["name"],geometry:["point","area"],tags:{place:"plot"},terms:["tract","land","lot","parcel"],name:"Plot"},"place/quarter":{icon:"maki-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:"maki-triangle-stroked",fields:["name","population"],geometry:["point","area"],tags:{place:"suburb"},terms:["boro","borough","quarter"],name:"Borough / Suburb"},"place/town":{icon:"maki-town",fields:["name","population"],geometry:["point","area"],tags:{place:"town"},name:"Town"},"place/village":{icon:"maki-village",fields:["name","population"],geometry:["point","area"],tags:{place:"village"},name:"Village"},"playground/balance_beam":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"balancebeam"},name:"Play Balance Beam"},"playground/basket_spinner":{icon:"maki-playground",geometry:["point"],terms:["basket rotator"],tags:{playground:"basketrotator"},name:"Basket Spinner"},"playground/basket_swing":{icon:"maki-playground",geometry:["point"],tags:{playground:"basketswing"},name:"Basket Swing"},"playground/climbing_frame":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"climbingframe"},name:"Climbing Frame"},"playground/cushion":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"cushion"},name:"Bouncy Cushion"},"playground/horizontal_bar":{icon:"maki-pitch",fields:["height"],geometry:["point"],terms:["high bar"],tags:{playground:"horizontal_bar"},name:"Play Horizontal Bar"},"playground/rocker":{icon:"maki-playground",geometry:["point"],tags:{playground:"springy"},name:"Spring Rider",terms:["spring rocker","springy rocker"]},"playground/roundabout":{icon:"maki-stadium",fields:["bench"],geometry:["point","area"],tags:{playground:"roundabout"},name:"Play Roundabout",terms:["merry-go-round"]},"playground/sandpit":{icon:"maki-playground",geometry:["point","area"],tags:{playground:"sandpit"},name:"Sandpit"},"playground/seesaw":{icon:"maki-playground",geometry:["point"],tags:{playground:"seesaw"},name:"Seesaw"},"playground/slide":{icon:"maki-playground",geometry:["point","line"],tags:{playground:"slide"},name:"Slide"},"playground/structure":{icon:"maki-pitch",geometry:["point","area"],tags:{playground:"structure"},name:"Play Structure"},"playground/swing":{icon:"maki-playground",fields:["capacity","playground/baby","wheelchair"],geometry:["point"],tags:{playground:"swing"},name:"Swing"},"playground/zipwire":{icon:"maki-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:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"sub_station"},reference:{key:"power",value:"substation"},name:"Substation",searchable:false},"power/cable/underground":{fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"cable",location:"underground"},name:"Underground Power Cable"},"power/generator":{icon:"temaki-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/method/photovoltaic":{icon:"fas-solar-panel",fields:["operator","generator/output/electricity","ref"],geometry:["point","vertex","area"],terms:["photovoltaic module","PV module","sunlight"],tags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel"},addTags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel","generator:output:electricity":"yes"},removeTags:{power:"generator","generator:source":"solar","generator:method":"photovoltaic","generator:type":"solar_photovoltaic_panel","generator:output:electricity":"yes"},reference:{key:"generator:method",value:"photovoltaic"},name:"Solar Panel"},"power/generator/source/nuclear":{icon:"temaki-radiation",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:"temaki-wind_turbine",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:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"line"},name:"Power Line"},"power/minor_line":{icon:"iD-power-line",fields:["name","operator","voltage","ref","layer"],geometry:["line"],tags:{power:"minor_line"},name:"Minor Power Line"},"power/plant":{icon:"maki-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:["point","vertex"],tags:{power:"pole"},name:"Power Pole"},"power/substation":{icon:"temaki-power",fields:["substation","operator","building","ref"],geometry:["point","area"],tags:{power:"substation"},name:"Substation"},"power/switch":{icon:"temaki-power",fields:["switch","operator","location","cables","voltage","ref"],geometry:["point","vertex","area"],tags:{power:"switch"},name:"Power Switch"},"power/tower":{fields:["design","ref"],geometry:["point","vertex"],terms:["power"],tags:{power:"tower"},name:"High-Voltage Tower"},"power/transformer":{icon:"temaki-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:"iD-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:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],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:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"iD-highway-footway",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],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:"iD-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:"iD-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:"maki-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:"maki-bus",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],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:"maki-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:"temaki-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:"temaki-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:"temaki-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:"maki-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:"temaki-tram",fields:["name","ref_platform","network","operator","surface","lit","bench","shelter","passenger_information_display"],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:"temaki-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:"maki-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:"maki-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:"maki-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:"maki-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:"temaki-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:"temaki-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:"temaki-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:"maki-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:"maki-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:"temaki-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:"temaki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"temaki-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:"temaki-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:"temaki-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:"maki-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:"temaki-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:"temaki-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:"maki-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:"maki-rail",geometry:["point","vertex"],tags:{railway:"halt"},terms:["break","interrupt","rest","wait","interruption"],name:"Train Station (Halt / Request)",searchable:false},"railway/platform":{icon:"iD-highway-footway",fields:["name","ref_platform","surface","lit","shelter"],geometry:["line","area"],tags:{railway:"platform"},name:"Train Stop / Platform",searchable:false},"railway/station":{icon:"maki-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:"temaki-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:"iD-railway-abandoned",fields:["name","structure","service_rail","usage_rail"],geometry:["line"],tags:{railway:"abandoned"},terms:[],name:"Abandoned Railway"},"railway/buffer_stop":{icon:"temaki-buffer_stop",geometry:["vertex"],tags:{railway:"buffer_stop"},terms:["stop","halt","buffer"],name:"Buffer Stop"},"railway/crossing":{icon:"temaki-pedestrian",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:"maki-roadblock",geometry:["vertex"],tags:{railway:"derail"},terms:["derailer"],name:"Railway Derailer"},"railway/disused":{icon:"iD-railway-disused",fields:["structure","service_rail","usage_rail"],geometry:["line"],tags:{railway:"disused"},terms:[],name:"Disused Railway"},"railway/funicular":{icon:"iD-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:"maki-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:"iD-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:"temaki-milestone",geometry:["point","vertex"],fields:["railway/position","direction_vertex"],tags:{railway:"milestone"},terms:["milestone","marker"],name:"Railway Milestone"},"railway/miniature":{icon:"iD-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:"iD-railway-monorail",fields:["name","structure","electrified","service_rail","usage_rail","voltage","frequency"],geometry:["line"],tags:{railway:"monorail"},terms:[],name:"Monorail"},"railway/narrow_gauge":{icon:"iD-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:"iD-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:"temaki-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:"maki-entrance",geometry:["point","vertex"],fields:["name"],tags:{railway:"subway_entrance"},terms:["metro","transit"],name:"Subway Entrance"},"railway/subway":{icon:"iD-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:"temaki-junction",geometry:["vertex"],tags:{railway:"switch"},terms:["switch","points"],name:"Railway Switch"},"railway/train_wash":{icon:"maki-rail",geometry:["point","vertex","area"],fields:["operator","building_area"],tags:{railway:"wash"},terms:["wash","clean"],name:"Train Wash"},"railway/tram":{icon:"iD-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:"iD-relation",fields:["name","relation"],geometry:["relation"],tags:{},name:"Relation"},"route/ferry":{icon:"iD-ferry-line",geometry:["line"],fields:["name","operator","duration","access","to","from"],tags:{route:"ferry"},name:"Ferry Route"},"seamark/beacon_isolated_danger":{fields:["ref","operator","seamark/beacon_isolated_danger/shape"],geometry:["point","vertex"],terms:["beacon isolated danger","isolated danger beacon","iala"],tags:{"seamark:type":"beacon_isolated_danger"},name:"Danger Beacon"},"seamark/beacon_lateral":{fields:["ref","operator","seamark/beacon_lateral/colour","seamark/beacon_lateral/category","seamark/beacon_lateral/shape","seamark/beacon_lateral/system"],geometry:["point","vertex"],terms:["lateral beacon","beacon lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"beacon_lateral"},name:"Channel Beacon"},"seamark/buoy_lateral":{fields:["ref","operator","seamark/buoy_lateral/colour","seamark/buoy_lateral/category","seamark/buoy_lateral/shape","seamark/buoy_lateral/system"],geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral"},name:"Channel Buoy"},"seamark/buoy_lateral/green":{fields:["ref","operator","seamark/buoy_lateral/colour","seamark/buoy_lateral/category","seamark/buoy_lateral/shape","seamark/buoy_lateral/system"],geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"green"},name:"Green Buoy"},"seamark/buoy_lateral/red":{fields:["ref","operator","seamark/buoy_lateral/colour","seamark/buoy_lateral/category","seamark/buoy_lateral/shape","seamark/buoy_lateral/system"],geometry:["point","vertex"],terms:["lateral buoy","buoy lateral","cevni","channel marker","iala","lateral mark"],tags:{"seamark:type":"buoy_lateral","seamark:buoy_lateral:colour":"red"},name:"Red Buoy"},"seamark/mooring":{fields:["ref","operator","seamark/mooring/category"],geometry:["point"],terms:["dolphin","pile","bollard","buoy","post"],tags:{"seamark:type":"mooring"},name:"Mooring"},shop:{icon:"maki-shop",fields:["name","shop","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"*"},terms:[],name:"Shop"},"shop/fishmonger":{icon:"maki-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:"maki-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:"maki-shop",fields:["name","address","building_area"],geometry:["point","area"],tags:{shop:"vacant"},name:"Vacant Shop",searchable:false},"shop/agrarian":{icon:"maki-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:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"antiques"},name:"Antiques Shop"},"shop/appliance":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery"},name:"Bakery"},"shop/bathroom_furnishing":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed"},name:"Bedding/Mattress Store"},"shop/beverages":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages"},name:"Beverage Store"},"shop/bicycle":{icon:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["betting"],tags:{shop:"bookmaker"},name:"Bookmaker"},"shop/books":{icon:"maki-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:"maki-shop",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"boutique"},name:"Boutique"},"shop/butcher":{icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["meat"],tags:{shop:"butcher"},name:"Butcher"},"shop/candles":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"candles"},name:"Candle Shop"},"shop/car_parts":{icon:"maki-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:"maki-car-repair",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:"maki-car",fields:["name","brand","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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["rug"],tags:{shop:"carpet"},name:"Carpet Store"},"shop/catalogue":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"catalogue"},name:"Catalog Shop"},"shop/charity":{icon:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cheese"},name:"Cheese Store"},"shop/chemist":{icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist"},terms:["apothecary","med*","drug*","gift"],name:"Drugstore"},"shop/chocolate":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chocolate"},name:"Chocolate Store"},"shop/clothes":{icon:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"coffee"},name:"Coffee Store"},"shop/computer":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"computer"},name:"Computer Store"},"shop/confectionery":{icon:"maki-confectionary",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["sweet"],tags:{shop:"confectionery"},name:"Candy Store"},"shop/convenience":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience"},name:"Convenience Store"},"shop/copyshop":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"copyshop"},name:"Copy Store"},"shop/cosmetics":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics"},name:"Cosmetics Store"},"shop/country_store":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"country_store"},name:"Country Store"},"shop/craft":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store"},name:"Department Store"},"shop/doityourself":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself"},name:"DIY Store"},"shop/dry_cleaning":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-shop",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"fashion"},name:"Fashion Store"},"shop/florist":{icon:"maki-florist",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["flower"],tags:{shop:"florist"},name:"Florist"},"shop/frame":{icon:"maki-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:"maki-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:"fas-couch",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:"maki-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:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["fruit","vegetable"],tags:{shop:"greengrocer"},name:"Greengrocer"},"shop/hairdresser_supply":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["barber","shampoo","conditioner"],tags:{shop:"hairdresser_supply"},name:"Hairdresser Supply Store"},"shop/hairdresser":{icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["barber"],tags:{shop:"hairdresser"},name:"Hairdresser"},"shop/hardware":{icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hardware"},name:"Hardware Store"},"shop/health_food":{icon:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"herbalist"},name:"Herbalist"},"shop/hifi":{icon:"maki-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:"fas-blender",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:"maki-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:"maki-jewelry-store",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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk"},name:"Kiosk"},"shop/kitchen":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"kitchen"},name:"Kitchen Design Store"},"shop/laundry":{icon:"maki-laundry",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"laundry"},name:"Laundry"},"shop/leather":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"leather"},name:"Leather Store"},"shop/locksmith":{icon:"fas-key",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["key","lockpick"],tags:{shop:"locksmith"},name:"Locksmith"},"shop/lottery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"lottery"},name:"Lottery Shop"},"shop/mall":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["shopping"],tags:{shop:"mall"},name:"Mall"},"shop/massage":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"massage"},name:"Massage Shop"},"shop/medical_supply":{icon:"maki-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:"maki-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:"maki-bank",fields:["name","operator","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender"},name:"Money Lender"},"shop/motorcycle_repair":{icon:"fas-motorcycle",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],terms:["auto","bike","garage","motorcycle","repair","service"],tags:{shop:"motorcycle_repair"},name:"Motorcycle Repair Shop"},"shop/motorcycle":{icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["bike"],tags:{shop:"motorcycle"},name:"Motorcycle Dealership"},"shop/music":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["eye","glasses"],tags:{shop:"optician"},name:"Optician"},"shop/organic":{icon:"maki-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:"maki-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:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint"},name:"Paint Store"},"shop/party":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["balloons","costumes","decorations","invitations"],tags:{shop:"party"},name:"Party Supply Store"},"shop/pastry":{icon:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pawnbroker"},name:"Pawn Shop"},"shop/perfumery":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery"},name:"Perfume Store"},"shop/pet_grooming":{icon:"maki-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:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pyrotechnics"},name:"Fireworks Store"},"shop/radiotechnics":{icon:"maki-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:"maki-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:"maki-swimming",fields:["name","operator","address","building_area","opening_hours","payment_multi","scuba_diving"],geometry:["point","area"],terms:["diving","scuba"],tags:{shop:"scuba_diving"},name:"Scuba Diving Shop"},"shop/seafood":{icon:"maki-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:"maki-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/sewing":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],terms:["haberdashery"],tags:{shop:"sewing"},name:"Sewing Supply Shop"},"shop/shoes":{icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes"},name:"Shoe Store"},"shop/sports":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports"},name:"Sporting Goods Store"},"shop/stationery":{icon:"maki-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:"fas-warehouse",fields:["name","operator","address","building","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"storage_rental"},name:"Storage Rental"},"shop/supermarket":{icon:"maki-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:"maki-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:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tattoo"},name:"Tattoo Parlor"},"shop/tea":{icon:"maki-teahouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tea"},name:"Tea Store"},"shop/ticket":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"ticket"},name:"Ticket Seller"},"shop/tiles":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tiles"},name:"Tile Shop"},"shop/tobacco":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tobacco"},name:"Tobacco Shop"},"shop/toys":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys"},name:"Toy Store"},"shop/trade":{icon:"maki-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:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency"},name:"Travel Agency"},"shop/tyres":{icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres"},name:"Tire Store"},"shop/vacuum_cleaner":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-watch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"watches"},name:"Watches Shop"},"shop/water_sports":{icon:"maki-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:"maki-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:"maki-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:"temaki-window",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"window_blind"},name:"Window Blind Store"},"shop/wine":{icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"wine"},name:"Wine Shop"},tourism:{icon:"maki-attraction",fields:["name","tourism"],geometry:["point","vertex","area"],tags:{tourism:"*"},name:"Tourism"},"tourism/alpine_hut":{icon:"maki-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:"maki-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:"maki-aquarium",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],terms:["fish","sea","water"],tags:{tourism:"aquarium"},name:"Aquarium"},"tourism/artwork":{icon:"maki-art-gallery",fields:["name","artwork_type","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork"},terms:["mural","sculpture","statue"],name:"Artwork"},"tourism/artwork/mural":{icon:"maki-art-gallery",fields:["name","artist"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"mural"},reference:{key:"artwork_type",value:"mural"},terms:["fresco","wall painting"],name:"Mural"},"tourism/artwork/sculpture":{icon:"maki-art-gallery",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"sculpture"},reference:{key:"artwork_type",value:"sculpture"},terms:["statue","figure","carving"],name:"Sculpture"},"tourism/artwork/statue":{icon:"maki-art-gallery",fields:["name","artist","material"],geometry:["point","vertex","line","area"],tags:{tourism:"artwork",artwork_type:"statue"},reference:{key:"artwork_type",value:"statue"},terms:["sculpture","figure","carving"],name:"Statue"},"tourism/attraction":{icon:"maki-star",fields:["name","operator","address"],geometry:["point","vertex","area"],tags:{tourism:"attraction"},name:"Tourist Attraction"},"tourism/camp_site":{icon:"maki-campsite",fields:["name","operator","address","access_simple","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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-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:"maki-information",fields:["information","operator","address","building_area"],geometry:["point","vertex","area"],tags:{tourism:"information"},name:"Information"},"tourism/information/board":{icon:"maki-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:"maki-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:"maki-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:"maki-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:"maki-lodging",fields:["name","brand","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:"maki-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:"maki-picnic-site",fields:["name","operator","address","access_simple","capacity","smoking"],geometry:["point","vertex","area"],terms:["camp"],tags:{tourism:"picnic_site"},name:"Picnic Site"},"tourism/theme_park":{icon:"maki-amusement-park",fields:["name","operator","address","opening_hours"],geometry:["point","area"],tags:{tourism:"theme_park"},name:"Theme Park"},"tourism/trail_riding_station":{icon:"maki-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:"temaki-binoculars",geometry:["point","vertex"],fields:["direction"],tags:{tourism:"viewpoint"},name:"Viewpoint"},"tourism/wilderness_hut":{icon:"maki-lodging",fields:["name","operator","address","building_area","fireplace"],geometry:["point","area"],terms:["wilderness hut","backcountry hut","bothy"],tags:{tourism:"wilderness_hut"},name:"Wilderness Hut"},"tourism/zoo":{icon:"maki-zoo",fields:["name","operator","address","opening_hours"],geometry:["point","area"],terms:["animal"],tags:{tourism:"zoo"},name:"Zoo"},traffic_calming:{icon:"temaki-diamond",fields:["traffic_calming","direction_vertex"],geometry:["vertex","line"],tags:{traffic_calming:"*"},terms:["bump","hump","slow","speed"],name:"Traffic Calming"},"traffic_calming/bump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["hump","speed","slow"],tags:{traffic_calming:"bump"},name:"Speed Bump"},"traffic_calming/chicane":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["driveway link","speed","slow"],tags:{traffic_calming:"chicane"},name:"Traffic Chicane"},"traffic_calming/choker":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"choker"},name:"Traffic Choker"},"traffic_calming/cushion":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","hump","speed","slow"],tags:{traffic_calming:"cushion"},name:"Speed Cushion"},"traffic_calming/dip":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["speed","slow"],tags:{traffic_calming:"dip"},name:"Dip"},"traffic_calming/hump":{icon:"temaki-diamond",fields:["surface","direction_vertex"],geometry:["vertex","line"],terms:["bump","speed","slow"],tags:{traffic_calming:"hump"},name:"Speed Hump"},"traffic_calming/island":{icon:"temaki-diamond",geometry:["vertex"],terms:["circle","roundabout","slow"],tags:{traffic_calming:"island"},name:"Traffic Island"},"traffic_calming/rumble_strip":{icon:"temaki-diamond",fields:["direction_vertex"],geometry:["vertex","line"],terms:["audible lines","sleeper lines","growlers"],tags:{traffic_calming:"rumble_strip"},name:"Rumble Strip"},"traffic_calming/table":{icon:"temaki-diamond",fields:["surface"],geometry:["vertex"],tags:{traffic_calming:"table"},terms:["flat top","hump","speed","slow"],name:"Speed Table"},traffic_sign_vertex:{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction"],geometry:["vertex"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},traffic_sign:{icon:"maki-square-stroked",fields:["traffic_sign","direction"],geometry:["point"],tags:{traffic_sign:"*"},terms:["road","highway"],name:"Traffic Sign"},"traffic_sign/city_limit_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","name"],geometry:["vertex"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/city_limit":{icon:"maki-square-stroked",fields:["traffic_sign","direction","name"],geometry:["point"],tags:{traffic_sign:"city_limit"},terms:["town","village","hamlet","boundary","edge","border","road","highway"],name:"City Limit Sign"},"traffic_sign/maxspeed_vertex":{icon:"maki-square-stroked",fields:["traffic_sign","traffic_sign/direction","maxspeed"],geometry:["vertex"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"traffic_sign/maxspeed":{icon:"maki-square-stroked",fields:["traffic_sign","direction","maxspeed"],geometry:["point"],tags:{traffic_sign:"maxspeed"},terms:["max speed","maximum speed","road","highway"],name:"Speed Limit Sign"},"type/multipolygon":{icon:"iD-multipolygon",geometry:["area","relation"],tags:{type:"multipolygon"},removeTags:{},name:"Multipolygon",searchable:false,matchScore:0.1},"type/boundary":{icon:"iD-boundary",fields:["name","boundary"],geometry:["relation"],tags:{type:"boundary"},name:"Boundary"},"type/boundary/administrative":{icon:"iD-boundary",fields:["name","admin_level"],geometry:["relation"],tags:{type:"boundary",boundary:"administrative"},reference:{key:"boundary",value:"administrative"},name:"Administrative Boundary"},"type/restriction":{icon:"iD-restriction",fields:["name","restriction","except"],geometry:["relation"],tags:{type:"restriction"},name:"Restriction"},"type/restriction/no_left_turn":{icon:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"iD-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:"iD-restriction-only-u-turn",fields:["except"],geometry:["relation"],tags:{type:"restriction",restriction:"only_u_turn"},name:"Only U-turn"},"type/route_master":{icon:"iD-route-master",fields:["name","route_master","ref","operator","network"],geometry:["relation"],tags:{type:"route_master"},name:"Route Master"},"type/route":{icon:"iD-route",fields:["name","route","ref_route","operator","network"],geometry:["relation"],tags:{type:"route"},name:"Route"},"type/route/bicycle":{icon:"iD-route-bicycle",fields:["name","ref_route","network_bicycle","cycle_network","to","from"],geometry:["relation"],tags:{type:"route",route:"bicycle"},name:"Cycle Route"},"type/route/bus":{icon:"iD-route-bus",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"bus"},name:"Bus Route"},"type/route/detour":{icon:"iD-route-detour",fields:["name","ref_route","to","from"],geometry:["relation"],tags:{type:"route",route:"detour"},name:"Detour Route"},"type/route/ferry":{icon:"iD-route-ferry",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"ferry"},name:"Ferry Route"},"type/route/foot":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot","to","from"],geometry:["relation"],tags:{type:"route",route:"foot"},name:"Foot Route"},"type/route/hiking":{icon:"iD-route-foot",fields:["name","ref_route","operator","network_foot","description","distance","to","from"],geometry:["relation"],tags:{type:"route",route:"hiking"},name:"Hiking Route"},"type/route/horse":{icon:"iD-route-horse",fields:["name","ref_route","operator","network_horse","description","distance","to","from"],geometry:["relation"],tags:{type:"route",route:"horse"},name:"Riding Route"},"type/route/light_rail":{icon:"iD-route-light-rail",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"light_rail"},name:"Light Rail Route"},"type/route/pipeline":{icon:"iD-route-pipeline",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"pipeline"},name:"Pipeline Route"},"type/route/piste":{icon:"iD-route-piste",fields:["name","piste/type","colour","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"piste"},name:"Piste/Ski Route"},"type/route/power":{icon:"iD-route-power",fields:["name","ref_route","operator","to","from"],geometry:["relation"],tags:{type:"route",route:"power"},name:"Power Route"},"type/route/road":{icon:"iD-route-road",fields:["name","ref_route","network_road","to","from"],geometry:["relation"],tags:{type:"route",route:"road"},name:"Road Route"},"type/route/subway":{icon:"iD-route-subway",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"subway"},name:"Subway Route"},"type/route/train":{icon:"iD-route-train",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"train"},name:"Train Route"},"type/route/tram":{icon:"iD-route-tram",fields:["name","ref_route","operator","network","to","from"],geometry:["relation"],tags:{type:"route",route:"tram"},name:"Tram Route"},"type/site":{icon:"iD-relation",fields:["name","site"],geometry:["relation"],tags:{type:"site"},name:"Site"},"type/waterway":{icon:"iD-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:"maki-harbor",fields:["name","operator"],geometry:["area","vertex","point"],tags:{waterway:"boatyard"},name:"Boatyard"},"waterway/canal":{icon:"iD-waterway-canal",fields:["name","width","intermittent"],geometry:["line"],tags:{waterway:"canal"},name:"Canal"},"waterway/dam":{icon:"maki-dam",geometry:["point","vertex","line","area"],fields:["name"],tags:{waterway:"dam"},name:"Dam"},"waterway/ditch":{icon:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"ditch"},name:"Ditch"},"waterway/dock":{icon:"maki-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:"iD-waterway-ditch",fields:["structure_waterway","intermittent"],geometry:["line"],tags:{waterway:"drain"},name:"Drain"},"waterway/fuel":{icon:"maki-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/milestone":{icon:"temaki-milestone",geometry:["point","vertex"],fields:["distance","direction_vertex"],tags:{waterway:"milestone"},terms:["milestone","marker"],name:"Waterway Milestone"},"waterway/river":{icon:"iD-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:"maki-water",geometry:["area"],tags:{waterway:"riverbank"},name:"Riverbank"},"waterway/sanitary_dump_station":{icon:"temaki-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:"iD-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:"iD-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:"maki-drinking-water",geometry:["area","vertex","point"],tags:{waterway:"water_point"},name:"Marine Drinking Water"},"waterway/waterfall":{icon:"maki-waterfall",fields:["name","height","width","intermittent"],geometry:["vertex"],terms:["fall"],tags:{waterway:"waterfall"},name:"Waterfall"},"waterway/weir":{icon:"maki-dam",geometry:["vertex","line"],tags:{waterway:"weir"},name:"Weir"},"amenity/bank/ABANCA":{name:"ABANCA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9598744"},addTags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA"},removeTags:{amenity:"bank",brand:"ABANCA","brand:wikidata":"Q9598744","brand:wikipedia":"es:Abanca",name:"ABANCA"},matchScore:2,suggestion:true},"amenity/bank/ABN AMRO":{name:"ABN AMRO",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q287471"},addTags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO"},removeTags:{amenity:"bank",brand:"ABN AMRO","brand:wikidata":"Q287471","brand:wikipedia":"en:ABN AMRO",name:"ABN AMRO"},matchScore:2,suggestion:true},"amenity/bank/ABSA":{name:"ABSA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q331688"},addTags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"},removeTags:{amenity:"bank",brand:"ABSA","brand:wikidata":"Q331688","brand:wikipedia":"en:ABSA Group Limited",name:"ABSA"},matchScore:2,suggestion:true},"amenity/bank/AIB":{name:"AIB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1642179"},addTags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB"},removeTags:{amenity:"bank",brand:"AIB","brand:wikidata":"Q1642179","brand:wikipedia":"en:Allied Irish Banks",name:"AIB"},matchScore:2,suggestion:true},"amenity/bank/ANZ":{name:"ANZ",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q714641"},addTags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ"},removeTags:{amenity:"bank",brand:"ANZ","brand:wikidata":"Q714641","brand:wikipedia":"en:Australia and New Zealand Banking Group",name:"ANZ"},matchScore:2,suggestion:true},"amenity/bank/ASB Bank":{name:"ASB Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q297214"},addTags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"},removeTags:{amenity:"bank",brand:"ASB Bank","brand:wikidata":"Q297214","brand:wikipedia":"en:ASB Bank",name:"ASB Bank"},matchScore:2,suggestion:true},"amenity/bank/ATB Financial":{name:"ATB Financial",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q298762"},addTags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial"},removeTags:{amenity:"bank",brand:"ATB Financial","brand:wikidata":"Q298762","brand:wikipedia":"en:ATB Financial",name:"ATB Financial"},matchScore:2,suggestion:true},"amenity/bank/AXA":{name:"AXA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q160054"},addTags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"},removeTags:{amenity:"bank",brand:"AXA","brand:wikidata":"Q160054","brand:wikipedia":"en:AXA",name:"AXA"},matchScore:2,suggestion:true},"amenity/bank/Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড":{name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q517050"},addTags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড"},removeTags:{amenity:"bank",brand:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড","brand:wikidata":"Q517050","brand:wikipedia":"en:Agrani Bank",name:"Agrani Bank Limited অগ্রণী ব্যাংক লিমিটেড"},matchScore:2,suggestion:true},"amenity/bank/Agribank":{name:"Agribank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4693829"},addTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"},removeTags:{amenity:"bank",brand:"Agribank","brand:wikidata":"Q4693829","brand:wikipedia":"en:AgriBank",name:"Agribank"},matchScore:2,suggestion:true},"amenity/bank/Akbank":{name:"Akbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q416624"},addTags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"},removeTags:{amenity:"bank",brand:"Akbank","brand:wikidata":"Q416624","brand:wikipedia":"en:Akbank",name:"Akbank"},matchScore:2,suggestion:true},"amenity/bank/Alior Bank":{name:"Alior Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9148395"},addTags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"en:Alior Bank",name:"Alior Bank"},removeTags:{amenity:"bank",brand:"Alior Bank","brand:wikidata":"Q9148395","brand:wikipedia":"en:Alior Bank",name:"Alior Bank"},matchScore:2,suggestion:true},"amenity/bank/Allahabad Bank":{name:"Allahabad Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2018840"},addTags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"},removeTags:{amenity:"bank",brand:"Allahabad Bank","brand:wikidata":"Q2018840","brand:wikipedia":"en:Allahabad Bank",name:"Allahabad Bank"},matchScore:2,suggestion:true},"amenity/bank/Allied Bank":{name:"Allied Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4732555"},addTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"},removeTags:{amenity:"bank",brand:"Allied Bank","brand:wikidata":"Q4732555","brand:wikipedia":"en:Allied Banking Corporation",name:"Allied Bank"},matchScore:2,suggestion:true},"amenity/bank/Alpha Bank":{name:"Alpha Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q747394"},addTags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"},removeTags:{amenity:"bank",brand:"Alpha Bank","brand:wikidata":"Q747394","brand:wikipedia":"en:Alpha Bank",name:"Alpha Bank"},matchScore:2,suggestion:true},"amenity/bank/Andhra Bank":{name:"Andhra Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003476"},addTags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"},removeTags:{amenity:"bank",brand:"Andhra Bank","brand:wikidata":"Q2003476","brand:wikipedia":"en:Andhra Bank",name:"Andhra Bank"},matchScore:2,suggestion:true},"amenity/bank/Antonveneta":{name:"Antonveneta",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633689"},addTags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"},removeTags:{amenity:"bank",brand:"Antonveneta","brand:wikidata":"Q3633689","brand:wikipedia":"en:Banca Antonveneta",name:"Antonveneta"},matchScore:2,suggestion:true},"amenity/bank/Argenta":{name:"Argenta",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q932856"},addTags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"},removeTags:{amenity:"bank",brand:"Argenta","brand:wikidata":"Q932856","brand:wikipedia":"en:Argenta (bank)",name:"Argenta"},matchScore:2,suggestion:true},"amenity/bank/Arvest Bank":{name:"Arvest Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4802393"},addTags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"},removeTags:{amenity:"bank",brand:"Arvest Bank","brand:wikidata":"Q4802393","brand:wikipedia":"en:Arvest Bank",name:"Arvest Bank"},matchScore:2,suggestion:true},"amenity/bank/Asia United Bank":{name:"Asia United Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4806482"},addTags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"},removeTags:{amenity:"bank",brand:"Asia United Bank","brand:wikidata":"Q4806482","brand:wikipedia":"en:Asia United Bank",name:"Asia United Bank"},matchScore:2,suggestion:true},"amenity/bank/Askari Bank":{name:"Askari Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4807137"},addTags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"},removeTags:{amenity:"bank",brand:"Askari Bank","brand:wikidata":"Q4807137","brand:wikipedia":"en:Askari Bank",name:"Askari Bank"},matchScore:2,suggestion:true},"amenity/bank/Associated Bank":{name:"Associated Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4809155"},addTags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"},removeTags:{amenity:"bank",brand:"Associated Bank","brand:wikidata":"Q4809155","brand:wikipedia":"en:Associated Banc-Corp",name:"Associated Bank"},matchScore:2,suggestion:true},"amenity/bank/Attijariwafa Bank":{name:"Attijariwafa Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q758052"},addTags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"},removeTags:{amenity:"bank",brand:"Attijariwafa Bank","brand:wikidata":"Q758052","brand:wikipedia":"en:Attijariwafa Bank",name:"Attijariwafa Bank"},matchScore:2,suggestion:true},"amenity/bank/Axis Bank":{name:"Axis Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003549"},addTags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"},removeTags:{amenity:"bank",brand:"Axis Bank","brand:wikidata":"Q2003549","brand:wikipedia":"en:Axis Bank",name:"Axis Bank"},matchScore:2,suggestion:true},"amenity/bank/BAC":{name:"BAC",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5715556"},addTags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de America Central",name:"BAC"},removeTags:{amenity:"bank",brand:"BAC","brand:wikidata":"Q5715556","brand:wikipedia":"en:Banco de America Central",name:"BAC"},matchScore:2,suggestion:true},"amenity/bank/BAWAG PSK":{name:"BAWAG PSK",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q379938"},addTags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"},removeTags:{amenity:"bank",brand:"BAWAG PSK","brand:wikidata":"Q379938","brand:wikipedia":"en:BAWAG P.S.K.",name:"BAWAG PSK"},matchScore:2,suggestion:true},"amenity/bank/BB&T":{name:"BB&T",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q795486"},addTags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T"},removeTags:{amenity:"bank",brand:"BB&T","brand:wikidata":"Q795486","brand:wikipedia":"en:BB&T",name:"BB&T"},matchScore:2,suggestion:true},"amenity/bank/BBBank":{name:"BBBank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q795504"},addTags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"},removeTags:{amenity:"bank",brand:"BBBank","brand:wikidata":"Q795504","brand:wikipedia":"en:BBBank",name:"BBBank"},matchScore:2,suggestion:true},"amenity/bank/BBVA":{name:"BBVA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806189"},addTags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA"},removeTags:{amenity:"bank",brand:"BBVA","brand:wikidata":"Q806189","brand:wikipedia":"en:Banco Bilbao Vizcaya Argentaria",name:"BBVA"},matchScore:2,suggestion:true},"amenity/bank/BBVA Bancomer":{name:"BBVA Bancomer",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876794"},addTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"},removeTags:{amenity:"bank",brand:"BBVA Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"BBVA Bancomer"},matchScore:2,suggestion:true},"amenity/bank/BBVA Compass":{name:"BBVA Compass",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835088"},addTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass"},removeTags:{amenity:"bank",brand:"BBVA Compass","brand:wikidata":"Q4835088","brand:wikipedia":"en:BBVA Compass",name:"BBVA Compass"},matchScore:2,suggestion:true},"amenity/bank/BBVA Continental":{name:"BBVA Continental",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835089"},addTags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"},removeTags:{amenity:"bank",brand:"BBVA Continental","brand:wikidata":"Q4835089","brand:wikipedia":"en:BBVA Continental",name:"BBVA Continental"},matchScore:2,suggestion:true},"amenity/bank/BBVA Francés":{name:"BBVA Francés",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876788"},addTags:{amenity:"bank",brand:"BBVA Francés","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés"},removeTags:{amenity:"bank",brand:"BBVA Francés","brand:wikidata":"Q2876788","brand:wikipedia":"en:BBVA Francés",name:"BBVA Francés"},matchScore:2,suggestion:true},"amenity/bank/BCA":{name:"BCA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806626"},addTags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA"},removeTags:{amenity:"bank",brand:"BCA","brand:wikidata":"Q806626","brand:wikipedia":"id:Bank Central Asia",name:"BCA"},matchScore:2,suggestion:true},"amenity/bank/BCI":{name:"BCI",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882083"},addTags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI"},removeTags:{amenity:"bank",brand:"BCI","brand:wikidata":"Q2882083","brand:wikipedia":"es:Banco de Crédito e Inversiones",name:"BCI"},matchScore:2,suggestion:true},"amenity/bank/BCP (Bolivia)":{name:"BCP (Bolivia)",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q16826675"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q16826675","brand:wikipedia":"es:Banco de Crédito de Bolivia",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (France)":{name:"BCP (France)",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (Luxembourg)":{name:"BCP (Luxembourg)",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCP (Peru)":{name:"BCP (Peru)",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854124"},addTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"},removeTags:{amenity:"bank",brand:"BCP","brand:wikidata":"Q4854124","brand:wikipedia":"es:Banco de Crédito del Perú",name:"BCP"},matchScore:2,suggestion:true},"amenity/bank/BCR":{name:"BCR",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6951632"},addTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR"},removeTags:{amenity:"bank",brand:"BCR","brand:wikidata":"Q6951632","brand:wikipedia":"es:Banco de Costa Rica",name:"BCR"},matchScore:2,suggestion:true},"amenity/bank/BDO":{name:"BDO",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854129"},addTags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO"},removeTags:{amenity:"bank",brand:"BDO","brand:wikidata":"Q4854129","brand:wikipedia":"en:Banco de Oro",name:"BDO"},matchScore:2,suggestion:true},"amenity/bank/BGŻ BNP Paribas":{name:"BGŻ BNP Paribas",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9164980"},addTags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q9164980","brand:wikipedia":"pl:Bank BGŻ BNP Paribas",name:"BGŻ BNP Paribas"},removeTags:{amenity:"bank",brand:"BGŻ BNP Paribas","brand:wikidata":"Q9164980","brand:wikipedia":"pl:Bank BGŻ BNP Paribas",name:"BGŻ BNP Paribas"},matchScore:2,suggestion:true},"amenity/bank/BMCE Bank":{name:"BMCE Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2300433"},addTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},removeTags:{amenity:"bank",brand:"BMCE Bank","brand:wikidata":"Q2300433","brand:wikipedia":"ar:البنك المغربي للتجارة الخارجية",name:"BMCE Bank"},matchScore:2,suggestion:true},"amenity/bank/BMCI":{name:"BMCI",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883409"},addTags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"},removeTags:{amenity:"bank",brand:"BMCI","brand:wikidata":"Q2883409","brand:wikipedia":"ar:البنك المغربي للتجارة والصناعة",name:"BMCI"},matchScore:2,suggestion:true},"amenity/bank/BMN":{name:"BMN",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3754900"},addTags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN"},removeTags:{amenity:"bank",brand:"BMN","brand:wikidata":"Q3754900","brand:wikipedia":"es:Banco Mare Nostrum",name:"BMN"},matchScore:2,suggestion:true},"amenity/bank/BMO":{name:"BMO",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806693"},addTags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO"},removeTags:{amenity:"bank",brand:"BMO","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"BMO"},matchScore:2,suggestion:true},"amenity/bank/BMO Harris Bank":{name:"BMO Harris Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4835981"},addTags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"},removeTags:{amenity:"bank",brand:"BMO Harris Bank","brand:wikidata":"Q4835981","brand:wikipedia":"en:BMO Harris Bank",name:"BMO Harris Bank"},matchScore:2,suggestion:true},"amenity/bank/BNA":{name:"BNA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883410"},addTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA"},removeTags:{amenity:"bank",brand:"BNA","brand:wikidata":"Q2883410","brand:wikipedia":"fr:Banque nationale d'Algérie",name:"BNA"},matchScore:2,suggestion:true},"amenity/bank/BNI":{name:"BNI",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882611"},addTags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI"},removeTags:{amenity:"bank",brand:"BNI","brand:wikidata":"Q2882611","brand:wikipedia":"id:Bank Negara Indonesia",name:"BNI"},matchScore:2,suggestion:true},"amenity/bank/BNL":{name:"BNL",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2201225"},addTags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL"},removeTags:{amenity:"bank",brand:"BNL","brand:wikidata":"Q2201225","brand:wikipedia":"en:Banca Nazionale del Lavoro",name:"BNL"},matchScore:2,suggestion:true},"amenity/bank/BNP Paribas":{name:"BNP Paribas",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q499707"},addTags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"},removeTags:{amenity:"bank",brand:"BNP Paribas","brand:wikidata":"Q499707","brand:wikipedia":"en:BNP Paribas",name:"BNP Paribas"},matchScore:2,suggestion:true},"amenity/bank/BNP Paribas Fortis":{name:"BNP Paribas Fortis",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q796827"},addTags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"},removeTags:{amenity:"bank",brand:"BNP Paribas Fortis","brand:wikidata":"Q796827","brand:wikipedia":"en:BNP Paribas Fortis",name:"BNP Paribas Fortis"},matchScore:2,suggestion:true},"amenity/bank/BOC":{name:"BOC",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC"},removeTags:{amenity:"bank",brand:"BOC","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"BOC"},matchScore:2,suggestion:true},"amenity/bank/BPI":{name:"BPI",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2501256"},addTags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI"},removeTags:{amenity:"bank",brand:"BPI","brand:wikidata":"Q2501256","brand:wikipedia":"en:Bank of the Philippine Islands",name:"BPI"},matchScore:2,suggestion:true},"amenity/bank/BRD":{name:"BRD",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q796927"},addTags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"},removeTags:{amenity:"bank",brand:"BRD","brand:wikidata":"Q796927","brand:wikipedia":"ro:BRD - Groupe Société Générale",name:"BRD"},matchScore:2,suggestion:true},"amenity/bank/BRED":{name:"BRED",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2877455"},addTags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED"},removeTags:{amenity:"bank",brand:"BRED","brand:wikidata":"Q2877455","brand:wikipedia":"fr:BRED Banque populaire",name:"BRED"},matchScore:2,suggestion:true},"amenity/bank/BRI":{name:"BRI",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q623042"},addTags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI"},removeTags:{amenity:"bank",brand:"BRI","brand:wikidata":"Q623042","brand:wikipedia":"id:Bank Rakyat Indonesia",name:"BRI"},matchScore:2,suggestion:true},"amenity/bank/BTN":{name:"BTN",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12474534"},addTags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN"},removeTags:{amenity:"bank",brand:"BTN","brand:en":"BTN","brand:wikidata":"Q12474534","brand:wikipedia":"id:Bank Tabungan Negara",name:"BTN","name:en":"BTN"},matchScore:2,suggestion:true},"amenity/bank/BW-Bank":{name:"BW-Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q798891"},addTags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:en":"BW-Bank"},removeTags:{amenity:"bank",brand:"BW-Bank","brand:en":"BW-Bank","brand:wikidata":"Q798891","brand:wikipedia":"de:Baden-Württembergische Bank",name:"BW-Bank","name:en":"BW-Bank"},matchScore:2,suggestion:true},"amenity/bank/Banamex":{name:"Banamex",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q749474"},addTags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex"},removeTags:{amenity:"bank",brand:"Banamex","brand:wikidata":"Q749474","brand:wikipedia":"en:Grupo Financiero Banamex",name:"Banamex"},matchScore:2,suggestion:true},"amenity/bank/Banca Intesa":{name:"Banca Intesa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q647092"},addTags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa"},removeTags:{amenity:"bank",brand:"Banca Intesa","brand:wikidata":"Q647092","brand:wikipedia":"en:Banca Intesa",name:"Banca Intesa"},matchScore:2,suggestion:true},"amenity/bank/Banca March":{name:"Banca March",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q578252"},addTags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"},removeTags:{amenity:"bank",brand:"Banca March","brand:wikidata":"Q578252","brand:wikipedia":"en:Banca March",name:"Banca March"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Milano":{name:"Banca Popolare di Milano",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806154"},addTags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano"},removeTags:{amenity:"bank",brand:"Banca Popolare di Milano","brand:wikidata":"Q806154","brand:wikipedia":"en:Banca Popolare di Milano",name:"Banca Popolare di Milano"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Novara":{name:"Banca Popolare di Novara",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633742"},addTags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara"},removeTags:{amenity:"bank",brand:"Banca Popolare di Novara","brand:wikidata":"Q3633742","brand:wikipedia":"en:Banca Popolare di Novara",name:"Banca Popolare di Novara"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Sondrio":{name:"Banca Popolare di Sondrio",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q686176"},addTags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio"},removeTags:{amenity:"bank",brand:"Banca Popolare di Sondrio","brand:wikidata":"Q686176","brand:wikipedia":"en:Banca Popolare di Sondrio",name:"Banca Popolare di Sondrio"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Verona":{name:"Banca Popolare di Verona",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3167468"},addTags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona"},removeTags:{amenity:"bank",brand:"Banca Popolare di Verona","brand:wikidata":"Q3167468","brand:wikipedia":"en:Banca Popolare di Verona",name:"Banca Popolare di Verona"},matchScore:2,suggestion:true},"amenity/bank/Banca Popolare di Vicenza":{name:"Banca Popolare di Vicenza",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3127200"},addTags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza"},removeTags:{amenity:"bank",brand:"Banca Popolare di Vicenza","brand:wikidata":"Q3127200","brand:wikipedia":"en:Banca Popolare di Vicenza",name:"Banca Popolare di Vicenza"},matchScore:2,suggestion:true},"amenity/bank/Banca Românească":{name:"Banca Românească",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854052"},addTags:{amenity:"bank",brand:"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"en:Banca Românească",name:"Banca Românească"},removeTags:{amenity:"bank",brand:"Banca Românească","brand:wikidata":"Q4854052","brand:wikipedia":"en:Banca Românească",name:"Banca Românească"},matchScore:2,suggestion:true},"amenity/bank/Banca Sella":{name:"Banca Sella",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633749"},addTags:{amenity:"bank",brand:"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella"},removeTags:{amenity:"bank",brand:"Banca Sella","brand:wikidata":"Q3633749","brand:wikipedia":"en:Banca Sella Group",name:"Banca Sella"},matchScore:2,suggestion:true},"amenity/bank/Banca Transilvania":{name:"Banca Transilvania",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806161"},addTags:{amenity:"bank",brand:"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania"},removeTags:{amenity:"bank",brand:"Banca Transilvania","brand:wikidata":"Q806161","brand:wikipedia":"en:Banca Transilvania",name:"Banca Transilvania"},matchScore:2,suggestion:true},"amenity/bank/Bancaribe":{name:"Bancaribe",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5717827"},addTags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"},removeTags:{amenity:"bank",brand:"Bancaribe","brand:wikidata":"Q5717827","brand:wikipedia":"en:Bancaribe",name:"Bancaribe"},matchScore:2,suggestion:true},"amenity/bank/Banco AV Villas":{name:"Banco AV Villas",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854068"},addTags:{amenity:"bank",brand:"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas"},removeTags:{amenity:"bank",brand:"Banco AV Villas","brand:wikidata":"Q4854068","brand:wikipedia":"en:Banco AV Villas",name:"Banco AV Villas"},matchScore:2,suggestion:true},"amenity/bank/Banco Azteca":{name:"Banco Azteca",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854076"},addTags:{amenity:"bank",brand:"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca"},removeTags:{amenity:"bank",brand:"Banco Azteca","brand:wikidata":"Q4854076","brand:wikipedia":"en:Banco Azteca",name:"Banco Azteca"},matchScore:2,suggestion:true},"amenity/bank/Banco BPM":{name:"Banco BPM",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q27331643"},addTags:{amenity:"bank",brand:"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM"},removeTags:{amenity:"bank",brand:"Banco BPM","brand:wikidata":"Q27331643","brand:wikipedia":"en:Banco BPM",name:"Banco BPM"},matchScore:2,suggestion:true},"amenity/bank/Banco Estado":{name:"Banco Estado",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5718188"},addTags:{amenity:"bank",brand:"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado"},removeTags:{amenity:"bank",brand:"Banco Estado","brand:wikidata":"Q5718188","brand:wikipedia":"es:Banco del Estado de Chile",name:"Banco Estado"},matchScore:2,suggestion:true},"amenity/bank/Banco Falabella":{name:"Banco Falabella",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854088"},addTags:{amenity:"bank",brand:"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella"},removeTags:{amenity:"bank",brand:"Banco Falabella","brand:wikidata":"Q4854088","brand:wikipedia":"en:Banco Falabella",name:"Banco Falabella"},matchScore:2,suggestion:true},"amenity/bank/Banco Nacional":{name:"Banco Nacional",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854104"},addTags:{amenity:"bank",brand:"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional"},removeTags:{amenity:"bank",brand:"Banco Nacional","brand:wikidata":"Q4854104","brand:wikipedia":"en:Banco Nacional",name:"Banco Nacional"},matchScore:2,suggestion:true},"amenity/bank/Banco Pastor":{name:"Banco Pastor",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806193"},addTags:{amenity:"bank",brand:"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor"},removeTags:{amenity:"bank",brand:"Banco Pastor","brand:wikidata":"Q806193","brand:wikipedia":"en:Banco Pastor",name:"Banco Pastor"},matchScore:2,suggestion:true},"amenity/bank/Banco Pichincha":{name:"Banco Pichincha",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854135"},addTags:{amenity:"bank",brand:"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha"},removeTags:{amenity:"bank",brand:"Banco Pichincha","brand:wikidata":"Q4854135","brand:wikipedia":"en:Banco Pichincha",name:"Banco Pichincha"},matchScore:2,suggestion:true},"amenity/bank/Banco Popular":{name:"Banco Popular",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q537259"},addTags:{amenity:"bank",brand:"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular"},removeTags:{amenity:"bank",brand:"Banco Popular","brand:wikidata":"Q537259","brand:wikipedia":"es:Banco Popular Español",name:"Banco Popular"},matchScore:2,suggestion:true},"amenity/bank/Banco Provincia":{name:"Banco Provincia",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856209"},addTags:{amenity:"bank",brand:"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia"},removeTags:{amenity:"bank",brand:"Banco Provincia","brand:wikidata":"Q4856209","brand:wikipedia":"es:Banco de la Provincia de Buenos Aires",name:"Banco Provincia"},matchScore:2,suggestion:true},"amenity/bank/Banco Sabadell":{name:"Banco Sabadell",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q762330"},addTags:{amenity:"bank",brand:"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell"},removeTags:{amenity:"bank",brand:"Banco Sabadell","brand:wikidata":"Q762330","brand:wikipedia":"es:Banco Sabadell",name:"Banco Sabadell"},matchScore:2,suggestion:true},"amenity/bank/Banco Santander":{name:"Banco Santander",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6496310"},addTags:{amenity:"bank",brand:"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander"},removeTags:{amenity:"bank",brand:"Banco Santander","brand:wikidata":"Q6496310","brand:wikipedia":"es:Banco Santander",name:"Banco Santander"},matchScore:2,suggestion:true},"amenity/bank/Banco de Bogotá":{name:"Banco de Bogotá",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854122"},addTags:{amenity:"bank",brand:"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"},removeTags:{amenity:"bank",brand:"Banco de Bogotá","brand:wikidata":"Q4854122","brand:wikipedia":"es:Banco de Bogotá",name:"Banco de Bogotá"},matchScore:2,suggestion:true},"amenity/bank/Banco de Chile":{name:"Banco de Chile",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882085"},addTags:{amenity:"bank",brand:"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"},removeTags:{amenity:"bank",brand:"Banco de Chile","brand:wikidata":"Q2882085","brand:wikipedia":"es:Banco de Chile",name:"Banco de Chile"},matchScore:2,suggestion:true},"amenity/bank/Banco de Venezuela":{name:"Banco de Venezuela",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q517093"},addTags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"},removeTags:{amenity:"bank",brand:"Banco de Venezuela","brand:wikidata":"Q517093","brand:wikipedia":"es:Banco de Venezuela",name:"Banco de Venezuela"},matchScore:2,suggestion:true},"amenity/bank/Banco de la Nación":{name:"Banco de la Nación",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883376"},addTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"},removeTags:{amenity:"bank",brand:"Banco de la Nación","brand:wikidata":"Q2883376","brand:wikipedia":"en:Banco de la Nación Argentina",name:"Banco de la Nación"},matchScore:2,suggestion:true},"amenity/bank/Banco di Napoli":{name:"Banco di Napoli",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633835"},addTags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"},removeTags:{amenity:"bank",brand:"Banco di Napoli","brand:wikidata":"Q3633835","brand:wikipedia":"en:Banco di Napoli",name:"Banco di Napoli"},matchScore:2,suggestion:true},"amenity/bank/Banco di Sardegna":{name:"Banco di Sardegna",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806205"},addTags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"},removeTags:{amenity:"bank",brand:"Banco di Sardegna","brand:wikidata":"Q806205","brand:wikipedia":"en:Banco di Sardegna",name:"Banco di Sardegna"},matchScore:2,suggestion:true},"amenity/bank/Banco do Brasil":{name:"Banco do Brasil",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q610817"},addTags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"},removeTags:{amenity:"bank",brand:"Banco do Brasil","brand:wikidata":"Q610817","brand:wikipedia":"en:Banco do Brasil",name:"Banco do Brasil"},matchScore:2,suggestion:true},"amenity/bank/Banco do Nordeste":{name:"Banco do Nordeste",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854137"},addTags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"},removeTags:{amenity:"bank",brand:"Banco do Nordeste","brand:wikidata":"Q4854137","brand:wikipedia":"en:Banco do Nordeste",name:"Banco do Nordeste"},matchScore:2,suggestion:true},"amenity/bank/Bancolombia":{name:"Bancolombia",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806206"},addTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},removeTags:{amenity:"bank",brand:"Bancolombia","brand:wikidata":"Q806206","brand:wikipedia":"en:Bancolombia",name:"Bancolombia"},matchScore:2,suggestion:true},"amenity/bank/Bancomer":{name:"Bancomer",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2876794"},addTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},removeTags:{amenity:"bank",brand:"Bancomer","brand:wikidata":"Q2876794","brand:wikipedia":"en:BBVA Bancomer",name:"Bancomer"},matchScore:2,suggestion:true},"amenity/bank/Bancpost":{name:"Bancpost",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854143"},addTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},removeTags:{amenity:"bank",brand:"Bancpost","brand:wikidata":"Q4854143","brand:wikipedia":"ro:Bancpost",name:"Bancpost"},matchScore:2,suggestion:true},"amenity/bank/Banesco":{name:"Banesco",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854841"},addTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},removeTags:{amenity:"bank",brand:"Banesco","brand:wikidata":"Q4854841","brand:wikipedia":"en:Banesco",name:"Banesco"},matchScore:2,suggestion:true},"amenity/bank/Bangkok Bank":{name:"Bangkok Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806483"},addTags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"},removeTags:{amenity:"bank",brand:"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"Bangkok Bank"},matchScore:2,suggestion:true},"amenity/bank/Bank Al Habib":{name:"Bank Al Habib",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4034833"},addTags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"},removeTags:{amenity:"bank",brand:"Bank Al Habib","brand:wikidata":"Q4034833","brand:wikipedia":"ur:بينک الحبيب لمیٹڈ",name:"Bank Al Habib"},matchScore:2,suggestion:true},"amenity/bank/Bank Alfalah":{name:"Bank Alfalah",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855895"},addTags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"},removeTags:{amenity:"bank",brand:"Bank Alfalah","brand:wikidata":"Q4855895","brand:wikipedia":"en:Bank Alfalah",name:"Bank Alfalah"},matchScore:2,suggestion:true},"amenity/bank/Bank Austria":{name:"Bank Austria",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q697619"},addTags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"},removeTags:{amenity:"bank",brand:"Bank Austria","brand:wikidata":"Q697619","brand:wikipedia":"en:Bank Austria",name:"Bank Austria"},matchScore:2,suggestion:true},"amenity/bank/Bank Danamon":{name:"Bank Danamon",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855913"},addTags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"},removeTags:{amenity:"bank",brand:"Bank Danamon","brand:wikidata":"Q4855913","brand:wikipedia":"en:Bank Danamon",name:"Bank Danamon"},matchScore:2,suggestion:true},"amenity/bank/Bank Mandiri":{name:"Bank Mandiri",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806639"},addTags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"},removeTags:{amenity:"bank",brand:"Bank Mandiri","brand:wikidata":"Q806639","brand:wikipedia":"en:Bank Mandiri",name:"Bank Mandiri"},matchScore:2,suggestion:true},"amenity/bank/Bank Muamalat":{name:"Bank Muamalat",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855949"},addTags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"},removeTags:{amenity:"bank",brand:"Bank Muamalat","brand:wikidata":"Q4855949","brand:wikipedia":"en:Bank Muamalat",name:"Bank Muamalat"},matchScore:2,suggestion:true},"amenity/bank/Bank Rakyat":{name:"Bank Rakyat",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855964"},addTags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"},removeTags:{amenity:"bank",brand:"Bank Rakyat","brand:wikidata":"Q4855964","brand:wikipedia":"ms:Bank Rakyat",name:"Bank Rakyat"},matchScore:2,suggestion:true},"amenity/bank/Bank of Africa":{name:"Bank of Africa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882627"},addTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa"},removeTags:{amenity:"bank",brand:"Bank of Africa","brand:wikidata":"Q2882627","brand:wikipedia":"en:Bank of Africa Group",name:"Bank of Africa"},matchScore:2,suggestion:true},"amenity/bank/Bank of America":{name:"Bank of America",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q487907"},addTags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"},removeTags:{amenity:"bank",brand:"Bank of America","brand:wikidata":"Q487907","brand:wikipedia":"en:Bank of America",name:"Bank of America"},matchScore:2,suggestion:true},"amenity/bank/Bank of Baroda":{name:"Bank of Baroda",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003797"},addTags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"},removeTags:{amenity:"bank",brand:"Bank of Baroda","brand:wikidata":"Q2003797","brand:wikipedia":"en:Bank of Baroda",name:"Bank of Baroda"},matchScore:2,suggestion:true},"amenity/bank/Bank of Ceylon":{name:"Bank of Ceylon",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882652"},addTags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"},removeTags:{amenity:"bank",brand:"Bank of Ceylon","brand:wikidata":"Q2882652","brand:wikipedia":"en:Bank of Ceylon",name:"Bank of Ceylon"},matchScore:2,suggestion:true},"amenity/bank/Bank of China":{name:"Bank of China",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"},removeTags:{amenity:"bank",brand:"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"Bank of China"},matchScore:2,suggestion:true},"amenity/bank/Bank of Commerce":{name:"Bank of Commerce",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856092"},addTags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"},removeTags:{amenity:"bank",brand:"Bank of Commerce","brand:wikidata":"Q4856092","brand:wikipedia":"en:Bank of Commerce",name:"Bank of Commerce"},matchScore:2,suggestion:true},"amenity/bank/Bank of Cyprus":{name:"Bank of Cyprus",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806678"},addTags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"},removeTags:{amenity:"bank",brand:"Bank of Cyprus","brand:wikidata":"Q806678","brand:wikipedia":"en:Bank of Cyprus",name:"Bank of Cyprus"},matchScore:2,suggestion:true},"amenity/bank/Bank of India":{name:"Bank of India",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004439"},addTags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"},removeTags:{amenity:"bank",brand:"Bank of India","brand:wikidata":"Q2004439","brand:wikipedia":"en:Bank of India",name:"Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Bank of Ireland":{name:"Bank of Ireland",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806689"},addTags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"},removeTags:{amenity:"bank",brand:"Bank of Ireland","brand:wikidata":"Q806689","brand:wikipedia":"en:Bank of Ireland",name:"Bank of Ireland"},matchScore:2,suggestion:true},"amenity/bank/Bank of Maharashtra":{name:"Bank of Maharashtra",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004304"},addTags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"},removeTags:{amenity:"bank",brand:"Bank of Maharashtra","brand:wikidata":"Q2004304","brand:wikipedia":"en:Bank of Maharashtra",name:"Bank of Maharashtra"},matchScore:2,suggestion:true},"amenity/bank/Bank of Montreal":{name:"Bank of Montreal",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806693"},addTags:{amenity:"bank",brand:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"},removeTags:{amenity:"bank",brand:"Bank of Montreal","brand:wikidata":"Q806693","brand:wikipedia":"en:Bank of Montreal",name:"Bank of Montreal"},matchScore:2,suggestion:true},"amenity/bank/Bank of New Zealand":{name:"Bank of New Zealand",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806687"},addTags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"},removeTags:{amenity:"bank",brand:"Bank of New Zealand","brand:wikidata":"Q806687","brand:wikipedia":"en:Bank of New Zealand",name:"Bank of New Zealand"},matchScore:2,suggestion:true},"amenity/bank/Bank of Scotland":{name:"Bank of Scotland",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q627381"},addTags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"},removeTags:{amenity:"bank",brand:"Bank of Scotland","brand:wikidata":"Q627381","brand:wikipedia":"en:Bank of Scotland",name:"Bank of Scotland"},matchScore:2,suggestion:true},"amenity/bank/Bank of the West":{name:"Bank of the West",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2881919"},addTags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"},removeTags:{amenity:"bank",brand:"Bank of the West","brand:wikidata":"Q2881919","brand:wikipedia":"en:Bank of the West",name:"Bank of the West"},matchScore:2,suggestion:true},"amenity/bank/Bankia":{name:"Bankia",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806807"},addTags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"},removeTags:{amenity:"bank",brand:"Bankia","brand:wikidata":"Q806807","brand:wikipedia":"en:Bankia",name:"Bankia"},matchScore:2,suggestion:true},"amenity/bank/Bankinter":{name:"Bankinter",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806808"},addTags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"},removeTags:{amenity:"bank",brand:"Bankinter","brand:wikidata":"Q806808","brand:wikipedia":"es:Bankinter",name:"Bankinter"},matchScore:2,suggestion:true},"amenity/bank/Banner Bank":{name:"Banner Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4856910"},addTags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"},removeTags:{amenity:"bank",brand:"Banner Bank","brand:wikidata":"Q4856910","brand:wikipedia":"en:Banner Bank",name:"Banner Bank"},matchScore:2,suggestion:true},"amenity/bank/Banorte":{name:"Banorte",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806914"},addTags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"},removeTags:{amenity:"bank",brand:"Banorte","brand:wikidata":"Q806914","brand:wikipedia":"en:Banorte",name:"Banorte"},matchScore:2,suggestion:true},"amenity/bank/Banque Atlantique":{name:"Banque Atlantique",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882890"},addTags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"},removeTags:{amenity:"bank",brand:"Banque Atlantique","brand:wikidata":"Q2882890","brand:wikipedia":"en:Atlantic Bank Group",name:"Banque Atlantique"},matchScore:2,suggestion:true},"amenity/bank/Banque Laurentienne":{name:"Banque Laurentienne",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1360087"},addTags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"},removeTags:{amenity:"bank",brand:"Banque Laurentienne","brand:wikidata":"Q1360087","brand:wikipedia":"en:Laurentian Bank of Canada",name:"Banque Laurentienne"},matchScore:2,suggestion:true},"amenity/bank/Banque Populaire":{name:"Banque Populaire",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2883441"},addTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},removeTags:{amenity:"bank",brand:"Banque Populaire","brand:wikidata":"Q2883441","brand:wikipedia":"en:Banque Populaire du Maroc",name:"Banque Populaire"},matchScore:2,suggestion:true},"amenity/bank/Banrisul":{name:"Banrisul",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4857098"},addTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},removeTags:{amenity:"bank",brand:"Banrisul","brand:wikidata":"Q4857098","brand:wikipedia":"en:Banrisul",name:"Banrisul"},matchScore:2,suggestion:true},"amenity/bank/Barclays":{name:"Barclays",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q245343"},addTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},removeTags:{amenity:"bank",brand:"Barclays","brand:wikidata":"Q245343","brand:wikipedia":"en:Barclays",name:"Barclays"},matchScore:2,suggestion:true},"amenity/bank/Belfius":{name:"Belfius",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1956014"},addTags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"},removeTags:{amenity:"bank",brand:"Belfius","brand:wikidata":"Q1956014","brand:wikipedia":"en:Belfius",name:"Belfius"},matchScore:2,suggestion:true},"amenity/bank/Bendigo Bank":{name:"Bendigo Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4887077"},addTags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"},removeTags:{amenity:"bank",brand:"Bendigo Bank","brand:wikidata":"Q4887077","brand:wikipedia":"en:Bendigo and Adelaide Bank",name:"Bendigo Bank"},matchScore:2,suggestion:true},"amenity/bank/Bradesco":{name:"Bradesco",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806181"},addTags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"},removeTags:{amenity:"bank",brand:"Bradesco","brand:wikidata":"Q806181","brand:wikipedia":"en:Banco Bradesco",name:"Bradesco"},matchScore:2,suggestion:true},"amenity/bank/Budapest Bank":{name:"Budapest Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q27493463"},addTags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"},removeTags:{amenity:"bank",brand:"Budapest Bank","brand:wikidata":"Q27493463","brand:wikipedia":"en:Budapest Bank",name:"Budapest Bank"},matchScore:2,suggestion:true},"amenity/bank/CEC Bank":{name:"CEC Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1023306"},addTags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"},removeTags:{amenity:"bank",brand:"CEC Bank","brand:wikidata":"Q1023306","brand:wikipedia":"en:CEC Bank",name:"CEC Bank"},matchScore:2,suggestion:true},"amenity/bank/CIB Bank":{name:"CIB Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q839566"},addTags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"},removeTags:{amenity:"bank",brand:"CIB Bank","brand:wikidata":"Q839566","brand:wikipedia":"en:CIB Bank",name:"CIB Bank"},matchScore:2,suggestion:true},"amenity/bank/CIBC":{name:"CIBC",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q666694"},addTags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"},removeTags:{amenity:"bank",brand:"CIBC","brand:wikidata":"Q666694","brand:wikipedia":"en:Canadian Imperial Bank of Commerce",name:"CIBC"},matchScore:2,suggestion:true},"amenity/bank/CIH Bank":{name:"CIH Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3006220"},addTags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"},removeTags:{amenity:"bank",brand:"CIH Bank","brand:wikidata":"Q3006220","brand:wikipedia":"en:CIH Bank",name:"CIH Bank"},matchScore:2,suggestion:true},"amenity/bank/CIMB Bank":{name:"CIMB Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3045976"},addTags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"},removeTags:{amenity:"bank",brand:"CIMB Bank","brand:wikidata":"Q3045976","brand:wikipedia":"en:CIMB",name:"CIMB Bank"},matchScore:2,suggestion:true},"amenity/bank/CIMB Niaga":{name:"CIMB Niaga",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5011747"},addTags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"},removeTags:{amenity:"bank",brand:"CIMB Niaga","brand:wikidata":"Q5011747","brand:wikipedia":"en:CIMB Niaga",name:"CIMB Niaga"},matchScore:2,suggestion:true},"amenity/bank/Caisse Desjardins":{name:"Caisse Desjardins",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2933350"},addTags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"},removeTags:{amenity:"bank",brand:"Caisse Desjardins","brand:wikidata":"Q2933350","brand:wikipedia":"en:Desjardins Group",name:"Caisse Desjardins"},matchScore:2,suggestion:true},"amenity/bank/Caixa Econômica Federal":{name:"Caixa Econômica Federal",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q835283"},addTags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"},removeTags:{amenity:"bank",brand:"Caixa Econômica Federal","brand:wikidata":"Q835283","brand:wikipedia":"pt:Caixa Econômica Federal",name:"Caixa Econômica Federal"},matchScore:2,suggestion:true},"amenity/bank/Caixa Geral de Depósitos":{name:"Caixa Geral de Depósitos",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1026044"},addTags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"},removeTags:{amenity:"bank",brand:"Caixa Geral de Depósitos","brand:wikidata":"Q1026044","brand:wikipedia":"pt:Caixa Geral de Depósitos",name:"Caixa Geral de Depósitos"},matchScore:2,suggestion:true},"amenity/bank/Caixabank":{name:"Caixabank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q847225"},addTags:{amenity:"bank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"},removeTags:{amenity:"bank","brand:wikidata":"Q847225","brand:wikipedia":"en:CaixaBank",name:"Caixabank"},matchScore:2,suggestion:true},"amenity/bank/CajaSur":{name:"CajaSur",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3751637"},addTags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"},removeTags:{amenity:"bank",brand:"CajaSur","brand:wikidata":"Q3751637","brand:wikipedia":"en:CajaSur",name:"CajaSur"},matchScore:2,suggestion:true},"amenity/bank/Canara Bank":{name:"Canara Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003777"},addTags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"},removeTags:{amenity:"bank",brand:"Canara Bank","brand:wikidata":"Q2003777","brand:wikipedia":"en:Canara Bank",name:"Canara Bank"},matchScore:2,suggestion:true},"amenity/bank/Capital One":{name:"Capital One",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1034654"},addTags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"},removeTags:{amenity:"bank",brand:"Capital One","brand:wikidata":"Q1034654","brand:wikipedia":"en:Capital One",name:"Capital One"},matchScore:2,suggestion:true},"amenity/bank/Cariparma":{name:"Cariparma",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2938832"},addTags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"},removeTags:{amenity:"bank",brand:"Cariparma","brand:wikidata":"Q2938832","brand:wikipedia":"en:Crédit Agricole Italia",name:"Cariparma"},matchScore:2,suggestion:true},"amenity/bank/Carisbo":{name:"Carisbo",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3661937"},addTags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"},removeTags:{amenity:"bank",brand:"Carisbo","brand:wikidata":"Q3661937","brand:wikipedia":"en:Cassa di Risparmio in Bologna",name:"Carisbo"},matchScore:2,suggestion:true},"amenity/bank/Cassa di Risparmio del Veneto":{name:"Cassa di Risparmio del Veneto",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3661909"},addTags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"},removeTags:{amenity:"bank",brand:"Cassa di Risparmio del Veneto","brand:wikidata":"Q3661909","brand:wikipedia":"en:Cassa di Risparmio del Veneto",name:"Cassa di Risparmio del Veneto"},matchScore:2,suggestion:true},"amenity/bank/CatalunyaCaixa":{name:"CatalunyaCaixa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3750952"},addTags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"},removeTags:{amenity:"bank",brand:"CatalunyaCaixa","brand:wikidata":"Q3750952","brand:wikipedia":"en:CatalunyaCaixa",name:"CatalunyaCaixa"},matchScore:2,suggestion:true},"amenity/bank/Central Bank of India":{name:"Central Bank of India",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2007090"},addTags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"},removeTags:{amenity:"bank",brand:"Central Bank of India","brand:wikidata":"Q2007090","brand:wikipedia":"en:Central Bank of India",name:"Central Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Chase":{name:"Chase",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q524629"},addTags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"},removeTags:{amenity:"bank",brand:"Chase","brand:wikidata":"Q524629","brand:wikipedia":"en:Chase Bank",name:"Chase"},matchScore:2,suggestion:true},"amenity/bank/China Bank Savings":{name:"China Bank Savings",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q18387359"},addTags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"},removeTags:{amenity:"bank",brand:"China Bank Savings","brand:wikidata":"Q18387359","brand:wikipedia":"en:China Bank Savings",name:"China Bank Savings"},matchScore:2,suggestion:true},"amenity/bank/China Construction Bank":{name:"China Construction Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26299"},addTags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"},removeTags:{amenity:"bank",brand:"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"China Construction Bank"},matchScore:2,suggestion:true},"amenity/bank/Citibank":{name:"Citibank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q857063"},addTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank"},removeTags:{amenity:"bank",brand:"Citibank","brand:wikidata":"Q857063","brand:wikipedia":"en:Citibank",name:"Citibank"},matchScore:2,suggestion:true},"amenity/bank/Citizens Bank":{name:"Citizens Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q25209674"},addTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"},removeTags:{amenity:"bank",brand:"Citizens Bank","brand:wikidata":"Q25209674","brand:wikipedia":"en:Citizens Bank (South Bend, Indiana)",name:"Citizens Bank"},matchScore:2,suggestion:true},"amenity/bank/Comerica Bank":{name:"Comerica Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1114148"},addTags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"},removeTags:{amenity:"bank",brand:"Comerica Bank","brand:wikidata":"Q1114148","brand:wikipedia":"en:Comerica",name:"Comerica Bank"},matchScore:2,suggestion:true},"amenity/bank/Commerzbank":{name:"Commerzbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q157617"},addTags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"},removeTags:{amenity:"bank",brand:"Commerzbank","brand:wikidata":"Q157617","brand:wikipedia":"en:Commerzbank",name:"Commerzbank"},matchScore:2,suggestion:true},"amenity/bank/Commonwealth Bank":{name:"Commonwealth Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q285328"},addTags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"},removeTags:{amenity:"bank",brand:"Commonwealth Bank","brand:wikidata":"Q285328","brand:wikipedia":"en:Commonwealth Bank",name:"Commonwealth Bank"},matchScore:2,suggestion:true},"amenity/bank/Corporation Bank":{name:"Corporation Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003387"},addTags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"},removeTags:{amenity:"bank",brand:"Corporation Bank","brand:wikidata":"Q2003387","brand:wikipedia":"en:Corporation Bank",name:"Corporation Bank"},matchScore:2,suggestion:true},"amenity/bank/Credem":{name:"Credem",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3696881"},addTags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"},removeTags:{amenity:"bank",brand:"Credem","brand:wikidata":"Q3696881","brand:wikipedia":"en:Credito Emiliano",name:"Credem"},matchScore:2,suggestion:true},"amenity/bank/Credicoop":{name:"Credicoop",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854086"},addTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},removeTags:{amenity:"bank",brand:"Credicoop","brand:wikidata":"Q4854086","brand:wikipedia":"en:Banco Credicoop",name:"Credicoop"},matchScore:2,suggestion:true},"amenity/bank/Credit Suisse":{name:"Credit Suisse",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q372657"},addTags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"},removeTags:{amenity:"bank",brand:"Credit Suisse","brand:wikidata":"Q372657","brand:wikipedia":"en:Credit Suisse",name:"Credit Suisse"},matchScore:2,suggestion:true},"amenity/bank/Credito Valtellinese":{name:"Credito Valtellinese",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3696888"},addTags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"},removeTags:{amenity:"bank",brand:"Credito Valtellinese","brand:wikidata":"Q3696888","brand:wikipedia":"en:Credito Valtellinese",name:"Credito Valtellinese"},matchScore:2,suggestion:true},"amenity/bank/Crelan":{name:"Crelan",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q389872"},addTags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"},removeTags:{amenity:"bank",brand:"Crelan","brand:wikidata":"Q389872","brand:wikipedia":"en:Crelan",name:"Crelan"},matchScore:2,suggestion:true},"amenity/bank/Crédit Agricole":{name:"Crédit Agricole",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q590952"},addTags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"},removeTags:{amenity:"bank",brand:"Crédit Agricole","brand:wikidata":"Q590952","brand:wikipedia":"fr:Crédit agricole",name:"Crédit Agricole"},matchScore:2,suggestion:true},"amenity/bank/Crédit Maritime":{name:"Crédit Maritime",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q17176866"},addTags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"},removeTags:{amenity:"bank",brand:"Crédit Maritime","brand:wikidata":"Q17176866","brand:wikipedia":"fr:Crédit maritime",name:"Crédit Maritime"},matchScore:2,suggestion:true},"amenity/bank/Crédit Mutuel":{name:"Crédit Mutuel",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q642627"},addTags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"},removeTags:{amenity:"bank",brand:"Crédit Mutuel","brand:wikidata":"Q642627","brand:wikipedia":"en:Crédit Mutuel",name:"Crédit Mutuel"},matchScore:2,suggestion:true},"amenity/bank/Crédit du Nord":{name:"Crédit du Nord",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3006209"},addTags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"},removeTags:{amenity:"bank",brand:"Crédit du Nord","brand:wikidata":"Q3006209","brand:wikipedia":"en:Crédit du Nord",name:"Crédit du Nord"},matchScore:2,suggestion:true},"amenity/bank/Danske Bank":{name:"Danske Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1636974"},addTags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"},removeTags:{amenity:"bank",brand:"Danske Bank","brand:wikidata":"Q1636974","brand:wikipedia":"en:Danske Bank",name:"Danske Bank"},matchScore:2,suggestion:true},"amenity/bank/Davivienda":{name:"Davivienda",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5242054"},addTags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"},removeTags:{amenity:"bank",brand:"Davivienda","brand:wikidata":"Q5242054","brand:wikipedia":"en:Davivienda",name:"Davivienda"},matchScore:2,suggestion:true},"amenity/bank/Denizbank":{name:"Denizbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1115064"},addTags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"},removeTags:{amenity:"bank",brand:"Denizbank","brand:wikidata":"Q1115064","brand:wikipedia":"en:DenizBank",name:"Denizbank"},matchScore:2,suggestion:true},"amenity/bank/Deutsche Bank":{name:"Deutsche Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q66048"},addTags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"},removeTags:{amenity:"bank",brand:"Deutsche Bank","brand:wikidata":"Q66048","brand:wikipedia":"en:Deutsche Bank",name:"Deutsche Bank"},matchScore:2,suggestion:true},"amenity/bank/Dubai Islamic Bank":{name:"Dubai Islamic Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5310570"},addTags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"},removeTags:{amenity:"bank",brand:"Dubai Islamic Bank","brand:wikidata":"Q5310570","brand:wikipedia":"en:Dubai Islamic Bank",name:"Dubai Islamic Bank"},matchScore:2,suggestion:true},"amenity/bank/EastWest Bank":{name:"EastWest Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5327595"},addTags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"},removeTags:{amenity:"bank",brand:"EastWest Bank","brand:wikidata":"Q5327595","brand:wikipedia":"en:EastWest Bank",name:"EastWest Bank"},matchScore:2,suggestion:true},"amenity/bank/Ecobank":{name:"Ecobank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q930225"},addTags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"},removeTags:{amenity:"bank",brand:"Ecobank","brand:wikidata":"Q930225","brand:wikipedia":"en:Ecobank",name:"Ecobank"},matchScore:2,suggestion:true},"amenity/bank/Erste Bank":{name:"Erste Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q696867"},addTags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"},removeTags:{amenity:"bank",brand:"Erste Bank","brand:wikidata":"Q696867","brand:wikipedia":"de:Erste Bank",name:"Erste Bank"},matchScore:2,suggestion:true},"amenity/bank/FNB":{name:"FNB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3072956"},addTags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB"},removeTags:{amenity:"bank",brand:"FNB","brand:wikidata":"Q3072956","brand:wikipedia":"en:First National Bank (South Africa)",name:"FNB"},matchScore:2,suggestion:true},"amenity/bank/Faysal Bank":{name:"Faysal Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5439099"},addTags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"},removeTags:{amenity:"bank",brand:"Faysal Bank","brand:wikidata":"Q5439099","brand:wikipedia":"en:Faysal Bank",name:"Faysal Bank"},matchScore:2,suggestion:true},"amenity/bank/Federal Bank":{name:"Federal Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2044983"},addTags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"},removeTags:{amenity:"bank",brand:"Federal Bank","brand:wikidata":"Q2044983","brand:wikipedia":"en:Federal Bank",name:"Federal Bank"},matchScore:2,suggestion:true},"amenity/bank/Fifth Third Bank":{name:"Fifth Third Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1411810"},addTags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank"},removeTags:{amenity:"bank",brand:"Fifth Third Bank","brand:wikidata":"Q1411810","brand:wikipedia":"en:Fifth Third Bank",name:"Fifth Third Bank"},matchScore:2,suggestion:true},"amenity/bank/Finansbank":{name:"Finansbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1416237"},addTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},removeTags:{amenity:"bank",brand:"Finansbank","brand:wikidata":"Q1416237","brand:wikipedia":"en:Finansbank",name:"Finansbank"},matchScore:2,suggestion:true},"amenity/bank/First Citizens Bank":{name:"First Citizens Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5452734"},addTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"},removeTags:{amenity:"bank",brand:"First Citizens Bank","brand:wikidata":"Q5452734","brand:wikipedia":"en:First Citizens Bank (Trinidad and Tobago)",name:"First Citizens Bank"},matchScore:2,suggestion:true},"amenity/bank/GCB Bank":{name:"GCB Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1521346"},addTags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank Limited",name:"GCB Bank"},removeTags:{amenity:"bank",brand:"GCB Bank","brand:wikidata":"Q1521346","brand:wikipedia":"en:GCB Bank Limited",name:"GCB Bank"},matchScore:2,suggestion:true},"amenity/bank/Garanti":{name:"Garanti",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q322962"},addTags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"},removeTags:{amenity:"bank",brand:"Garanti","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti"},matchScore:2,suggestion:true},"amenity/bank/Garanti Bankası":{name:"Garanti Bankası",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q322962"},addTags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"},removeTags:{amenity:"bank",brand:"Garanti Bankası","brand:wikidata":"Q322962","brand:wikipedia":"en:Garanti Bank",name:"Garanti Bankası"},matchScore:2,suggestion:true},"amenity/bank/Getin Bank":{name:"Getin Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9267646"},addTags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"en:Getin Bank",name:"Getin Bank"},removeTags:{amenity:"bank",brand:"Getin Bank","brand:wikidata":"Q9267646","brand:wikipedia":"en:Getin Bank",name:"Getin Bank"},matchScore:2,suggestion:true},"amenity/bank/Great Western Bank":{name:"Great Western Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5600185"},addTags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"},removeTags:{amenity:"bank",brand:"Great Western Bank","brand:wikidata":"Q5600185","brand:wikipedia":"en:Great Western Bank (1907–present)",name:"Great Western Bank"},matchScore:2,suggestion:true},"amenity/bank/Groupama":{name:"Groupama",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3083531"},addTags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"},removeTags:{amenity:"bank",brand:"Groupama","brand:wikidata":"Q3083531","brand:wikipedia":"en:Groupama",name:"Groupama"},matchScore:2,suggestion:true},"amenity/bank/HBL Bank":{name:"HBL Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1566843"},addTags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"},removeTags:{amenity:"bank",brand:"HBL Bank","brand:wikidata":"Q1566843","brand:wikipedia":"ur:ایچ بی ایل پاکستان",name:"HBL Bank"},matchScore:2,suggestion:true},"amenity/bank/HDFC Bank":{name:"HDFC Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q631047"},addTags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"},removeTags:{amenity:"bank",brand:"HDFC Bank","brand:wikidata":"Q631047","brand:wikipedia":"en:HDFC Bank",name:"HDFC Bank"},matchScore:2,suggestion:true},"amenity/bank/Halkbank":{name:"Halkbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3593818"},addTags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"},removeTags:{amenity:"bank",brand:"Halkbank","brand:wikidata":"Q3593818","brand:wikipedia":"en:Halkbank a.d.",name:"Halkbank"},matchScore:2,suggestion:true},"amenity/bank/Handelsbanken":{name:"Handelsbanken",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1421630"},addTags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"},removeTags:{amenity:"bank",brand:"Handelsbanken","brand:wikidata":"Q1421630","brand:wikipedia":"en:Handelsbanken",name:"Handelsbanken"},matchScore:2,suggestion:true},"amenity/bank/Heritage Bank":{name:"Heritage Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5738690"},addTags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"},removeTags:{amenity:"bank",brand:"Heritage Bank","brand:wikidata":"Q5738690","brand:wikipedia":"en:Heritage Bank",name:"Heritage Bank"},matchScore:2,suggestion:true},"amenity/bank/Hong Leong Bank":{name:"Hong Leong Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4383943"},addTags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"},removeTags:{amenity:"bank",brand:"Hong Leong Bank","brand:wikidata":"Q4383943","brand:wikipedia":"en:Hong Leong Bank",name:"Hong Leong Bank"},matchScore:2,suggestion:true},"amenity/bank/Hrvatska poštanska banka":{name:"Hrvatska poštanska banka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5923981"},addTags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"},removeTags:{amenity:"bank",brand:"Hrvatska poštanska banka","brand:wikidata":"Q5923981","brand:wikipedia":"en:Hrvatska poštanska banka",name:"Hrvatska poštanska banka"},matchScore:2,suggestion:true},"amenity/bank/HypoVereinsbank":{name:"HypoVereinsbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q220189"},addTags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"},removeTags:{amenity:"bank",brand:"HypoVereinsbank","brand:wikidata":"Q220189","brand:wikipedia":"en:HypoVereinsbank",name:"HypoVereinsbank"},matchScore:2,suggestion:true},"amenity/bank/ICICI Bank":{name:"ICICI Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1653258"},addTags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"},removeTags:{amenity:"bank",brand:"ICICI Bank","brand:wikidata":"Q1653258","brand:wikipedia":"en:ICICI Bank",name:"ICICI Bank"},matchScore:2,suggestion:true},"amenity/bank/IDBI Bank":{name:"IDBI Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3633485"},addTags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"},removeTags:{amenity:"bank",brand:"IDBI Bank","brand:wikidata":"Q3633485","brand:wikipedia":"en:IDBI Bank",name:"IDBI Bank"},matchScore:2,suggestion:true},"amenity/bank/ING":{name:"ING",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q645708"},addTags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"},removeTags:{amenity:"bank",brand:"ING","brand:wikidata":"Q645708","brand:wikipedia":"en:ING Group",name:"ING"},matchScore:2,suggestion:true},"amenity/bank/ING Bank Śląski":{name:"ING Bank Śląski",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1410383"},addTags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"en:ING Bank Śląski",name:"ING Bank Śląski"},removeTags:{amenity:"bank",brand:"ING Bank Śląski","brand:wikidata":"Q1410383","brand:wikipedia":"en:ING Bank Śląski",name:"ING Bank Śląski"},matchScore:2,suggestion:true},"amenity/bank/Ibercaja":{name:"Ibercaja",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5907815"},addTags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja Banco",name:"Ibercaja"},removeTags:{amenity:"bank",brand:"Ibercaja","brand:wikidata":"Q5907815","brand:wikipedia":"es:Ibercaja Banco",name:"Ibercaja"},matchScore:2,suggestion:true},"amenity/bank/Indian Bank":{name:"Indian Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003789"},addTags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"},removeTags:{amenity:"bank",brand:"Indian Bank","brand:wikidata":"Q2003789","brand:wikipedia":"en:Indian Bank",name:"Indian Bank"},matchScore:2,suggestion:true},"amenity/bank/Indian Overseas Bank":{name:"Indian Overseas Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003611"},addTags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"},removeTags:{amenity:"bank",brand:"Indian Overseas Bank","brand:wikidata":"Q2003611","brand:wikipedia":"en:Indian Overseas Bank",name:"Indian Overseas Bank"},matchScore:2,suggestion:true},"amenity/bank/Interbank":{name:"Interbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2835558"},addTags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"},removeTags:{amenity:"bank",brand:"Interbank","brand:wikidata":"Q2835558","brand:wikipedia":"es:Banco Interbank",name:"Interbank"},matchScore:2,suggestion:true},"amenity/bank/Intesa Sanpaolo":{name:"Intesa Sanpaolo",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1343118"},addTags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"},removeTags:{amenity:"bank",brand:"Intesa Sanpaolo","brand:wikidata":"Q1343118","brand:wikipedia":"it:Intesa Sanpaolo",name:"Intesa Sanpaolo"},matchScore:2,suggestion:true},"amenity/bank/Itaú":{name:"Itaú",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2423252"},addTags:{amenity:"bank",brand:"Itaú","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"},removeTags:{amenity:"bank",brand:"Itaú","brand:wikidata":"Q2423252","brand:wikipedia":"en:Itaú Corpbanca",name:"Itaú"},matchScore:2,suggestion:true},"amenity/bank/JS Bank":{name:"JS Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6108986"},addTags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"},removeTags:{amenity:"bank",brand:"JS Bank","brand:wikidata":"Q6108986","brand:wikipedia":"en:JS Bank",name:"JS Bank"},matchScore:2,suggestion:true},"amenity/bank/Jyske Bank":{name:"Jyske Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q136672"},addTags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"},removeTags:{amenity:"bank",brand:"Jyske Bank","brand:wikidata":"Q136672","brand:wikipedia":"en:Jyske Bank",name:"Jyske Bank"},matchScore:2,suggestion:true},"amenity/bank/K&H Bank":{name:"K&H Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6393834"},addTags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"},removeTags:{amenity:"bank",brand:"K&H Bank","brand:wikidata":"Q6393834","brand:wikipedia":"en:K&H Bank",name:"K&H Bank"},matchScore:2,suggestion:true},"amenity/bank/Karnataka Bank":{name:"Karnataka Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2042632"},addTags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"},removeTags:{amenity:"bank",brand:"Karnataka Bank","brand:wikidata":"Q2042632","brand:wikipedia":"en:Karnataka Bank",name:"Karnataka Bank"},matchScore:2,suggestion:true},"amenity/bank/Kasa Stefczyka":{name:"Kasa Stefczyka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q57624461"},addTags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"},removeTags:{amenity:"bank",brand:"Kasa Stefczyka","brand:wikidata":"Q57624461",name:"Kasa Stefczyka"},matchScore:2,suggestion:true},"amenity/bank/Komerční banka":{name:"Komerční banka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1541079"},addTags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"},removeTags:{amenity:"bank",brand:"Komerční banka","brand:wikidata":"Q1541079","brand:wikipedia":"en:Komerční banka",name:"Komerční banka"},matchScore:2,suggestion:true},"amenity/bank/Kreissparkasse":{name:"Kreissparkasse",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2513770"},addTags:{amenity:"bank",brand:"Kreissparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Kreissparkasse"},removeTags:{amenity:"bank",brand:"Kreissparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Kreissparkasse"},matchScore:2,suggestion:true},"amenity/bank/Kutxabank":{name:"Kutxabank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5139377"},addTags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"},removeTags:{amenity:"bank",brand:"Kutxabank","brand:wikidata":"Q5139377","brand:wikipedia":"en:Kutxabank",name:"Kutxabank"},matchScore:2,suggestion:true},"amenity/bank/La Banque Postale":{name:"La Banque Postale",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3206431"},addTags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"},removeTags:{amenity:"bank",brand:"La Banque Postale","brand:wikidata":"Q3206431","brand:wikipedia":"en:La Banque postale",name:"La Banque Postale"},matchScore:2,suggestion:true},"amenity/bank/La Caixa":{name:"La Caixa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q287753"},addTags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"},removeTags:{amenity:"bank",brand:"La Caixa","brand:wikidata":"Q287753","brand:wikipedia":"en:La Caixa",name:"La Caixa"},matchScore:2,suggestion:true},"amenity/bank/Laboral Kutxa":{name:"Laboral Kutxa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12052386"},addTags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"},removeTags:{amenity:"bank",brand:"Laboral Kutxa","brand:wikidata":"Q12052386","brand:wikipedia":"en:Laboral Kutxa",name:"Laboral Kutxa"},matchScore:2,suggestion:true},"amenity/bank/Landbank":{name:"Landbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6483872"},addTags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"},removeTags:{amenity:"bank",brand:"Landbank","brand:wikidata":"Q6483872","brand:wikipedia":"en:Land Bank of the Philippines",name:"Landbank"},matchScore:2,suggestion:true},"amenity/bank/Liberbank":{name:"Liberbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2891018"},addTags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"},removeTags:{amenity:"bank",brand:"Liberbank","brand:wikidata":"Q2891018","brand:wikipedia":"en:Liberbank",name:"Liberbank"},matchScore:2,suggestion:true},"amenity/bank/Lloyds Bank":{name:"Lloyds Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1152847"},addTags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"},removeTags:{amenity:"bank",brand:"Lloyds Bank","brand:wikidata":"Q1152847","brand:wikipedia":"en:Lloyds Bank",name:"Lloyds Bank"},matchScore:2,suggestion:true},"amenity/bank/M&T Bank":{name:"M&T Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3272257"},addTags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"},removeTags:{amenity:"bank",brand:"M&T Bank","brand:wikidata":"Q3272257","brand:wikipedia":"en:M&T Bank",name:"M&T Bank"},matchScore:2,suggestion:true},"amenity/bank/MCB":{name:"MCB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15982510"},addTags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"},removeTags:{amenity:"bank",brand:"MCB","brand:wikidata":"Q15982510","brand:wikipedia":"ur:ایم سی بی بینک لمیٹڈ",name:"MCB"},matchScore:2,suggestion:true},"amenity/bank/Maybank":{name:"Maybank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1364018"},addTags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"},removeTags:{amenity:"bank",brand:"Maybank","brand:wikidata":"Q1364018","brand:wikipedia":"en:Maybank",name:"Maybank"},matchScore:2,suggestion:true},"amenity/bank/Meezan Bank":{name:"Meezan Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6807934"},addTags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"},removeTags:{amenity:"bank",brand:"Meezan Bank","brand:wikidata":"Q6807934","brand:wikipedia":"en:Meezan Bank",name:"Meezan Bank"},matchScore:2,suggestion:true},"amenity/bank/Mibanco":{name:"Mibanco",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5558589"},addTags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"},removeTags:{amenity:"bank",brand:"Mibanco","brand:wikidata":"Q5558589","brand:wikipedia":"es:MiBanco",name:"Mibanco"},matchScore:2,suggestion:true},"amenity/bank/Millennium Bank":{name:"Millennium Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855947"},addTags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"},removeTags:{amenity:"bank",brand:"Millennium Bank","brand:wikidata":"Q4855947","brand:wikipedia":"pl:Bank Millennium",name:"Millennium Bank"},matchScore:2,suggestion:true},"amenity/bank/Millennium bcp":{name:"Millennium bcp",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q118581"},addTags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp"},removeTags:{amenity:"bank",brand:"Millennium bcp","brand:wikidata":"Q118581","brand:wikipedia":"pt:Banco Comercial Português",name:"Millennium bcp"},matchScore:2,suggestion:true},"amenity/bank/Monte dei Paschi di Siena":{name:"Monte dei Paschi di Siena",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q46730"},addTags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"},removeTags:{amenity:"bank",brand:"Monte dei Paschi di Siena","brand:wikidata":"Q46730","brand:wikipedia":"en:Banca Monte dei Paschi di Siena",name:"Monte dei Paschi di Siena"},matchScore:2,suggestion:true},"amenity/bank/Montepio":{name:"Montepio",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1946091"},addTags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"},removeTags:{amenity:"bank",brand:"Montepio","brand:wikidata":"Q1946091","brand:wikipedia":"en:Montepio (bank)",name:"Montepio"},matchScore:2,suggestion:true},"amenity/bank/NAB":{name:"NAB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1430985"},addTags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"},removeTags:{amenity:"bank",brand:"NAB","brand:wikidata":"Q1430985","brand:wikipedia":"en:National Australia Bank",name:"NAB"},matchScore:2,suggestion:true},"amenity/bank/NatWest":{name:"NatWest",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2740021"},addTags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"},removeTags:{amenity:"bank",brand:"NatWest","brand:wikidata":"Q2740021","brand:wikipedia":"en:NatWest",name:"NatWest"},matchScore:2,suggestion:true},"amenity/bank/Nationwide":{name:"Nationwide",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q846735"},addTags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"},removeTags:{amenity:"bank",brand:"Nationwide","brand:wikidata":"Q846735","brand:wikipedia":"en:Nationwide Building Society",name:"Nationwide"},matchScore:2,suggestion:true},"amenity/bank/Navy Federal Credit Union":{name:"Navy Federal Credit Union",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6982632"},addTags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"},removeTags:{amenity:"bank",brand:"Navy Federal Credit Union","brand:wikidata":"Q6982632","brand:wikipedia":"en:Navy Federal Credit Union",name:"Navy Federal Credit Union"},matchScore:2,suggestion:true},"amenity/bank/Nedbank":{name:"Nedbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2751701"},addTags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"},removeTags:{amenity:"bank",brand:"Nedbank","brand:wikidata":"Q2751701","brand:wikipedia":"en:Nedbank",name:"Nedbank"},matchScore:2,suggestion:true},"amenity/bank/Nordea":{name:"Nordea",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1123823"},addTags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"},removeTags:{amenity:"bank",brand:"Nordea","brand:wikidata":"Q1123823","brand:wikipedia":"en:Nordea",name:"Nordea"},matchScore:2,suggestion:true},"amenity/bank/Novo Banco":{name:"Novo Banco",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q17488861"},addTags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"},removeTags:{amenity:"bank",brand:"Novo Banco","brand:wikidata":"Q17488861","brand:wikipedia":"en:Novo Banco",name:"Novo Banco"},matchScore:2,suggestion:true},"amenity/bank/Oldenburgische Landesbank":{name:"Oldenburgische Landesbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q879591"},addTags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"},removeTags:{amenity:"bank",brand:"Oldenburgische Landesbank","brand:wikidata":"Q879591","brand:wikipedia":"en:Oldenburgische Landesbank",name:"Oldenburgische Landesbank"},matchScore:2,suggestion:true},"amenity/bank/One Network Bank":{name:"One Network Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7093019"},addTags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"},removeTags:{amenity:"bank",brand:"One Network Bank","brand:wikidata":"Q7093019","brand:wikipedia":"en:One Network Bank",name:"One Network Bank"},matchScore:2,suggestion:true},"amenity/bank/Oriental Bank of Commerce":{name:"Oriental Bank of Commerce",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q367008"},addTags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"},removeTags:{amenity:"bank",brand:"Oriental Bank of Commerce","brand:wikidata":"Q367008","brand:wikipedia":"en:Oriental Bank of Commerce",name:"Oriental Bank of Commerce"},matchScore:2,suggestion:true},"amenity/bank/PNC Bank":{name:"PNC Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q38928"},addTags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"},removeTags:{amenity:"bank",brand:"PNC Bank","brand:wikidata":"Q38928","brand:wikipedia":"en:PNC Financial Services",name:"PNC Bank"},matchScore:2,suggestion:true},"amenity/bank/Panin Bank":{name:"Panin Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12502751"},addTags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"},removeTags:{amenity:"bank",brand:"Panin Bank","brand:wikidata":"Q12502751","brand:wikipedia":"id:Panin Bank",name:"Panin Bank"},matchScore:2,suggestion:true},"amenity/bank/Patagonia":{name:"Patagonia",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882078"},addTags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"},removeTags:{amenity:"bank",brand:"Patagonia","brand:wikidata":"Q2882078","brand:wikipedia":"en:Banco Patagonia",name:"Patagonia"},matchScore:2,suggestion:true},"amenity/bank/Pekao SA":{name:"Pekao SA",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806642"},addTags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"},removeTags:{amenity:"bank",brand:"Pekao SA","brand:wikidata":"Q806642","brand:wikipedia":"pl:Bank Polska Kasa Opieki",name:"Pekao SA"},matchScore:2,suggestion:true},"amenity/bank/People's United Bank":{name:"People's United Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7165802"},addTags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"},removeTags:{amenity:"bank",brand:"People's United Bank","brand:wikidata":"Q7165802","brand:wikipedia":"en:People's United Financial",name:"People's United Bank"},matchScore:2,suggestion:true},"amenity/bank/Peoples Bank":{name:"Peoples Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7166050"},addTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"},removeTags:{amenity:"bank",brand:"Peoples Bank","brand:wikidata":"Q7166050","brand:wikipedia":"en:Peoples Bank",name:"Peoples Bank"},matchScore:2,suggestion:true},"amenity/bank/Philippine National Bank":{name:"Philippine National Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1657971"},addTags:{amenity:"bank",brand:"Philippine National Bank","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"Philippine National Bank"},removeTags:{amenity:"bank",brand:"Philippine National Bank","brand:wikidata":"Q1657971","brand:wikipedia":"en:Philippine National Bank",name:"Philippine National Bank"},matchScore:2,suggestion:true},"amenity/bank/Piraeus Bank":{name:"Piraeus Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3312"},addTags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"},removeTags:{amenity:"bank",brand:"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Piraeus Bank"},matchScore:2,suggestion:true},"amenity/bank/Postbank":{name:"Postbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q708835"},addTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"},removeTags:{amenity:"bank",brand:"Postbank","brand:wikidata":"Q708835","brand:wikipedia":"en:Deutsche Postbank",name:"Postbank"},matchScore:2,suggestion:true},"amenity/bank/Prima banka":{name:"Prima banka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q13538661"},addTags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"},removeTags:{amenity:"bank",brand:"Prima banka","brand:wikidata":"Q13538661","brand:wikipedia":"sk:Prima banka Slovensko",name:"Prima banka"},matchScore:2,suggestion:true},"amenity/bank/Punjab National Bank":{name:"Punjab National Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2743499"},addTags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"},removeTags:{amenity:"bank",brand:"Punjab National Bank","brand:wikidata":"Q2743499","brand:wikipedia":"en:Punjab National Bank",name:"Punjab National Bank"},matchScore:2,suggestion:true},"amenity/bank/RBC":{name:"RBC",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q735261"},addTags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC"},removeTags:{amenity:"bank",brand:"RBC","brand:wikidata":"Q735261","brand:wikipedia":"en:Royal Bank of Canada",name:"RBC"},matchScore:2,suggestion:true},"amenity/bank/RBS":{name:"RBS",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q160126"},addTags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS"},removeTags:{amenity:"bank",brand:"RBS","brand:wikidata":"Q160126","brand:wikipedia":"en:Royal Bank of Scotland",name:"RBS"},matchScore:2,suggestion:true},"amenity/bank/RCBC":{name:"RCBC",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7339070"},addTags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC"},removeTags:{amenity:"bank",brand:"RCBC","brand:wikidata":"Q7339070","brand:wikipedia":"en:Rizal Commercial Banking Corporation",name:"RCBC"},matchScore:2,suggestion:true},"amenity/bank/Rabobank":{name:"Rabobank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q252004"},addTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},removeTags:{amenity:"bank",brand:"Rabobank","brand:wikidata":"Q252004","brand:wikipedia":"en:Rabobank",name:"Rabobank"},matchScore:2,suggestion:true},"amenity/bank/Raiffeisen Polbank":{name:"Raiffeisen Polbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q9303218"},addTags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"},removeTags:{amenity:"bank",brand:"Raiffeisen Polbank","brand:wikidata":"Q9303218","brand:wikipedia":"pl:Raiffeisen Bank Polska",name:"Raiffeisen Polbank"},matchScore:2,suggestion:true},"amenity/bank/Regions Bank":{name:"Regions Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q917131"},addTags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"},removeTags:{amenity:"bank",brand:"Regions Bank","brand:wikidata":"Q917131","brand:wikipedia":"en:Regions Financial Corporation",name:"Regions Bank"},matchScore:2,suggestion:true},"amenity/bank/SNS Bank":{name:"SNS Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1857899"},addTags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"},removeTags:{amenity:"bank",brand:"SNS Bank","brand:wikidata":"Q1857899","brand:wikipedia":"en:De Volksbank",name:"SNS Bank"},matchScore:2,suggestion:true},"amenity/bank/Sampath Bank":{name:"Sampath Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7410095"},addTags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"},removeTags:{amenity:"bank",brand:"Sampath Bank","brand:wikidata":"Q7410095","brand:wikipedia":"en:Sampath Bank",name:"Sampath Bank"},matchScore:2,suggestion:true},"amenity/bank/Santander":{name:"Santander",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5835668"},addTags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"},removeTags:{amenity:"bank",brand:"Santander","brand:wikidata":"Q5835668","brand:wikipedia":"en:Santander Bank",name:"Santander"},matchScore:2,suggestion:true},"amenity/bank/Santander Río":{name:"Santander Río",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3385268"},addTags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"},removeTags:{amenity:"bank",brand:"Santander Río","brand:wikidata":"Q3385268","brand:wikipedia":"es:Banco Santander Río",name:"Santander Río"},matchScore:2,suggestion:true},"amenity/bank/Santander Totta":{name:"Santander Totta",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4854116"},addTags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"},removeTags:{amenity:"bank",brand:"Santander Totta","brand:wikidata":"Q4854116","brand:wikipedia":"pt:Banco Santander Portugal",name:"Santander Totta"},matchScore:2,suggestion:true},"amenity/bank/Sberbank":{name:"Sberbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q205012"},addTags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"},removeTags:{amenity:"bank",brand:"Sberbank","brand:wikidata":"Q205012","brand:wikipedia":"en:Sberbank of Russia",name:"Sberbank"},matchScore:2,suggestion:true},"amenity/bank/Scotiabank":{name:"Scotiabank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q451476"},addTags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"},removeTags:{amenity:"bank",brand:"Scotiabank","brand:wikidata":"Q451476","brand:wikipedia":"en:Scotiabank",name:"Scotiabank"},matchScore:2,suggestion:true},"amenity/bank/Security Bank":{name:"Security Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7444945"},addTags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"},removeTags:{amenity:"bank",brand:"Security Bank","brand:wikidata":"Q7444945","brand:wikipedia":"en:Security Bank",name:"Security Bank"},matchScore:2,suggestion:true},"amenity/bank/Seylan Bank":{name:"Seylan Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3532083"},addTags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"},removeTags:{amenity:"bank",brand:"Seylan Bank","brand:wikidata":"Q3532083","brand:wikipedia":"en:Seylan Bank",name:"Seylan Bank"},matchScore:2,suggestion:true},"amenity/bank/Sicoob":{name:"Sicoob",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q28679754"},addTags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"},removeTags:{amenity:"bank",brand:"Sicoob","brand:wikidata":"Q28679754","brand:wikipedia":"pt:Sistema de Cooperativas de Crédito do Brasil",name:"Sicoob"},matchScore:2,suggestion:true},"amenity/bank/Slovenská sporiteľňa":{name:"Slovenská sporiteľňa",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7541907"},addTags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"},removeTags:{amenity:"bank",brand:"Slovenská sporiteľňa","brand:wikidata":"Q7541907","brand:wikipedia":"en:Slovenská sporiteľňa",name:"Slovenská sporiteľňa"},matchScore:2,suggestion:true},"amenity/bank/Société Générale":{name:"Société Générale",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q270363"},addTags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"},removeTags:{amenity:"bank",brand:"Société Générale","brand:wikidata":"Q270363","brand:wikipedia":"en:Société Générale",name:"Société Générale"},matchScore:2,suggestion:true},"amenity/bank/Sonali Bank":{name:"Sonali Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3350382"},addTags:{amenity:"bank",brand:"Sonali Bank","brand:wikipedia":"en:Sonali Bank","brand:wikidata":"Q3350382",name:"Sonali Bank"},removeTags:{amenity:"bank",brand:"Sonali Bank","brand:wikipedia":"en:Sonali Bank","brand:wikidata":"Q3350382",name:"Sonali Bank"},matchScore:2,suggestion:true},"amenity/bank/Sparda-Bank":{name:"Sparda-Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2307136"},addTags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"},removeTags:{amenity:"bank",brand:"Sparda-Bank","brand:wikidata":"Q2307136","brand:wikipedia":"en:Sparda-Bank",name:"Sparda-Bank"},matchScore:2,suggestion:true},"amenity/bank/Sparkasse":{name:"Sparkasse",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2513770"},addTags:{amenity:"bank",brand:"Sparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Sparkasse"},removeTags:{amenity:"bank",brand:"Sparkasse","brand:wikidata":"Q2513770","brand:wikipedia":"de:Verband der Freien Sparkassen",name:"Sparkasse"},matchScore:2,suggestion:true},"amenity/bank/Stanbic Bank":{name:"Stanbic Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7597999"},addTags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"},removeTags:{amenity:"bank",brand:"Stanbic Bank","brand:wikidata":"Q7597999","brand:wikipedia":"en:Stanbic Bank",name:"Stanbic Bank"},matchScore:2,suggestion:true},"amenity/bank/Standard Bank":{name:"Standard Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1576610"},addTags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"},removeTags:{amenity:"bank",brand:"Standard Bank","brand:wikidata":"Q1576610","brand:wikipedia":"en:Standard Bank",name:"Standard Bank"},matchScore:2,suggestion:true},"amenity/bank/Standard Chartered":{name:"Standard Chartered",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q548278"},addTags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"},removeTags:{amenity:"bank",brand:"Standard Chartered","brand:wikidata":"Q548278","brand:wikipedia":"en:Standard Chartered",name:"Standard Chartered"},matchScore:2,suggestion:true},"amenity/bank/State Bank of India":{name:"State Bank of India",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1340361"},addTags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"},removeTags:{amenity:"bank",brand:"State Bank of India","brand:wikidata":"Q1340361","brand:wikipedia":"en:State Bank of India",name:"State Bank of India"},matchScore:2,suggestion:true},"amenity/bank/Summit Bank":{name:"Summit Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7637775"},addTags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"},removeTags:{amenity:"bank",brand:"Summit Bank","brand:wikidata":"Q7637775","brand:wikipedia":"en:Summit Bank",name:"Summit Bank"},matchScore:2,suggestion:true},"amenity/bank/SunTrust":{name:"SunTrust",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q181507"},addTags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"},removeTags:{amenity:"bank",brand:"SunTrust","brand:wikidata":"Q181507","brand:wikipedia":"en:SunTrust Banks",name:"SunTrust"},matchScore:2,suggestion:true},"amenity/bank/Swedbank":{name:"Swedbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1145493"},addTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},removeTags:{amenity:"bank",brand:"Swedbank","brand:wikidata":"Q1145493","brand:wikipedia":"en:Swedbank",name:"Swedbank"},matchScore:2,suggestion:true},"amenity/bank/Syndicate Bank":{name:"Syndicate Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004088"},addTags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"},removeTags:{amenity:"bank",brand:"Syndicate Bank","brand:wikidata":"Q2004088","brand:wikipedia":"en:Syndicate Bank",name:"Syndicate Bank"},matchScore:2,suggestion:true},"amenity/bank/TCF Bank":{name:"TCF Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7669687"},addTags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"},removeTags:{amenity:"bank",brand:"TCF Bank","brand:wikidata":"Q7669687","brand:wikipedia":"en:TCF Bank",name:"TCF Bank"},matchScore:2,suggestion:true},"amenity/bank/TD Bank":{name:"TD Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7669891"},addTags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"},removeTags:{amenity:"bank",brand:"TD Bank","brand:wikidata":"Q7669891","brand:wikipedia":"en:TD Bank, N.A.",name:"TD Bank"},matchScore:2,suggestion:true},"amenity/bank/TD Canada Trust":{name:"TD Canada Trust",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1080670"},addTags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"},removeTags:{amenity:"bank",brand:"TD Canada Trust","brand:wikidata":"Q1080670","brand:wikipedia":"en:TD Canada Trust",name:"TD Canada Trust"},matchScore:2,suggestion:true},"amenity/bank/TSB":{name:"TSB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7671560"},addTags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"},removeTags:{amenity:"bank",brand:"TSB","brand:wikidata":"Q7671560","brand:wikipedia":"en:TSB Bank (United Kingdom)",name:"TSB"},matchScore:2,suggestion:true},"amenity/bank/Targobank":{name:"Targobank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1455437"},addTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},removeTags:{amenity:"bank",brand:"Targobank","brand:wikidata":"Q1455437","brand:wikipedia":"en:Targobank",name:"Targobank"},matchScore:2,suggestion:true},"amenity/bank/Tatra banka":{name:"Tatra banka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1718069"},addTags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"},removeTags:{amenity:"bank",brand:"Tatra banka","brand:wikidata":"Q1718069","brand:wikipedia":"en:Tatra banka",name:"Tatra banka"},matchScore:2,suggestion:true},"amenity/bank/Türkiye İş Bankası":{name:"Türkiye İş Bankası",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q909613"},addTags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"},removeTags:{amenity:"bank",brand:"Türkiye İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"Türkiye İş Bankası"},matchScore:2,suggestion:true},"amenity/bank/UBI Banca":{name:"UBI Banca",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1476162"},addTags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"},removeTags:{amenity:"bank",brand:"UBI Banca","brand:wikidata":"Q1476162","brand:wikipedia":"en:UBI Banca",name:"UBI Banca"},matchScore:2,suggestion:true},"amenity/bank/UBL":{name:"UBL",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7887504"},addTags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"},removeTags:{amenity:"bank",brand:"UBL","brand:en":"United Bank Limited Pakistan","brand:wikidata":"Q7887504","brand:wikipedia":"ur:یونائیٹڈ بینک (پاکستان)",name:"UBL","name:en":"United Bank Limited Pakistan"},matchScore:2,suggestion:true},"amenity/bank/UBS":{name:"UBS",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q193199"},addTags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"},removeTags:{amenity:"bank",brand:"UBS","brand:wikidata":"Q193199","brand:wikipedia":"en:UBS",name:"UBS"},matchScore:2,suggestion:true},"amenity/bank/UCO Bank":{name:"UCO Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2005310"},addTags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"},removeTags:{amenity:"bank",brand:"UCO Bank","brand:wikidata":"Q2005310","brand:wikipedia":"en:UCO Bank",name:"UCO Bank"},matchScore:2,suggestion:true},"amenity/bank/US Bank":{name:"US Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q739084"},addTags:{amenity:"bank",brand:"US Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"US Bank"},removeTags:{amenity:"bank",brand:"US Bank","brand:wikidata":"Q739084","brand:wikipedia":"en:U.S. Bancorp",name:"US Bank"},matchScore:2,suggestion:true},"amenity/bank/Ulster Bank":{name:"Ulster Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2613366"},addTags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"},removeTags:{amenity:"bank",brand:"Ulster Bank","brand:wikidata":"Q2613366","brand:wikipedia":"en:Ulster Bank",name:"Ulster Bank"},matchScore:2,suggestion:true},"amenity/bank/Umpqua Bank":{name:"Umpqua Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7881772"},addTags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"},removeTags:{amenity:"bank",brand:"Umpqua Bank","brand:wikidata":"Q7881772","brand:wikipedia":"en:Umpqua Holdings Corporation",name:"Umpqua Bank"},matchScore:2,suggestion:true},"amenity/bank/UniCredit Bank":{name:"UniCredit Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q45568"},addTags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"},removeTags:{amenity:"bank",brand:"UniCredit Bank","brand:wikidata":"Q45568","brand:wikipedia":"en:UniCredit",name:"UniCredit Bank"},matchScore:2,suggestion:true},"amenity/bank/Unicaja Banco":{name:"Unicaja Banco",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2543704"},addTags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco"},removeTags:{amenity:"bank",brand:"Unicaja Banco","brand:wikidata":"Q2543704","brand:wikipedia":"en:Unicaja",name:"Unicaja Banco"},matchScore:2,suggestion:true},"amenity/bank/Union Bank of India":{name:"Union Bank of India",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2004078"},addTags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"},removeTags:{amenity:"bank",brand:"Union Bank of India","brand:wikidata":"Q2004078","brand:wikipedia":"en:Union Bank of India",name:"Union Bank of India"},matchScore:2,suggestion:true},"amenity/bank/UnionBank":{name:"UnionBank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1442804"},addTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"UnionBank"},removeTags:{amenity:"bank",brand:"UnionBank","brand:wikidata":"Q1442804","brand:wikipedia":"en:MUFG Union Bank",name:"UnionBank"},matchScore:2,suggestion:true},"amenity/bank/Vakıfbank":{name:"Vakıfbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1148521"},addTags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"},removeTags:{amenity:"bank",brand:"Vakıfbank","brand:wikidata":"Q1148521","brand:wikipedia":"en:VakıfBank",name:"Vakıfbank"},matchScore:2,suggestion:true},"amenity/bank/Veneto Banca":{name:"Veneto Banca",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3127221"},addTags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"},removeTags:{amenity:"bank",brand:"Veneto Banca","brand:wikidata":"Q3127221","brand:wikipedia":"en:Veneto Banca",name:"Veneto Banca"},matchScore:2,suggestion:true},"amenity/bank/Vijaya Bank":{name:"Vijaya Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2003171"},addTags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"},removeTags:{amenity:"bank",brand:"Vijaya Bank","brand:wikidata":"Q2003171","brand:wikipedia":"en:Vijaya Bank",name:"Vijaya Bank"},matchScore:2,suggestion:true},"amenity/bank/Volksbank":{name:"Volksbank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q695110"},addTags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"},removeTags:{amenity:"bank",brand:"Volksbank","brand:wikidata":"Q695110","brand:wikipedia":"en:Volksbank",name:"Volksbank"},matchScore:2,suggestion:true},"amenity/bank/Washington Federal":{name:"Washington Federal",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7971859"},addTags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"},removeTags:{amenity:"bank",brand:"Washington Federal","brand:wikidata":"Q7971859","brand:wikipedia":"en:Washington Federal",name:"Washington Federal"},matchScore:2,suggestion:true},"amenity/bank/Wells Fargo":{name:"Wells Fargo",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q744149"},addTags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"},removeTags:{amenity:"bank",brand:"Wells Fargo","brand:wikidata":"Q744149","brand:wikipedia":"en:Wells Fargo",name:"Wells Fargo"},matchScore:2,suggestion:true},"amenity/bank/Western Union":{name:"Western Union",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q861042"},addTags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},removeTags:{amenity:"bank",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},matchScore:2,suggestion:true},"amenity/bank/Westpac":{name:"Westpac",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2031726"},addTags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"},removeTags:{amenity:"bank",brand:"Westpac","brand:wikidata":"Q2031726","brand:wikipedia":"en:Westpac",name:"Westpac"},matchScore:2,suggestion:true},"amenity/bank/Yorkshire Bank":{name:"Yorkshire Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q8055678"},addTags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"},removeTags:{amenity:"bank",brand:"Yorkshire Bank","brand:wikidata":"Q8055678","brand:wikipedia":"en:Yorkshire Bank",name:"Yorkshire Bank"},matchScore:2,suggestion:true},"amenity/bank/Yorkshire Building Society":{name:"Yorkshire Building Society",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q12073381"},addTags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"},removeTags:{amenity:"bank",brand:"Yorkshire Building Society","brand:wikidata":"Q12073381","brand:wikipedia":"en:Yorkshire Building Society",name:"Yorkshire Building Society"},matchScore:2,suggestion:true},"amenity/bank/Zagrebačka banka":{name:"Zagrebačka banka",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q140381"},addTags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"},removeTags:{amenity:"bank",brand:"Zagrebačka banka","brand:wikidata":"Q140381","brand:wikipedia":"en:Zagrebačka banka",name:"Zagrebačka banka"},matchScore:2,suggestion:true},"amenity/bank/Zenith Bank":{name:"Zenith Bank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5978240"},addTags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"},removeTags:{amenity:"bank",brand:"Zenith Bank","brand:wikidata":"Q5978240","brand:wikipedia":"en:Zenith Bank",name:"Zenith Bank"},matchScore:2,suggestion:true},"amenity/bank/Ziraat Bankası":{name:"Ziraat Bankası",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q696003"},addTags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"},removeTags:{amenity:"bank",brand:"Ziraat Bankası","brand:wikidata":"Q696003","brand:wikipedia":"en:Ziraat Bankası",name:"Ziraat Bankası"},matchScore:2,suggestion:true},"amenity/bank/mBank":{name:"mBank",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1160928"},addTags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"},removeTags:{amenity:"bank",brand:"mBank","brand:wikidata":"Q1160928","brand:wikipedia":"en:MBank",name:"mBank"},matchScore:2,suggestion:true},"amenity/bank/ČSOB":{name:"ČSOB",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q340135"},addTags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"},removeTags:{amenity:"bank",brand:"ČSOB","brand:wikidata":"Q340135","brand:wikipedia":"en:Československá obchodní banka",name:"ČSOB"},matchScore:2,suggestion:true},"amenity/bank/Česká spořitelna":{name:"Česká spořitelna",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q341100"},addTags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"},removeTags:{amenity:"bank",brand:"Česká spořitelna","brand:wikidata":"Q341100","brand:wikipedia":"en:Česká spořitelna",name:"Česká spořitelna"},matchScore:2,suggestion:true},"amenity/bank/İş Bankası":{name:"İş Bankası",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q909613"},addTags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"},removeTags:{amenity:"bank",brand:"İş Bankası","brand:wikidata":"Q909613","brand:wikipedia":"en:Türkiye İş Bankası",name:"İş Bankası"},matchScore:2,suggestion:true},"amenity/bank/Εθνική Τράπεζα":{name:"Εθνική Τράπεζα",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1816028"},addTags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:en":"National Bank of Greece"},removeTags:{amenity:"bank",brand:"Εθνική Τράπεζα","brand:en":"National Bank of Greece","brand:wikidata":"Q1816028","brand:wikipedia":"en:National Bank of Greece",name:"Εθνική Τράπεζα","name:en":"National Bank of Greece"},matchScore:2,suggestion:true},"amenity/bank/Τράπεζα Πειραιώς":{name:"Τράπεζα Πειραιώς",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3312"},addTags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"},removeTags:{amenity:"bank",brand:"Τράπεζα Πειραιώς","brand:en":"Piraeus Bank","brand:wikidata":"Q3312","brand:wikipedia":"en:Piraeus Bank",name:"Τράπεζα Πειραιώς","name:en":"Piraeus Bank"},matchScore:2,suggestion:true},"amenity/bank/Альфа-Банк":{name:"Альфа-Банк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1377835"},addTags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:wikidata":"Q1377835","brand:wikipedia":"en:Alfa-Bank",name:"Альфа-Банк","name:en":"Alfa-Bank"},removeTags:{amenity:"bank",brand:"Альфа-Банк","brand:en":"Alfa-Bank","brand:wikidata":"Q1377835","brand:wikipedia":"en:Alfa-Bank",name:"Альфа-Банк","name:en":"Alfa-Bank"},matchScore:2,suggestion:true},"amenity/bank/Банка ДСК":{name:"Банка ДСК",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5206146"},addTags:{amenity:"bank",brand:"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:en":"DSK Bank"},removeTags:{amenity:"bank",brand:"Банка ДСК","brand:en":"DSK Bank","brand:wikidata":"Q5206146","brand:wikipedia":"en:DSK Bank",name:"Банка ДСК","name:en":"DSK Bank"},matchScore:2,suggestion:true},"amenity/bank/Белагропромбанк":{name:"Белагропромбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1991373"},addTags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"},removeTags:{amenity:"bank",brand:"Белагропромбанк","brand:en":"Belagroprom Bank","brand:wikidata":"Q1991373","brand:wikipedia":"be:Белаграпрамбанк",name:"Белагропромбанк","name:en":"Belagroprom Bank"},matchScore:2,suggestion:true},"amenity/bank/Беларусбанк":{name:"Беларусбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1997334"},addTags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"},removeTags:{amenity:"bank",brand:"Беларусбанк","brand:en":"Belarusbank","brand:wikidata":"Q1997334","brand:wikipedia":"en:Belarusbank",name:"Беларусбанк","name:en":"Belarusbank"},matchScore:2,suggestion:true},"amenity/bank/Бинбанк":{name:"Бинбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4086829"},addTags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"},removeTags:{amenity:"bank",brand:"Бинбанк","brand:en":"B&N Bank","brand:wikidata":"Q4086829","brand:wikipedia":"en:B&N Bank",name:"Бинбанк","name:en":"B&N Bank"},matchScore:2,suggestion:true},"amenity/bank/ВТБ":{name:"ВТБ",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1549389"},addTags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"},removeTags:{amenity:"bank",brand:"ВТБ","brand:en":"VTB Bank","brand:wikidata":"Q1549389","brand:wikipedia":"en:VTB Bank",name:"ВТБ","name:en":"VTB Bank"},matchScore:2,suggestion:true},"amenity/bank/Газпромбанк":{name:"Газпромбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1924338"},addTags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"},removeTags:{amenity:"bank",brand:"Газпромбанк","brand:en":"Gazprombank","brand:wikidata":"Q1924338","brand:wikipedia":"en:Gazprombank",name:"Газпромбанк","name:en":"Gazprombank"},matchScore:2,suggestion:true},"amenity/bank/Казкоммерцбанк":{name:"Казкоммерцбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1168179"},addTags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"},removeTags:{amenity:"bank",brand:"Казкоммерцбанк","brand:en":"Kazkommertsbank","brand:wikidata":"Q1168179","brand:wikipedia":"en:Kazkommertsbank",name:"Казкоммерцбанк","name:en":"Kazkommertsbank"},matchScore:2,suggestion:true},"amenity/bank/Московский индустриальный банк":{name:"Московский индустриальный банк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4304145"},addTags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"},removeTags:{amenity:"bank",brand:"Московский индустриальный банк","brand:en":"Moscow Industrial Bank","brand:wikidata":"Q4304145","brand:wikipedia":"ru:Московский индустриальный банк",name:"Московский индустриальный банк","name:en":"Moscow Industrial Bank"},matchScore:2,suggestion:true},"amenity/bank/Мособлбанк":{name:"Мособлбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4304446"},addTags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"},removeTags:{amenity:"bank",brand:"Мособлбанк","brand:en":"Mosobl Bank","brand:wikidata":"Q4304446","brand:wikipedia":"ru:Мособлбанк",name:"Мособлбанк","name:en":"Mosobl Bank"},matchScore:2,suggestion:true},"amenity/bank/ОТП Банк":{name:"ОТП Банк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q912778"},addTags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"},removeTags:{amenity:"bank",brand:"ОТП Банк","brand:en":"OTP Bank","brand:wikidata":"Q912778","brand:wikipedia":"en:OTP Bank",name:"ОТП Банк","name:en":"OTP Bank"},matchScore:2,suggestion:true},"amenity/bank/Обединена Българска Банка":{name:"Обединена Българска Банка",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7887555"},addTags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"},removeTags:{amenity:"bank",brand:"Обединена Българска Банка","brand:en":"United Bulgarian Bank","brand:wikidata":"Q7887555","brand:wikipedia":"en:United Bulgarian Bank",name:"Обединена Българска Банка","name:en":"United Bulgarian Bank"},matchScore:2,suggestion:true},"amenity/bank/Ощадбанк":{name:"Ощадбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4340839"},addTags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"},removeTags:{amenity:"bank",brand:"Ощадбанк","brand:en":"State Savings Bank of Ukraine","brand:wikidata":"Q4340839","brand:wikipedia":"uk:Ощадбанк",name:"Ощадбанк","name:en":"State Savings Bank of Ukraine"},matchScore:2,suggestion:true},"amenity/bank/ПУМБ":{name:"ПУМБ",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4341156"},addTags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"},removeTags:{amenity:"bank",brand:"ПУМБ","brand:en":"First Ukrainian International Bank","brand:wikidata":"Q4341156","brand:wikipedia":"en:First Ukrainian International Bank",name:"ПУМБ","name:en":"First Ukrainian International Bank"},matchScore:2,suggestion:true},"amenity/bank/Почта Банк":{name:"Почта Банк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q24930461"},addTags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"},removeTags:{amenity:"bank",brand:"Почта Банк","brand:en":"Post Bank","brand:wikidata":"Q24930461","brand:wikipedia":"en:Post Bank (Russia)",name:"Почта Банк","name:en":"Post Bank"},matchScore:2,suggestion:true},"amenity/bank/ПриватБанк":{name:"ПриватБанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1515015"},addTags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"},removeTags:{amenity:"bank",brand:"ПриватБанк","brand:en":"PrivatBank","brand:wikidata":"Q1515015","brand:wikipedia":"uk:ПриватБанк",name:"ПриватБанк","name:en":"PrivatBank"},matchScore:2,suggestion:true},"amenity/bank/Приорбанк":{name:"Приорбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3919658"},addTags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"},removeTags:{amenity:"bank",brand:"Приорбанк","brand:en":"PriorBank","brand:wikidata":"Q3919658","brand:wikipedia":"be:Пріорбанк",name:"Приорбанк","name:en":"PriorBank"},matchScore:2,suggestion:true},"amenity/bank/Промсвязьбанк":{name:"Промсвязьбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q649100"},addTags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"},removeTags:{amenity:"bank",brand:"Промсвязьбанк","brand:en":"Promsvyazbank","brand:wikidata":"Q649100","brand:wikipedia":"en:Promsvyazbank",name:"Промсвязьбанк","name:en":"Promsvyazbank"},matchScore:2,suggestion:true},"amenity/bank/Райффайзен":{name:"Райффайзен",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4389244"},addTags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"},removeTags:{amenity:"bank",brand:"Райффайзен","brand:en":"Raiffeisenbank","brand:wikidata":"Q4389244","brand:wikipedia":"en:Raiffeisenbank (Russia)",name:"Райффайзен","name:en":"Raiffeisenbank"},matchScore:2,suggestion:true},"amenity/bank/Райффайзен Банк Аваль":{name:"Райффайзен Банк Аваль",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4389243"},addTags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"},removeTags:{amenity:"bank",brand:"Райффайзен Банк Аваль","brand:en":"Raiffeisen Bank Aval","brand:wikidata":"Q4389243","brand:wikipedia":"en:Raiffeisen Bank Aval",name:"Райффайзен Банк Аваль","name:en":"Raiffeisen Bank Aval"},matchScore:2,suggestion:true},"amenity/bank/Росбанк":{name:"Росбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1119857"},addTags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"},removeTags:{amenity:"bank",brand:"Росбанк","brand:en":"Rosbank","brand:wikidata":"Q1119857","brand:wikipedia":"en:Rosbank",name:"Росбанк","name:en":"Rosbank"},matchScore:2,suggestion:true},"amenity/bank/Россельхозбанк":{name:"Россельхозбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3920226"},addTags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Rosselkhozbank",name:"Россельхозбанк","name:en":"Rosselkhozbank"},removeTags:{amenity:"bank",brand:"Россельхозбанк","brand:en":"Rosselkhozbank","brand:wikidata":"Q3920226","brand:wikipedia":"en:Rosselkhozbank",name:"Россельхозбанк","name:en":"Rosselkhozbank"},matchScore:2,suggestion:true},"amenity/bank/Русский Стандарт":{name:"Русский Стандарт",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4400854"},addTags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"},removeTags:{amenity:"bank",brand:"Русский Стандарт","brand:en":"Russian Standard Bank","brand:wikidata":"Q4400854","brand:wikipedia":"en:Russian Standard Bank",name:"Русский Стандарт","name:en":"Russian Standard Bank"},matchScore:2,suggestion:true},"amenity/bank/Сбербанк":{name:"Сбербанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4378147"},addTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"},removeTags:{amenity:"bank",brand:"Сбербанк","brand:en":"Prisbank","brand:wikidata":"Q4378147","brand:wikipedia":"ru:Приднестровский Сбербанк",name:"Сбербанк","name:en":"Prisbank"},matchScore:2,suggestion:true},"amenity/bank/Совкомбанк":{name:"Совкомбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4426566"},addTags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"},removeTags:{amenity:"bank",brand:"Совкомбанк","brand:en":"Sovcom Bank","brand:wikidata":"Q4426566","brand:wikipedia":"ru:Совкомбанк",name:"Совкомбанк","name:en":"Sovcom Bank"},matchScore:2,suggestion:true},"amenity/bank/УкрСиббанк":{name:"УкрСиббанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1976290"},addTags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"},removeTags:{amenity:"bank",brand:"УкрСиббанк","brand:en":"UkrSibbank","brand:wikidata":"Q1976290","brand:wikipedia":"en:UkrSibbank",name:"УкрСиббанк","name:en":"UkrSibbank"},matchScore:2,suggestion:true},"amenity/bank/Укргазбанк":{name:"Укргазбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4470692"},addTags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"},removeTags:{amenity:"bank",brand:"Укргазбанк","brand:en":"Ukrgasbank","brand:wikidata":"Q4470692","brand:wikipedia":"ru:Укргазбанк",name:"Укргазбанк","name:en":"Ukrgasbank"},matchScore:2,suggestion:true},"amenity/bank/Укрсоцбанк":{name:"Укрсоцбанк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q3547885"},addTags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"},removeTags:{amenity:"bank",brand:"Укрсоцбанк","brand:en":"Ukrsotsbank","brand:wikidata":"Q3547885","brand:wikipedia":"en:Ukrsotsbank",name:"Укрсоцбанк","name:en":"Ukrsotsbank"},matchScore:2,suggestion:true},"amenity/bank/Уралсиб":{name:"Уралсиб",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4476693"},addTags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"},removeTags:{amenity:"bank",brand:"Уралсиб","brand:en":"Uralsib bank","brand:wikidata":"Q4476693","brand:wikipedia":"ru:Уралсиб (банк)",name:"Уралсиб","name:en":"Uralsib bank"},matchScore:2,suggestion:true},"amenity/bank/Хаан банк":{name:"Хаан банк",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q25632240"},addTags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"},removeTags:{amenity:"bank",brand:"Хаан банк","brand:wikidata":"Q25632240","brand:wikipedia":"mn:ХААН банк",name:"Хаан банк"},matchScore:2,suggestion:true},"amenity/bank/Хоум Кредит":{name:"Хоум Кредит",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4500466"},addTags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"},removeTags:{amenity:"bank",brand:"Хоум Кредит","brand:en":"Home Credit & Finance Bank","brand:wikidata":"Q4500466","brand:wikipedia":"en:Home Credit & Finance Bank",name:"Хоум Кредит","name:en":"Home Credit & Finance Bank"},matchScore:2,suggestion:true},"amenity/bank/בנק הפועלים":{name:"בנק הפועלים",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2666775"},addTags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim"},removeTags:{amenity:"bank",brand:"בנק הפועלים","brand:en":"Bank Hapoalim","brand:wikidata":"Q2666775","brand:wikipedia":"en:Bank Hapoalim",name:"בנק הפועלים","name:en":"Bank Hapoalim"},matchScore:2,suggestion:true},"amenity/bank/בנק לאומי":{name:"בנק לאומי",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806641"},addTags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi"},removeTags:{amenity:"bank",brand:"בנק לאומי","brand:en":"Bank Leumi","brand:wikidata":"Q806641","brand:wikipedia":"en:Bank Leumi",name:"בנק לאומי","name:en":"Bank Leumi"},matchScore:2,suggestion:true},"amenity/bank/بانک آینده":{name:"بانک آینده",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5938144"},addTags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"},removeTags:{amenity:"bank",brand:"بانک آینده","brand:en":"Ayandeh Bank","brand:wikidata":"Q5938144","brand:wikipedia":"en:Ayandeh Bank",name:"بانک آینده","name:en":"Ayandeh Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک اقتصاد نوین":{name:"بانک اقتصاد نوین",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5323768"},addTags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"},removeTags:{amenity:"bank",brand:"بانک اقتصاد نوین","brand:en":"EN Bank","brand:wikidata":"Q5323768","brand:wikipedia":"en:EN Bank",name:"بانک اقتصاد نوین","name:en":"EN Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک رفاه":{name:"بانک رفاه",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7307083"},addTags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"},removeTags:{amenity:"bank",brand:"بانک رفاه","brand:en":"Refah Bank","brand:wikidata":"Q7307083","brand:wikipedia":"en:Refah Bank",name:"بانک رفاه","name:en":"Refah Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سامان":{name:"بانک سامان",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4117676"},addTags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"},removeTags:{amenity:"bank",brand:"بانک سامان","brand:en":"Saman Bank","brand:wikidata":"Q4117676","brand:wikipedia":"en:Saman Bank",name:"بانک سامان","name:en":"Saman Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سرمایه":{name:"بانک سرمایه",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7424291"},addTags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"},removeTags:{amenity:"bank",brand:"بانک سرمایه","brand:en":"Sarmayeh Bank","brand:wikidata":"Q7424291","brand:wikipedia":"en:Sarmayeh Bank",name:"بانک سرمایه","name:en":"Sarmayeh Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک سپه":{name:"بانک سپه",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882624"},addTags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"},removeTags:{amenity:"bank",brand:"بانک سپه","brand:en":"Bank Sepah","brand:wikidata":"Q2882624","brand:wikipedia":"en:Bank Sepah",name:"بانک سپه","name:en":"Bank Sepah"},matchScore:2,suggestion:true},"amenity/bank/بانک سینا":{name:"بانک سینا",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10860246"},addTags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"},removeTags:{amenity:"bank",brand:"بانک سینا","brand:en":"Sina Bank","brand:wikidata":"Q10860246","brand:wikipedia":"en:Sina Bank",name:"بانک سینا","name:en":"Sina Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک شهر":{name:"بانک شهر",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5941033"},addTags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"},removeTags:{amenity:"bank",brand:"بانک شهر","brand:en":"Shahr Bank","brand:wikidata":"Q5941033","brand:wikipedia":"fa:بانک شهر",name:"بانک شهر","name:en":"Shahr Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک صادرات":{name:"بانک صادرات",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882608"},addTags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"},removeTags:{amenity:"bank",brand:"بانک صادرات","brand:en":"Bank Saderat Iran","brand:wikidata":"Q2882608","brand:wikipedia":"en:Bank Saderat Iran",name:"بانک صادرات","name:en":"Bank Saderat Iran"},matchScore:2,suggestion:true},"amenity/bank/بانک قوامین":{name:"بانک قوامین",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10860253"},addTags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"},removeTags:{amenity:"bank",brand:"بانک قوامین","brand:en":"Ghavamin Bank","brand:wikidata":"Q10860253","brand:wikipedia":"en:Ghavamin Bank",name:"بانک قوامین","name:en":"Ghavamin Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک مسکن":{name:"بانک مسکن",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855942"},addTags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"},removeTags:{amenity:"bank",brand:"بانک مسکن","brand:en":"Bank Maskan","brand:wikidata":"Q4855942","brand:wikipedia":"en:Bank Maskan",name:"بانک مسکن","name:en":"Bank Maskan"},matchScore:2,suggestion:true},"amenity/bank/بانک ملت":{name:"بانک ملت",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855944"},addTags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"},removeTags:{amenity:"bank",brand:"بانک ملت","brand:en":"Bank Mellat","brand:wikidata":"Q4855944","brand:wikipedia":"en:Bank Mellat",name:"بانک ملت","name:en":"Bank Mellat"},matchScore:2,suggestion:true},"amenity/bank/بانک ملی ایران":{name:"بانک ملی ایران",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806640"},addTags:{amenity:"bank",brand:"بانک ملی ایران","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی ایران","name:en":"Bank Melli Iran"},removeTags:{amenity:"bank",brand:"بانک ملی ایران","brand:en":"Bank Melli Iran","brand:wikidata":"Q806640","brand:wikipedia":"en:Bank Melli Iran",name:"بانک ملی ایران","name:en":"Bank Melli Iran"},matchScore:2,suggestion:true},"amenity/bank/بانک پارسیان":{name:"بانک پارسیان",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2410404"},addTags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"},removeTags:{amenity:"bank",brand:"بانک پارسیان","brand:en":"Parsian Bank","brand:wikidata":"Q2410404","brand:wikipedia":"en:Parsian Bank",name:"بانک پارسیان","name:en":"Parsian Bank"},matchScore:2,suggestion:true},"amenity/bank/بانک پاسارگاد":{name:"بانک پاسارگاد",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855962"},addTags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"},removeTags:{amenity:"bank",brand:"بانک پاسارگاد","brand:en":"Bank Pasargad","brand:wikidata":"Q4855962","brand:wikipedia":"en:Bank Pasargad",name:"بانک پاسارگاد","name:en":"Bank Pasargad"},matchScore:2,suggestion:true},"amenity/bank/بانک کشاورزی":{name:"بانک کشاورزی",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6395007"},addTags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"},removeTags:{amenity:"bank",brand:"بانک کشاورزی","brand:en":"Bank Keshavarzi Iran","brand:wikidata":"Q6395007","brand:wikipedia":"en:Bank Keshavarzi Iran",name:"بانک کشاورزی","name:en":"Bank Keshavarzi Iran"},matchScore:2,suggestion:true},"amenity/bank/پست بانک":{name:"پست بانک",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7233625"},addTags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"},removeTags:{amenity:"bank",brand:"پست بانک","brand:en":"Post Bank of Iran","brand:wikidata":"Q7233625","brand:wikipedia":"en:Post Bank of Iran",name:"پست بانک","name:en":"Post Bank of Iran"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงเทพ":{name:"ธนาคารกรุงเทพ",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806483"},addTags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank"},removeTags:{amenity:"bank",brand:"ธนาคารกรุงเทพ","brand:en":"Bangkok Bank","brand:wikidata":"Q806483","brand:wikipedia":"en:Bangkok Bank",name:"ธนาคารกรุงเทพ","name:en":"Bangkok Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกรุงไทย":{name:"ธนาคารกรุงไทย",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q962865"},addTags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank"},removeTags:{amenity:"bank",brand:"ธนาคารกรุงไทย","brand:en":"Krung Thai Bank","brand:wikidata":"Q962865","brand:wikipedia":"en:Krung Thai Bank",name:"ธนาคารกรุงไทย","name:en":"Krung Thai Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารกสิกรไทย":{name:"ธนาคารกสิกรไทย",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q276557"},addTags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank"},removeTags:{amenity:"bank",brand:"ธนาคารกสิกรไทย","brand:en":"en:Kasikornbank","brand:wikidata":"Q276557","brand:wikipedia":"en:Kasikornbank",name:"ธนาคารกสิกรไทย","name:en":"en:Kasikornbank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารออมสิน":{name:"ธนาคารออมสิน",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6579041"},addTags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank"},removeTags:{amenity:"bank",brand:"ธนาคารออมสิน","brand:en":"Government Savings Bank","brand:wikidata":"Q6579041","brand:wikipedia":"en:Government Savings Bank (Thailand)",name:"ธนาคารออมสิน","name:en":"Government Savings Bank"},matchScore:2,suggestion:true},"amenity/bank/ธนาคารไทยพาณิชย์":{name:"ธนาคารไทยพาณิชย์",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2038986"},addTags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank"},removeTags:{amenity:"bank",brand:"ธนาคารไทยพาณิชย์","brand:en":"Siam Commercial Bank","brand:wikidata":"Q2038986","brand:wikipedia":"en:Siam Commercial Bank",name:"ธนาคารไทยพาณิชย์","name:en":"Siam Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/みずほ銀行":{name:"みずほ銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2882956"},addTags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank"},removeTags:{amenity:"bank",brand:"みずほ銀行","brand:en":"Mizuho Bank","brand:wikidata":"Q2882956","brand:wikipedia":"en:Mizuho Bank",name:"みずほ銀行","name:en":"Mizuho Bank"},matchScore:2,suggestion:true},"amenity/bank/三井住友銀行":{name:"三井住友銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2660418"},addTags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"},removeTags:{amenity:"bank",brand:"三井住友銀行","brand:en":"Sumitomo Mitsui Banking Corporation","brand:wikidata":"Q2660418","brand:wikipedia":"en:Sumitomo Mitsui Banking Corporation",name:"三井住友銀行","name:en":"Sumitomo Mitsui Banking Corporation"},matchScore:2,suggestion:true},"amenity/bank/三菱東京UFJ銀行":{name:"三菱東京UFJ銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q988284"},addTags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"},removeTags:{amenity:"bank",brand:"三菱東京UFJ銀行","brand:en":"MUFG Bank","brand:wikidata":"Q988284","brand:wikipedia":"en:MUFG Bank",name:"三菱東京UFJ銀行","name:en":"MUFG Bank"},matchScore:2,suggestion:true},"amenity/bank/上海商業儲蓄銀行":{name:"上海商業儲蓄銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4207208"},addTags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"},removeTags:{amenity:"bank",brand:"上海商業儲蓄銀行","brand:en":"Shanghai Commercial and Savings Bank","brand:wikidata":"Q4207208","brand:wikipedia":"en:Shanghai Commercial and Savings Bank",name:"上海商業儲蓄銀行","name:en":"Shanghai Commercial and Savings Bank"},matchScore:2,suggestion:true},"amenity/bank/中国农业银行":{name:"中国农业银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26298"},addTags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"},removeTags:{amenity:"bank",brand:"中国农业银行","brand:en":"Agricultural Bank of China","brand:wikidata":"Q26298","brand:wikipedia":"en:Agricultural Bank of China",name:"中国农业银行","name:en":"Agricultural Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国工商银行":{name:"中国工商银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26463"},addTags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"},removeTags:{amenity:"bank",brand:"中国工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"中国工商银行","name:en":"Industrial and Commercial Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国建设银行":{name:"中国建设银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26299"},addTags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"},removeTags:{amenity:"bank",brand:"中国建设银行","brand:en":"China Construction Bank","brand:wikidata":"Q26299","brand:wikipedia":"en:China Construction Bank",name:"中国建设银行","name:en":"China Construction Bank"},matchScore:2,suggestion:true},"amenity/bank/中国邮政储蓄银行":{name:"中国邮政储蓄银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q986744"},addTags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"},removeTags:{amenity:"bank",brand:"中国邮政储蓄银行","brand:en":"Postal Savings Bank of China","brand:wikidata":"Q986744","brand:wikipedia":"en:Postal Savings Bank of China",name:"中国邮政储蓄银行","name:en":"Postal Savings Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中国银行":{name:"中国银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q790068"},addTags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"},removeTags:{amenity:"bank",brand:"中国银行","brand:en":"Bank of China","brand:wikidata":"Q790068","brand:wikipedia":"en:Bank of China",name:"中国银行","name:en":"Bank of China"},matchScore:2,suggestion:true},"amenity/bank/中國信託商業銀行":{name:"中國信託商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5100191"},addTags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"},removeTags:{amenity:"bank",brand:"中國信託商業銀行","brand:en":"CTBC Bank","brand:wikidata":"Q5100191","brand:wikipedia":"en:CTBC Bank",name:"中國信託商業銀行","name:en":"CTBC Bank"},matchScore:2,suggestion:true},"amenity/bank/交通银行":{name:"交通银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q806680"},addTags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"},removeTags:{amenity:"bank",brand:"交通银行","brand:en":"Bank of Communications","brand:wikidata":"Q806680","brand:wikipedia":"en:Bank of Communications",name:"交通银行","name:en":"Bank of Communications"},matchScore:2,suggestion:true},"amenity/bank/京都中央信用金庫":{name:"京都中央信用金庫",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11374844"},addTags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"jp:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"},removeTags:{amenity:"bank",brand:"京都中央信用金庫","brand:en":"Kyoto Chuo Shinkin Bank","brand:wikidata":"Q11374844","brand:wikipedia":"jp:京都中央信用金庫",name:"京都中央信用金庫","name:en":"Kyoto Chuo Shinkin Bank"},matchScore:2,suggestion:true},"amenity/bank/京都銀行":{name:"京都銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11375713"},addTags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"},removeTags:{amenity:"bank",brand:"京都銀行","brand:en":"Bank of Kyoto","brand:wikidata":"Q11375713","brand:wikipedia":"en:Bank of Kyoto",name:"京都銀行","name:en":"Bank of Kyoto"},matchScore:2,suggestion:true},"amenity/bank/元大商業銀行":{name:"元大商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10889602"},addTags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"},removeTags:{amenity:"bank",brand:"元大商業銀行","brand:en":"Yuanta Commercial Bank","brand:wikidata":"Q10889602","brand:wikipedia":"zh:元大商業銀行",name:"元大商業銀行","name:en":"Yuanta Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/兆豐國際商業銀行":{name:"兆豐國際商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q709757"},addTags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"},removeTags:{amenity:"bank",brand:"兆豐國際商業銀行","brand:en":"Mega International Commercial Bank","brand:wikidata":"Q709757","brand:wikipedia":"en:Mega International Commercial Bank",name:"兆豐國際商業銀行","name:en":"Mega International Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/北洋銀行":{name:"北洋銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11402354"},addTags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"},removeTags:{amenity:"bank",brand:"北洋銀行","brand:en":"North Pacific Bank","brand:wikidata":"Q11402354","brand:wikipedia":"ja:北洋銀行",name:"北洋銀行","name:en":"North Pacific Bank"},matchScore:2,suggestion:true},"amenity/bank/北海道銀行":{name:"北海道銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5878076"},addTags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"},removeTags:{amenity:"bank",brand:"北海道銀行","brand:en":"Hokkaido Bank","brand:wikidata":"Q5878076","brand:wikipedia":"en:Hokkaido Bank",name:"北海道銀行","name:en":"Hokkaido Bank"},matchScore:2,suggestion:true},"amenity/bank/台中商業銀行":{name:"台中商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q6136958"},addTags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"},removeTags:{amenity:"bank",brand:"台中商業銀行","brand:en":"Taichung Bank","brand:wikidata":"Q6136958","brand:wikipedia":"en:Taichung Bank",name:"台中商業銀行","name:en":"Taichung Bank"},matchScore:2,suggestion:true},"amenity/bank/台北富邦商業銀行":{name:"台北富邦商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q697293"},addTags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"},removeTags:{amenity:"bank",brand:"台北富邦商業銀行","brand:en":"Taipei Fubon Bank","brand:wikidata":"Q697293","brand:wikipedia":"en:Taipei Fubon Bank",name:"台北富邦商業銀行","name:en":"Taipei Fubon Bank"},matchScore:2,suggestion:true},"amenity/bank/台新國際商業銀行":{name:"台新國際商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7676420"},addTags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"},removeTags:{amenity:"bank",brand:"台新國際商業銀行","brand:en":"Taishin International Bank","brand:wikidata":"Q7676420","brand:wikipedia":"en:Taishin International Bank",name:"台新國際商業銀行","name:en":"Taishin International Bank"},matchScore:2,suggestion:true},"amenity/bank/合作金庫商業銀行":{name:"合作金庫商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q701540"},addTags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"},removeTags:{amenity:"bank",brand:"合作金庫商業銀行","brand:en":"Taiwan Cooperative Bank","brand:wikidata":"Q701540","brand:wikipedia":"en:Taiwan Cooperative Bank",name:"合作金庫商業銀行","name:en":"Taiwan Cooperative Bank"},matchScore:2,suggestion:true},"amenity/bank/國泰世華商業銀行":{name:"國泰世華商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q702656"},addTags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"},removeTags:{amenity:"bank",brand:"國泰世華商業銀行","brand:en":"Cathay United Bank","brand:wikidata":"Q702656","brand:wikipedia":"en:Cathay United Bank",name:"國泰世華商業銀行","name:en":"Cathay United Bank"},matchScore:2,suggestion:true},"amenity/bank/大眾商業銀行":{name:"大眾商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10937047"},addTags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"},removeTags:{amenity:"bank",brand:"大眾商業銀行","brand:en":"Ta Chong Commercial Bank","brand:wikidata":"Q10937047","brand:wikipedia":"zh:大眾商業銀行",name:"大眾商業銀行","name:en":"Ta Chong Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/安泰商業銀行":{name:"安泰商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q10946952"},addTags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"},removeTags:{amenity:"bank",brand:"安泰商業銀行","brand:en":"Entie Commercial Bank","brand:wikidata":"Q10946952","brand:wikipedia":"zh:安泰商業銀行",name:"安泰商業銀行","name:en":"Entie Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/工商银行":{name:"工商银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q26463"},addTags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"},removeTags:{amenity:"bank",brand:"工商银行","brand:en":"Industrial and Commercial Bank of China","brand:wikidata":"Q26463","brand:wikipedia":"en:Industrial and Commercial Bank of China",name:"工商银行","name:en":"Industrial and Commercial Bank of China"},matchScore:2,suggestion:true},"amenity/bank/彰化商業銀行":{name:"彰化商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5071627"},addTags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"},removeTags:{amenity:"bank",brand:"彰化商業銀行","brand:en":"Chang Hwa Bank","brand:wikidata":"Q5071627","brand:wikipedia":"en:Chang Hwa Bank",name:"彰化商業銀行","name:en":"Chang Hwa Bank"},matchScore:2,suggestion:true},"amenity/bank/招商银行":{name:"招商银行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q1073327"},addTags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"},removeTags:{amenity:"bank",brand:"招商银行","brand:en":"China Merchants Bank","brand:wikidata":"Q1073327","brand:wikipedia":"en:China Merchants Bank",name:"招商银行","name:en":"China Merchants Bank"},matchScore:2,suggestion:true},"amenity/bank/板信商業銀行":{name:"板信商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11104946"},addTags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"},removeTags:{amenity:"bank",brand:"板信商業銀行","brand:en":"Bank of Panshin","brand:wikidata":"Q11104946","brand:wikipedia":"zh:板信商業銀行",name:"板信商業銀行","name:en":"Bank of Panshin"},matchScore:2,suggestion:true},"amenity/bank/横浜銀行":{name:"横浜銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q2744340"},addTags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"},removeTags:{amenity:"bank",brand:"横浜銀行","brand:en":"Bank of Yokohama","brand:wikidata":"Q2744340","brand:wikipedia":"en:Bank of Yokohama",name:"横浜銀行","name:en":"Bank of Yokohama"},matchScore:2,suggestion:true},"amenity/bank/永豐商業銀行":{name:"永豐商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q4855976"},addTags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"},removeTags:{amenity:"bank",brand:"永豐商業銀行","brand:en":"Bank SinoPac","brand:wikidata":"Q4855976","brand:wikipedia":"en:Bank SinoPac",name:"永豐商業銀行","name:en":"Bank SinoPac"},matchScore:2,suggestion:true},"amenity/bank/玉山商業銀行":{name:"玉山商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q5321663"},addTags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"},removeTags:{amenity:"bank",brand:"玉山商業銀行","brand:en":"E.SUN Commercial Bank","brand:wikidata":"Q5321663","brand:wikipedia":"en:E.SUN Commercial Bank",name:"玉山商業銀行","name:en":"E.SUN Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/第一商業銀行":{name:"第一商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11602128"},addTags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"},removeTags:{amenity:"bank",brand:"第一商業銀行","brand:en":"First Commercial Bank","brand:wikidata":"Q11602128","brand:wikipedia":"zh:第一商業銀行",name:"第一商業銀行","name:en":"First Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/聯邦商業銀行":{name:"聯邦商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15927195"},addTags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"},removeTags:{amenity:"bank",brand:"聯邦商業銀行","brand:en":"Union Bank of Taiwan","brand:wikidata":"Q15927195","brand:wikipedia":"zh:聯邦商業銀行",name:"聯邦商業銀行","name:en":"Union Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/臺灣中小企業銀行":{name:"臺灣中小企業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15913812"},addTags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"},removeTags:{amenity:"bank",brand:"臺灣中小企業銀行","brand:en":"Taiwan Business Bank","brand:wikidata":"Q15913812","brand:wikipedia":"zh:臺灣中小企業銀行",name:"臺灣中小企業銀行","name:en":"Taiwan Business Bank"},matchScore:2,suggestion:true},"amenity/bank/臺灣土地銀行":{name:"臺灣土地銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q717592"},addTags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"},removeTags:{amenity:"bank",brand:"臺灣土地銀行","brand:en":"Land Bank of Taiwan","brand:wikidata":"Q717592","brand:wikipedia":"en:Land Bank of Taiwan",name:"臺灣土地銀行","name:en":"Land Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/臺灣新光商業銀行":{name:"臺灣新光商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15909616"},addTags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"},removeTags:{amenity:"bank",brand:"臺灣新光商業銀行","brand:en":"Shin Kong Commercial Bank","brand:wikidata":"Q15909616","brand:wikipedia":"zh:臺灣新光商業銀行",name:"臺灣新光商業銀行","name:en":"Shin Kong Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/臺灣銀行":{name:"臺灣銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q706533"},addTags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"},removeTags:{amenity:"bank",brand:"臺灣銀行","brand:en":"Bank of Taiwan","brand:wikidata":"Q706533","brand:wikipedia":"en:Bank of Taiwan",name:"臺灣銀行","name:en":"Bank of Taiwan"},matchScore:2,suggestion:true},"amenity/bank/華南商業銀行":{name:"華南商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11620043"},addTags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南商業銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"},removeTags:{amenity:"bank",brand:"華南商業銀行","brand:en":"Hua Nan Commercial Bank","brand:wikidata":"Q11620043","brand:wikipedia":"zh:華南商業銀行",name:"華南商業銀行","name:en":"Hua Nan Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/遠東國際商業銀行":{name:"遠東國際商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q15911143"},addTags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"},removeTags:{amenity:"bank",brand:"遠東國際商業銀行","brand:en":"Far Eastern International Bank","brand:wikidata":"Q15911143","brand:wikipedia":"zh:遠東國際商業銀行",name:"遠東國際商業銀行","name:en":"Far Eastern International Bank"},matchScore:2,suggestion:true},"amenity/bank/陽信商業銀行":{name:"陽信商業銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q11658759"},addTags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"},removeTags:{amenity:"bank",brand:"陽信商業銀行","brand:en":"Sunny Commercial Bank","brand:wikidata":"Q11658759","brand:wikipedia":"zh:陽信商業銀行",name:"陽信商業銀行","name:en":"Sunny Commercial Bank"},matchScore:2,suggestion:true},"amenity/bank/静岡銀行":{name:"静岡銀行",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q7499501"},addTags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"},removeTags:{amenity:"bank",brand:"静岡銀行","brand:en":"Shizuoka Bank","brand:wikidata":"Q7499501","brand:wikipedia":"en:Shizuoka Bank",name:"静岡銀行","name:en":"Shizuoka Bank"},matchScore:2,suggestion:true},"amenity/bank/국민은행":{name:"국민은행",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q496606"},addTags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Kookmin Bank",name:"국민은행","name:en":"KB Kookmin Bank"},removeTags:{amenity:"bank",brand:"국민은행","brand:en":"KB Kookmin Bank","brand:wikidata":"Q496606","brand:wikipedia":"en:KB Kookmin Bank",name:"국민은행","name:en":"KB Kookmin Bank"},matchScore:2,suggestion:true},"amenity/bank/기업은행":{name:"기업은행",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q483855"},addTags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea"},removeTags:{amenity:"bank",brand:"기업은행","brand:en":"Industrial Bank of Korea","brand:wikidata":"Q483855","brand:wikipedia":"en:Industrial Bank of Korea",name:"기업은행","name:en":"Industrial Bank of Korea"},matchScore:2,suggestion:true},"amenity/bank/신한은행":{name:"신한은행",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q487230"},addTags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank"},removeTags:{amenity:"bank",brand:"신한은행","brand:en":"Sinhan Bank","brand:wikidata":"Q487230","brand:wikipedia":"en:Shinhan Bank",name:"신한은행","name:en":"Sinhan Bank"},matchScore:2,suggestion:true},"amenity/bank/우리은행":{name:"우리은행",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q494369"},addTags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank"},removeTags:{amenity:"bank",brand:"우리은행","brand:en":"Woori Bank","brand:wikidata":"Q494369","brand:wikipedia":"en:Woori Bank",name:"우리은행","name:en":"Woori Bank"},matchScore:2,suggestion:true},"amenity/bank/하나은행":{name:"하나은행",icon:"maki-bank",fields:["name","atm","operator","address","building_area","opening_hours","drive_through"],geometry:["point","area"],tags:{amenity:"bank","brand:wikidata":"Q484047"},addTags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank"},removeTags:{amenity:"bank",brand:"하나은행","brand:en":"Korea Exchange Bank","brand:wikidata":"Q484047","brand:wikipedia":"en:Korea Exchange Bank",name:"하나은행","name:en":"Korea Exchange Bank"},matchScore:2,suggestion:true},"amenity/bicycle_rental/Call a Bike":{name:"Call a Bike",icon:"maki-bicycle",fields:["capacity","network","operator","payment_multi"],geometry:["point","vertex","area"],tags:{amenity:"bicycle_rental","brand:wikidata":"Q1060525"},addTags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"},removeTags:{amenity:"bicycle_rental",brand:"Call a Bike","brand:wikidata":"Q1060525","brand:wikipedia":"en:Call a Bike",name:"Call a Bike"},matchScore:2,suggestion:true},"amenity/bureau_de_change/Travelex":{name:"Travelex",icon:"maki-bank",fields:["name","currency_multi","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"bureau_de_change","brand:wikidata":"Q2337964"},addTags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"},removeTags:{amenity:"bureau_de_change",brand:"Travelex","brand:wikidata":"Q2337964","brand:wikipedia":"en:Travelex",name:"Travelex"},matchScore:2,suggestion:true},"amenity/cafe/85度C":{name:"85度C",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q4644852"},addTags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",name:"85度C","name:en":"85C Bakery Cafe"},removeTags:{amenity:"cafe",brand:"85度C","brand:en":"85C Bakery Cafe","brand:wikidata":"Q4644852","brand:wikipedia":"en:85C Bakery Cafe",name:"85度C","name:en":"85C Bakery Cafe"},matchScore:2,suggestion:true},"amenity/cafe/Barista":{name:"Barista",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q644735"},addTags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",name:"Barista"},removeTags:{amenity:"cafe",brand:"Barista","brand:wikidata":"Q644735","brand:wikipedia":"en:Barista (company)",name:"Barista"},matchScore:2,suggestion:true},"amenity/cafe/Cafe Coffee Day":{name:"Cafe Coffee Day",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5017235"},addTags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",name:"Cafe Coffee Day"},removeTags:{amenity:"cafe",brand:"Cafe Coffee Day","brand:wikidata":"Q5017235","brand:wikipedia":"en:Café Coffee Day",name:"Cafe Coffee Day"},matchScore:2,suggestion:true},"amenity/cafe/Caffè Nero":{name:"Caffè Nero",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q675808"},addTags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",name:"Caffè Nero"},removeTags:{amenity:"cafe",brand:"Caffè Nero","brand:wikidata":"Q675808","brand:wikipedia":"en:Caffè Nero",name:"Caffè Nero"},matchScore:2,suggestion:true},"amenity/cafe/Café Amazon":{name:"Café Amazon",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q43247503"},addTags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"Café Amazon"},removeTags:{amenity:"cafe",brand:"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"Café Amazon"},matchScore:2,suggestion:true},"amenity/cafe/Caribou Coffee":{name:"Caribou Coffee",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5039494"},addTags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",name:"Caribou Coffee"},removeTags:{amenity:"cafe",brand:"Caribou Coffee","brand:wikidata":"Q5039494","brand:wikipedia":"en:Caribou Coffee",name:"Caribou Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Chatime":{name:"Chatime",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q16829306"},addTags:{amenity:"cafe",brand:"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",name:"Chatime"},removeTags:{amenity:"cafe",brand:"Chatime","brand:wikidata":"Q16829306","brand:wikipedia":"en:Chatime",name:"Chatime"},matchScore:2,suggestion:true},"amenity/cafe/Coffee Fellows":{name:"Coffee Fellows",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q23461429"},addTags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",name:"Coffee Fellows"},removeTags:{amenity:"cafe",brand:"Coffee Fellows","brand:wikidata":"Q23461429","brand:wikipedia":"en:Coffee Fellows",name:"Coffee Fellows"},matchScore:2,suggestion:true},"amenity/cafe/Coffee House":{name:"Coffee House",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11855430"},addTags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",name:"Coffee House"},removeTags:{amenity:"cafe",brand:"Coffee House","brand:wikidata":"Q11855430","brand:wikipedia":"fi:Coffee House",name:"Coffee House"},matchScore:2,suggestion:true},"amenity/cafe/Coffee Time":{name:"Coffee Time",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5140932"},addTags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",name:"Coffee Time"},removeTags:{amenity:"cafe",brand:"Coffee Time","brand:wikidata":"Q5140932","brand:wikipedia":"en:Coffee Time",name:"Coffee Time"},matchScore:2,suggestion:true},"amenity/cafe/Costa":{name:"Costa",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q608845"},addTags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",name:"Costa"},removeTags:{amenity:"cafe",brand:"Costa","brand:wikidata":"Q608845","brand:wikipedia":"en:Costa Coffee",name:"Costa"},matchScore:2,suggestion:true},"amenity/cafe/Country Style":{name:"Country Style",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q5177435"},addTags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",name:"Country Style"},removeTags:{amenity:"cafe",brand:"Country Style","brand:wikidata":"Q5177435","brand:wikipedia":"en:Country Style",name:"Country Style"},matchScore:2,suggestion:true},"amenity/cafe/Espresso House":{name:"Espresso House",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q10489162"},addTags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",name:"Espresso House"},removeTags:{amenity:"cafe",brand:"Espresso House","brand:wikidata":"Q10489162","brand:wikipedia":"en:Espresso House",name:"Espresso House"},matchScore:2,suggestion:true},"amenity/cafe/Havanna":{name:"Havanna",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2900869"},addTags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",name:"Havanna"},removeTags:{amenity:"cafe",brand:"Havanna","brand:wikidata":"Q2900869","brand:wikipedia":"es:Havanna",name:"Havanna"},matchScore:2,suggestion:true},"amenity/cafe/Joe & The Juice":{name:"Joe & The Juice",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q26221514"},addTags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",name:"Joe & The Juice"},removeTags:{amenity:"cafe",brand:"Joe & The Juice","brand:wikidata":"Q26221514","brand:wikipedia":"en:Joe & The Juice",name:"Joe & The Juice"},matchScore:2,suggestion:true},"amenity/cafe/Le Pain Quotidien":{name:"Le Pain Quotidien",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2046903"},addTags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",name:"Le Pain Quotidien"},removeTags:{amenity:"cafe",brand:"Le Pain Quotidien","brand:wikidata":"Q2046903","brand:wikipedia":"en:Le Pain Quotidien",name:"Le Pain Quotidien"},matchScore:2,suggestion:true},"amenity/cafe/McCafé":{name:"McCafé",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q3114287"},addTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé"},removeTags:{amenity:"cafe",brand:"McCafé","brand:wikidata":"Q3114287","brand:wikipedia":"en:McCafé",cuisine:"coffee_shop",name:"McCafé"},matchScore:2,suggestion:true},"amenity/cafe/Patisserie Valerie":{name:"Patisserie Valerie",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q22101966"},addTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",name:"Patisserie Valerie"},removeTags:{amenity:"cafe",brand:"Patisserie Valerie","brand:wikidata":"Q22101966","brand:wikipedia":"en:Patisserie Valerie",name:"Patisserie Valerie"},matchScore:2,suggestion:true},"amenity/cafe/Peet's Coffee":{name:"Peet's Coffee",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q1094101"},addTags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee"},removeTags:{amenity:"cafe",brand:"Peet's Coffee","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Peet's Coffee & Tea":{name:"Peet's Coffee & Tea",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q1094101"},addTags:{amenity:"cafe",brand:"Peet's Coffee & Tea","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee & Tea"},removeTags:{amenity:"cafe",brand:"Peet's Coffee & Tea","brand:wikidata":"Q1094101","brand:wikipedia":"en:Peet's Coffee",name:"Peet's Coffee & Tea"},matchScore:2,suggestion:true},"amenity/cafe/Pret A Manger":{name:"Pret A Manger",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2109109"},addTags:{amenity:"cafe",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",name:"Pret A Manger"},removeTags:{amenity:"cafe",brand:"Pret A Manger","brand:wikidata":"Q2109109","brand:wikipedia":"en:Pret a Manger",name:"Pret A Manger"},matchScore:2,suggestion:true},"amenity/cafe/Second Cup":{name:"Second Cup",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q862180"},addTags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",name:"Second Cup"},removeTags:{amenity:"cafe",brand:"Second Cup","brand:wikidata":"Q862180","brand:wikipedia":"en:Second Cup",name:"Second Cup"},matchScore:2,suggestion:true},"amenity/cafe/Segafredo":{name:"Segafredo",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q21282762"},addTags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",name:"Segafredo"},removeTags:{amenity:"cafe",brand:"Segafredo","brand:wikidata":"Q21282762","brand:wikipedia":"it:Segafredo Zanetti",name:"Segafredo"},matchScore:2,suggestion:true},"amenity/cafe/Starbucks":{name:"Starbucks",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks"},removeTags:{amenity:"cafe",brand:"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",cuisine:"coffee_shop",name:"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/The Coffee Bean & Tea Leaf":{name:"The Coffee Bean & Tea Leaf",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q1141384"},addTags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",name:"The Coffee Bean & Tea Leaf"},removeTags:{amenity:"cafe",brand:"The Coffee Bean & Tea Leaf","brand:wikidata":"Q1141384","brand:wikipedia":"en:The Coffee Bean & Tea Leaf",name:"The Coffee Bean & Tea Leaf"},matchScore:2,suggestion:true},"amenity/cafe/The Coffee Club":{name:"The Coffee Club",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q7726599"},addTags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",name:"The Coffee Club"},removeTags:{amenity:"cafe",brand:"The Coffee Club","brand:wikidata":"Q7726599","brand:wikipedia":"en:The Coffee Club",name:"The Coffee Club"},matchScore:2,suggestion:true},"amenity/cafe/Tim Hortons":{name:"Tim Hortons",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q175106"},addTags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",name:"Tim Hortons"},removeTags:{amenity:"cafe",brand:"Tim Hortons","brand:wikidata":"Q175106","brand:wikipedia":"en:Tim Hortons",name:"Tim Hortons"},matchScore:2,suggestion:true},"amenity/cafe/Wayne's Coffee":{name:"Wayne's Coffee",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2637272"},addTags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",name:"Wayne's Coffee"},removeTags:{amenity:"cafe",brand:"Wayne's Coffee","brand:wikidata":"Q2637272","brand:wikipedia":"en:Wayne's Coffee",name:"Wayne's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/Старбакс":{name:"Старбакс",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",name:"Старбакс","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"Старбакс","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"en:Starbucks",name:"Старбакс","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/Шоколадница":{name:"Шоколадница",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q30891188"},addTags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",name:"Шоколадница","name:en":"Chocolate"},removeTags:{amenity:"cafe",brand:"Шоколадница","brand:en":"Chocolate","brand:wikidata":"Q30891188","brand:wikipedia":"ru:Шоколадница (сеть кофеен)",name:"Шоколадница","name:en":"Chocolate"},matchScore:2,suggestion:true},"amenity/cafe/ארומה":{name:"ארומה",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q2909872"},addTags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",name:"ארומה","name:en":"Aroma Espresso Bar"},removeTags:{amenity:"cafe",brand:"ארומה","brand:en":"Aroma Espresso Bar","brand:wikidata":"Q2909872","brand:wikipedia":"en:Aroma Espresso Bar",name:"ארומה","name:en":"Aroma Espresso Bar"},matchScore:2,suggestion:true},"amenity/cafe/คาเฟ่ อเมซอน":{name:"คาเฟ่ อเมซอน",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q43247503"},addTags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon"},removeTags:{amenity:"cafe",brand:"คาเฟ่ อเมซอน","brand:en":"Café Amazon","brand:wikidata":"Q43247503","brand:wikipedia":"en:Café Amazon",name:"คาเฟ่ อเมซอน","name:en":"Café Amazon"},matchScore:2,suggestion:true},"amenity/cafe/エクセルシオール カフェ":{name:"エクセルシオール カフェ",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11289828"},addTags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ"},removeTags:{amenity:"cafe",brand:"エクセルシオール カフェ","brand:en":"EXCELSIOR CAFFÉ","brand:wikidata":"Q11289828","brand:wikipedia":"ja:エクセルシオール カフェ",cuisine:"coffee_shop",name:"エクセルシオール カフェ"},matchScore:2,suggestion:true},"amenity/cafe/カフェ・ド・クリエ":{name:"カフェ・ド・クリエ",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q17219077"},addTags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE"},removeTags:{amenity:"cafe",brand:"カフェ・ド・クリエ","brand:en":"Cafe de CRIE","brand:wikidata":"Q17219077","brand:wikipedia":"ja:ポッカクリエイト",name:"カフェ・ド・クリエ","name:en":"Cafe de CRIE"},matchScore:2,suggestion:true},"amenity/cafe/カフェ・ベローチェ":{name:"カフェ・ベローチェ",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11294597"},addTags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE"},removeTags:{amenity:"cafe",brand:"カフェ・ベローチェ","brand:en":"CAFFÈ VELOCE","brand:wikidata":"Q11294597","brand:wikipedia":"ja:カフェ・ベローチェ",cuisine:"coffee_shop",name:"カフェ・ベローチェ","name:en":"CAFFÈ VELOCE"},matchScore:2,suggestion:true},"amenity/cafe/コメダ珈琲店":{name:"コメダ珈琲店",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11302679"},addTags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop"},removeTags:{amenity:"cafe",brand:"コメダ珈琲店","brand:en":"Komeda Coffee Shop","brand:wikidata":"Q11302679","brand:wikipedia":"ja:コメダ",cuisine:"coffee_shop",name:"コメダ珈琲店","name:en":"Komeda Coffee Shop"},matchScore:2,suggestion:true},"amenity/cafe/サンマルクカフェ":{name:"サンマルクカフェ",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11305989"},addTags:{amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ"},removeTags:{amenity:"cafe",brand:"サンマルクカフェ","brand:en":"ST.MARC CAFÉ","brand:wikidata":"Q11305989","brand:wikipedia":"ja:サンマルクホールディングス",cuisine:"coffee_shop",name:"サンマルクカフェ","name:en":"ST.MARC CAFÉ"},matchScore:2,suggestion:true},"amenity/cafe/スターバックス":{name:"スターバックス",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"スターバックス","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ja:スターバックス",cuisine:"coffee_shop",name:"スターバックス","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/タリーズコーヒー":{name:"タリーズコーヒー",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q3541983"},addTags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",name:"タリーズコーヒー","name:en":"Tully's Coffee"},removeTags:{amenity:"cafe",brand:"タリーズコーヒー","brand:en":"Tully's Coffee","brand:wikidata":"Q3541983","brand:wikipedia":"en:Tully's Coffee",name:"タリーズコーヒー","name:en":"Tully's Coffee"},matchScore:2,suggestion:true},"amenity/cafe/ドトールコーヒーショップ":{name:"ドトールコーヒーショップ",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q11322732"},addTags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop"},removeTags:{amenity:"cafe",brand:"ドトールコーヒーショップ","brand:en":"Doutor","brand:wikidata":"Q11322732","brand:wikipedia":"ja:ドトールコーヒーショップ",cuisine:"coffee_shop",name:"ドトールコーヒーショップ","name:en":"Doutor Coffee Shop"},matchScore:2,suggestion:true},"amenity/cafe/星巴克":{name:"星巴克",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"星巴克","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"zh:星巴克",cuisine:"coffee_shop",name:"星巴克","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/cafe/스타벅스":{name:"스타벅스",icon:"maki-cafe",fields:["name","cuisine","address","building_area","opening_hours","internet_access","internet_access/fee","internet_access/ssid","smoking","outdoor_seating","takeaway"],geometry:["point","area"],tags:{amenity:"cafe","brand:wikidata":"Q37158"},addTags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks"},removeTags:{amenity:"cafe",brand:"스타벅스","brand:en":"Starbucks","brand:wikidata":"Q37158","brand:wikipedia":"ko:스타벅스",cuisine:"coffee_shop",name:"스타벅스","name:en":"Starbucks"},matchScore:2,suggestion:true},"amenity/car_rental/Alamo":{name:"Alamo",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1429287"},addTags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"},removeTags:{amenity:"car_rental",brand:"Alamo","brand:wikidata":"Q1429287","brand:wikipedia":"en:Alamo Rent a Car",name:"Alamo"},matchScore:2,suggestion:true},"amenity/car_rental/Avis":{name:"Avis",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q791136"},addTags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Rent a Car",name:"Avis"},removeTags:{amenity:"car_rental",brand:"Avis","brand:wikidata":"Q791136","brand:wikipedia":"en:Avis Rent a Car",name:"Avis"},matchScore:2,suggestion:true},"amenity/car_rental/Budget":{name:"Budget",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1001437"},addTags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget"},removeTags:{amenity:"car_rental",brand:"Budget","brand:wikidata":"Q1001437","brand:wikipedia":"en:Budget Rent a Car",name:"Budget"},matchScore:2,suggestion:true},"amenity/car_rental/Dollar":{name:"Dollar",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1235661"},addTags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar"},removeTags:{amenity:"car_rental",brand:"Dollar","brand:wikidata":"Q1235661","brand:wikipedia":"en:Dollar Rent A Car",name:"Dollar"},matchScore:2,suggestion:true},"amenity/car_rental/Enterprise":{name:"Enterprise",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q17085454"},addTags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise"},removeTags:{amenity:"car_rental",brand:"Enterprise","brand:wikidata":"Q17085454","brand:wikipedia":"en:Enterprise Rent-A-Car",name:"Enterprise"},matchScore:2,suggestion:true},"amenity/car_rental/Europcar":{name:"Europcar",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1376256"},addTags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"},removeTags:{amenity:"car_rental",brand:"Europcar","brand:wikidata":"Q1376256","brand:wikipedia":"en:Europcar",name:"Europcar"},matchScore:2,suggestion:true},"amenity/car_rental/Hertz":{name:"Hertz",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q1543874"},addTags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"},removeTags:{amenity:"car_rental",brand:"Hertz","brand:wikidata":"Q1543874","brand:wikipedia":"en:The Hertz Corporation",name:"Hertz"},matchScore:2,suggestion:true},"amenity/car_rental/Localiza":{name:"Localiza",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q10319490"},addTags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"},removeTags:{amenity:"car_rental",brand:"Localiza","brand:wikidata":"Q10319490","brand:wikipedia":"en:Localiza",name:"Localiza"},matchScore:2,suggestion:true},"amenity/car_rental/Sixt":{name:"Sixt",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q705664"},addTags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"},removeTags:{amenity:"car_rental",brand:"Sixt","brand:wikidata":"Q705664","brand:wikipedia":"en:Sixt",name:"Sixt"},matchScore:2,suggestion:true},"amenity/car_rental/Thrifty":{name:"Thrifty",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q2429546"},addTags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"},removeTags:{amenity:"car_rental",brand:"Thrifty","brand:wikidata":"Q2429546","brand:wikipedia":"en:Thrifty Car Rental",name:"Thrifty"},matchScore:2,suggestion:true},"amenity/car_rental/U-Haul":{name:"U-Haul",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q7862902"},addTags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"},removeTags:{amenity:"car_rental",brand:"U-Haul","brand:wikidata":"Q7862902","brand:wikipedia":"en:U-Haul",name:"U-Haul"},matchScore:2,suggestion:true},"amenity/car_rental/オリックスレンタカー":{name:"オリックスレンタカー",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11123021"},addTags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental"},removeTags:{amenity:"car_rental",brand:"オリックスレンタカー","brand:en":"ORIX Car Rental","brand:wikidata":"Q11123021","brand:wikipedia":"ja:オリックスレンタカー",name:"オリックスレンタカー","name:en":"ORIX Car Rental"},matchScore:2,suggestion:true},"amenity/car_rental/トヨタレンタカー":{name:"トヨタレンタカー",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11321580"},addTags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car"},removeTags:{amenity:"car_rental",brand:"トヨタレンタカー","brand:en":"Toyota Rental Car","brand:wikidata":"Q11321580","brand:wikipedia":"ja:トヨタレンタリース",name:"トヨタレンタカー","name:en":"Toyota Rental Car"},matchScore:2,suggestion:true},"amenity/car_rental/ニッポンレンタカー":{name:"ニッポンレンタカー",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11086533"},addTags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental"},removeTags:{amenity:"car_rental",brand:"ニッポンレンタカー","brand:en":"Nippon Car Rental","brand:wikidata":"Q11086533","brand:wikipedia":"ja:ニッポンレンタカー",name:"ニッポンレンタカー","name:en":"Nippon Car Rental"},matchScore:2,suggestion:true},"amenity/car_rental/日産レンタカー":{name:"日産レンタカー",icon:"maki-car-rental",fields:["name","operator","payment_multi"],geometry:["point","area"],tags:{amenity:"car_rental","brand:wikidata":"Q11086838"},addTags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental"},removeTags:{amenity:"car_rental",brand:"日産レンタカー","brand:en":"Nissan Car Rental","brand:wikidata":"Q11086838","brand:wikipedia":"ja:日産レンタカー",name:"日産レンタカー","name:en":"Nissan Car Rental"},matchScore:2,suggestion:true},"amenity/charging_station/ChargePoint":{name:"ChargePoint",icon:"fas-charging-station",fields:["operator","capacity"],geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q5176149"},addTags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"},removeTags:{amenity:"charging_station",brand:"ChargePoint","brand:wikidata":"Q5176149","brand:wikipedia":"en:ChargePoint",name:"ChargePoint"},matchScore:2,suggestion:true},"amenity/charging_station/Enel - stazione di ricarica":{name:"Enel - stazione di ricarica",icon:"fas-charging-station",fields:["operator","capacity"],geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q651222"},addTags:{amenity:"charging_station",brand:"Enel - stazione di ricarica","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel - stazione di ricarica"},removeTags:{amenity:"charging_station",brand:"Enel - stazione di ricarica","brand:wikidata":"Q651222","brand:wikipedia":"en:Enel",name:"Enel - stazione di ricarica"},matchScore:2,suggestion:true},"amenity/charging_station/Tesla Supercharger":{name:"Tesla Supercharger",icon:"fas-charging-station",fields:["operator","capacity"],geometry:["point"],tags:{amenity:"charging_station","brand:wikidata":"Q17089620"},addTags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"},removeTags:{amenity:"charging_station",brand:"Tesla Supercharger","brand:wikidata":"Q17089620","brand:wikipedia":"en:Tesla Supercharger",name:"Tesla Supercharger"},matchScore:2,suggestion:true},"amenity/cinema/Cinema City":{name:"Cinema City",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q543651"},addTags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"},removeTags:{amenity:"cinema",brand:"Cinema City","brand:wikidata":"Q543651","brand:wikipedia":"en:Cinema City International",name:"Cinema City"},matchScore:2,suggestion:true},"amenity/cinema/Cinemark":{name:"Cinemark",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q707530"},addTags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"},removeTags:{amenity:"cinema",brand:"Cinemark","brand:wikidata":"Q707530","brand:wikipedia":"en:Cinemark Theatres",name:"Cinemark"},matchScore:2,suggestion:true},"amenity/cinema/Cinemex":{name:"Cinemex",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q3333072"},addTags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"},removeTags:{amenity:"cinema",brand:"Cinemex","brand:wikidata":"Q3333072","brand:wikipedia":"en:Cinemex",name:"Cinemex"},matchScore:2,suggestion:true},"amenity/cinema/Cinepolis":{name:"Cinepolis",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q5686673"},addTags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"},removeTags:{amenity:"cinema",brand:"Cinepolis","brand:wikidata":"Q5686673","brand:wikipedia":"en:Cinépolis",name:"Cinepolis"},matchScore:2,suggestion:true},"amenity/cinema/Cineworld":{name:"Cineworld",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q5120901"},addTags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"},removeTags:{amenity:"cinema",brand:"Cineworld","brand:wikidata":"Q5120901","brand:wikipedia":"en:Cineworld",name:"Cineworld"},matchScore:2,suggestion:true},"amenity/cinema/Odeon":{name:"Odeon",icon:"maki-cinema",fields:["name","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"cinema","brand:wikidata":"Q6127470"},addTags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"},removeTags:{amenity:"cinema",brand:"Odeon","brand:wikidata":"Q6127470","brand:wikipedia":"en:Odeon Cinemas",name:"Odeon"},matchScore:2,suggestion:true},"amenity/fast_food/A&W (Canada)":{name:"A&W (Canada)",icon:"maki-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","brand:wikidata":"Q2818848"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W"},removeTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q2818848","brand:wikipedia":"en:A&W (Canada)",cuisine:"burger",name:"A&W"},matchScore:2,suggestion:true},"amenity/fast_food/A&W (USA)":{name:"A&W (USA)",icon:"maki-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","brand:wikidata":"Q277641"},addTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W"},removeTags:{amenity:"fast_food",brand:"A&W","brand:wikidata":"Q277641","brand:wikipedia":"en:A&W Restaurants",cuisine:"burger",name:"A&W"},matchScore:2,suggestion:true},"amenity/fast_food/Arby's":{name:"Arby's",icon:"maki-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","brand:wikidata":"Q630866"},addTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",name:"Arby's"},removeTags:{amenity:"fast_food",brand:"Arby's","brand:wikidata":"Q630866","brand:wikipedia":"en:Arby's",name:"Arby's"},matchScore:2,suggestion:true},"amenity/fast_food/Bob's":{name:"Bob's",icon:"maki-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","brand:wikidata":"Q1392113"},addTags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's"},removeTags:{amenity:"fast_food",brand:"Bob's","brand:wikidata":"Q1392113","brand:wikipedia":"en:Bob's",cuisine:"burger",name:"Bob's"},matchScore:2,suggestion:true},"amenity/fast_food/Bojangles'":{name:"Bojangles'",icon:"maki-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","brand:wikidata":"Q891163"},addTags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'"},removeTags:{amenity:"fast_food",brand:"Bojangles'","brand:wikidata":"Q891163","brand:wikipedia":"en:Bojangles' Famous Chicken 'n Biscuits",cuisine:"chicken",name:"Bojangles'"},matchScore:2,suggestion:true},"amenity/fast_food/Booster Juice":{name:"Booster Juice",icon:"maki-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","brand:wikidata":"Q4943796"},addTags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",name:"Booster Juice"},removeTags:{amenity:"fast_food",brand:"Booster Juice","brand:wikidata":"Q4943796","brand:wikipedia":"en:Booster Juice",name:"Booster Juice"},matchScore:2,suggestion:true},"amenity/fast_food/Boston Market":{name:"Boston Market",icon:"maki-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","brand:wikidata":"Q603617"},addTags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",name:"Boston Market"},removeTags:{amenity:"fast_food",brand:"Boston Market","brand:wikidata":"Q603617","brand:wikipedia":"en:Boston Market",name:"Boston Market"},matchScore:2,suggestion:true},"amenity/fast_food/Burger King":{name:"Burger King",icon:"maki-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","brand:wikidata":"Q177054"},addTags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King"},removeTags:{amenity:"fast_food",brand:"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Burger King"},matchScore:2,suggestion:true},"amenity/fast_food/Burger Machine":{name:"Burger Machine",icon:"maki-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","brand:wikidata":"Q4998549"},addTags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine"},removeTags:{amenity:"fast_food",brand:"Burger Machine","brand:wikidata":"Q4998549","brand:wikipedia":"en:Burger Machine",cuisine:"burger",name:"Burger Machine"},matchScore:2,suggestion:true},"amenity/fast_food/BurgerFi":{name:"BurgerFi",icon:"maki-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","brand:wikidata":"Q39045496"},addTags:{amenity:"fast_food",brand:"BurgerFi",cuisine:"burger","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",name:"BurgerFi"},removeTags:{amenity:"fast_food",brand:"BurgerFi",cuisine:"burger","brand:wikidata":"Q39045496","brand:wikipedia":"en:BurgerFi",name:"BurgerFi"},matchScore:2,suggestion:true},"amenity/fast_food/Captain D's":{name:"Captain D's",icon:"maki-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","brand:wikidata":"Q5036616"},addTags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's"},removeTags:{amenity:"fast_food",brand:"Captain D's","brand:wikidata":"Q5036616","brand:wikipedia":"en:Captain D's",cuisine:"seafood",name:"Captain D's"},matchScore:2,suggestion:true},"amenity/fast_food/Carl's Jr.":{name:"Carl's Jr.",icon:"maki-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","brand:wikidata":"Q1043486"},addTags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr."},removeTags:{amenity:"fast_food",brand:"Carl's Jr.","brand:wikidata":"Q1043486","brand:wikipedia":"en:Carl's Jr.",cuisine:"burger",name:"Carl's Jr."},matchScore:2,suggestion:true},"amenity/fast_food/Checkers":{name:"Checkers",icon:"maki-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","brand:wikidata":"Q3419341"},addTags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Checkers"},removeTags:{amenity:"fast_food",brand:"Checkers","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Checkers"},matchScore:2,suggestion:true},"amenity/fast_food/Chick-fil-A":{name:"Chick-fil-A",icon:"maki-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","brand:wikidata":"Q491516"},addTags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A"},removeTags:{amenity:"fast_food",brand:"Chick-fil-A","brand:wikidata":"Q491516","brand:wikipedia":"en:Chick-fil-A",cuisine:"chicken",name:"Chick-fil-A"},matchScore:2,suggestion:true},"amenity/fast_food/Chicken Express":{name:"Chicken Express",icon:"maki-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","brand:wikidata":"Q5096235"},addTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",name:"Chicken Express"},removeTags:{amenity:"fast_food",brand:"Chicken Express","brand:wikidata":"Q5096235","brand:wikipedia":"en:Chicken Express",name:"Chicken Express"},matchScore:2,suggestion:true},"amenity/fast_food/Chipotle":{name:"Chipotle",icon:"maki-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","brand:wikidata":"Q465751"},addTags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle"},removeTags:{amenity:"fast_food",brand:"Chipotle","brand:wikidata":"Q465751","brand:wikipedia":"en:Chipotle Mexican Grill",cuisine:"mexican",name:"Chipotle"},matchScore:2,suggestion:true},"amenity/fast_food/Chowking":{name:"Chowking",icon:"maki-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","brand:wikidata":"Q1076816"},addTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",name:"Chowking"},removeTags:{amenity:"fast_food",brand:"Chowking","brand:wikidata":"Q1076816","brand:wikipedia":"en:Chowking",name:"Chowking"},matchScore:2,suggestion:true},"amenity/fast_food/Church's Chicken":{name:"Church's Chicken",icon:"maki-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","brand:wikidata":"Q1089932"},addTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",name:"Church's Chicken"},removeTags:{amenity:"fast_food",brand:"Church's Chicken","brand:wikidata":"Q1089932","brand:wikipedia":"en:Church's Chicken",name:"Church's Chicken"},matchScore:2,suggestion:true},"amenity/fast_food/CoCo壱番屋":{name:"CoCo壱番屋",icon:"maki-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","brand:wikidata":"Q5986105"},addTags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya"},removeTags:{amenity:"fast_food",brand:"CoCo壱番屋","brand:en":"Ichibanya","brand:wikidata":"Q5986105","brand:wikipedia":"en:Ichibanya",cuisine:"japanese",name:"CoCo壱番屋","name:en":"Ichibanya"},matchScore:2,suggestion:true},"amenity/fast_food/Cook Out":{name:"Cook Out",icon:"maki-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","brand:wikidata":"Q5166992"},addTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",name:"Cook Out"},removeTags:{amenity:"fast_food",brand:"Cook Out","brand:wikidata":"Q5166992","brand:wikipedia":"en:Cook Out (restaurant)",name:"Cook Out"},matchScore:2,suggestion:true},"amenity/fast_food/Culver's":{name:"Culver's",icon:"maki-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","brand:wikidata":"Q1143589"},addTags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",name:"Culver's"},removeTags:{amenity:"fast_food",brand:"Culver's","brand:wikidata":"Q1143589","brand:wikipedia":"en:Culver's",name:"Culver's"},matchScore:2,suggestion:true},"amenity/fast_food/Dairy Queen":{name:"Dairy Queen",icon:"maki-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","brand:wikidata":"Q1141226"},addTags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream",name:"Dairy Queen"},removeTags:{amenity:"fast_food",brand:"Dairy Queen","brand:wikidata":"Q1141226","brand:wikipedia":"en:Dairy Queen",cuisine:"ice_cream",name:"Dairy Queen"},matchScore:2,suggestion:true},"amenity/fast_food/Daylight Donuts":{name:"Daylight Donuts",icon:"maki-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","brand:wikidata":"Q48970508"},addTags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts"},removeTags:{amenity:"fast_food",brand:"Daylight Donuts","brand:wikidata":"Q48970508","brand:wikipedia":"en:Daylight Donuts",cuisine:"donut",name:"Daylight Donuts"},matchScore:2,suggestion:true},"amenity/fast_food/Del Taco":{name:"Del Taco",icon:"maki-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","brand:wikidata":"Q1183818"},addTags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco"},removeTags:{amenity:"fast_food",brand:"Del Taco","brand:wikidata":"Q1183818","brand:wikipedia":"en:Del Taco",cuisine:"mexican",name:"Del Taco"},matchScore:2,suggestion:true},"amenity/fast_food/Domino's Pizza":{name:"Domino's Pizza",icon:"maki-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","brand:wikidata":"Q839466"},addTags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza"},removeTags:{amenity:"fast_food",brand:"Domino's Pizza","brand:wikidata":"Q839466","brand:wikipedia":"en:Domino's Pizza",cuisine:"pizza",name:"Domino's Pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Dunkin' Donuts":{name:"Dunkin' Donuts",icon:"maki-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","brand:wikidata":"Q847743"},addTags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut",name:"Dunkin' Donuts"},removeTags:{amenity:"fast_food",brand:"Dunkin' Donuts","brand:wikidata":"Q847743","brand:wikipedia":"en:Dunkin' Donuts",cuisine:"donut",name:"Dunkin' Donuts"},matchScore:2,suggestion:true},"amenity/fast_food/Einstein Bros. Bagels":{name:"Einstein Bros. Bagels",icon:"maki-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","brand:wikidata":"Q5349788"},addTags:{amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels"},removeTags:{amenity:"fast_food",brand:"Einstein Bros. Bagels","brand:wikidata":"Q5349788","brand:wikipedia":"en:Einstein Bros. Bagels",cuisine:"bagel",name:"Einstein Bros. Bagels"},matchScore:2,suggestion:true},"amenity/fast_food/El Pollo Loco":{name:"El Pollo Loco",icon:"maki-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","brand:wikidata":"Q2353849"},addTags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco"},removeTags:{amenity:"fast_food",brand:"El Pollo Loco","brand:wikidata":"Q2353849","brand:wikipedia":"en:El Pollo Loco",cuisine:"mexican",name:"El Pollo Loco"},matchScore:2,suggestion:true},"amenity/fast_food/Extreme Pita":{name:"Extreme Pita",icon:"maki-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","brand:wikidata":"Q5422367"},addTags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita"},removeTags:{amenity:"fast_food",brand:"Extreme Pita","brand:wikidata":"Q5422367","brand:wikipedia":"en:Extreme Pita",cuisine:"pita",name:"Extreme Pita"},matchScore:2,suggestion:true},"amenity/fast_food/Fazoli's":{name:"Fazoli's",icon:"maki-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","brand:wikidata":"Q1399195"},addTags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's"},removeTags:{amenity:"fast_food",brand:"Fazoli's","brand:wikidata":"Q1399195","brand:wikipedia":"en:Fazoli's",cuisine:"italian",name:"Fazoli's"},matchScore:2,suggestion:true},"amenity/fast_food/Firehouse Subs":{name:"Firehouse Subs",icon:"maki-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","brand:wikidata":"Q5451873"},addTags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs"},removeTags:{amenity:"fast_food",brand:"Firehouse Subs","brand:wikidata":"Q5451873","brand:wikipedia":"en:Firehouse Subs",cuisine:"sandwich",name:"Firehouse Subs"},matchScore:2,suggestion:true},"amenity/fast_food/Five Guys":{name:"Five Guys",icon:"maki-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","brand:wikidata":"Q1131810"},addTags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys"},removeTags:{amenity:"fast_food",brand:"Five Guys","brand:wikidata":"Q1131810","brand:wikipedia":"en:Five Guys",cuisine:"burger",name:"Five Guys"},matchScore:2,suggestion:true},"amenity/fast_food/Habib's":{name:"Habib's",icon:"maki-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","brand:wikidata":"Q2504930"},addTags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's"},removeTags:{amenity:"fast_food",brand:"Habib's","brand:wikidata":"Q2504930","brand:wikipedia":"en:Habib's",cuisine:"middle_eastern",name:"Habib's"},matchScore:2,suggestion:true},"amenity/fast_food/Hallo Pizza":{name:"Hallo Pizza",icon:"maki-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","brand:wikidata":"Q1571798"},addTags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza"},removeTags:{amenity:"fast_food",brand:"Hallo Pizza","brand:wikidata":"Q1571798","brand:wikipedia":"de:Hallo Pizza",cuisine:"pizza",name:"Hallo Pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Hardee's":{name:"Hardee's",icon:"maki-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","brand:wikidata":"Q1585088"},addTags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's"},removeTags:{amenity:"fast_food",brand:"Hardee's","brand:wikidata":"Q1585088","brand:wikipedia":"en:Hardee's",cuisine:"burger",name:"Hardee's"},matchScore:2,suggestion:true},"amenity/fast_food/Harvey's":{name:"Harvey's",icon:"maki-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","brand:wikidata":"Q1466184"},addTags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's"},removeTags:{amenity:"fast_food",brand:"Harvey's","brand:wikidata":"Q1466184","brand:wikipedia":"en:Harvey's",cuisine:"burger",name:"Harvey's"},matchScore:2,suggestion:true},"amenity/fast_food/Hesburger":{name:"Hesburger",icon:"maki-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","brand:wikidata":"Q1276832"},addTags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger"},removeTags:{amenity:"fast_food",brand:"Hesburger","brand:wikidata":"Q1276832","brand:wikipedia":"en:Hesburger",cuisine:"burger",name:"Hesburger"},matchScore:2,suggestion:true},"amenity/fast_food/Hungry Jacks":{name:"Hungry Jacks",icon:"maki-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","brand:wikidata":"Q3036373"},addTags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks"},removeTags:{amenity:"fast_food",brand:"Hungry Jacks","brand:wikidata":"Q3036373","brand:wikipedia":"en:Hungry Jack's",cuisine:"burger",name:"Hungry Jacks"},matchScore:2,suggestion:true},"amenity/fast_food/In-N-Out Burger":{name:"In-N-Out Burger",icon:"maki-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","brand:wikidata":"Q1205312"},addTags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger"},removeTags:{amenity:"fast_food",brand:"In-N-Out Burger","brand:wikidata":"Q1205312","brand:wikipedia":"en:In-N-Out Burger",cuisine:"burger",name:"In-N-Out Burger"},matchScore:2,suggestion:true},"amenity/fast_food/Jack in the Box":{name:"Jack in the Box",icon:"maki-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","brand:wikidata":"Q1538507"},addTags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box"},removeTags:{amenity:"fast_food",brand:"Jack in the Box","brand:wikidata":"Q1538507","brand:wikipedia":"en:Jack in the Box",cuisine:"burger",name:"Jack in the Box"},matchScore:2,suggestion:true},"amenity/fast_food/Jamba Juice":{name:"Jamba Juice",icon:"maki-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","brand:wikidata":"Q3088784"},addTags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice"},removeTags:{amenity:"fast_food",brand:"Jamba Juice","brand:wikidata":"Q3088784","brand:wikipedia":"en:Jamba Juice",cuisine:"juice",name:"Jamba Juice"},matchScore:2,suggestion:true},"amenity/fast_food/Jersey Mike's Subs":{name:"Jersey Mike's Subs",icon:"maki-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","brand:wikidata":"Q6184897"},addTags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs"},removeTags:{amenity:"fast_food",brand:"Jersey Mike's Subs","brand:wikidata":"Q6184897","brand:wikipedia":"en:Jersey Mike's Subs",cuisine:"sandwich",name:"Jersey Mike's Subs"},matchScore:2,suggestion:true},"amenity/fast_food/Jimmy John's":{name:"Jimmy John's",icon:"maki-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","brand:wikidata":"Q1689380"},addTags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's"},removeTags:{amenity:"fast_food",brand:"Jimmy John's","brand:wikidata":"Q1689380","brand:wikipedia":"en:Jimmy John's",cuisine:"sandwich",name:"Jimmy John's"},matchScore:2,suggestion:true},"amenity/fast_food/Jollibee":{name:"Jollibee",icon:"maki-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","brand:wikidata":"Q37614"},addTags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee"},removeTags:{amenity:"fast_food",brand:"Jollibee","brand:wikidata":"Q37614","brand:wikipedia":"en:Jollibee",cuisine:"burger",name:"Jollibee"},matchScore:2,suggestion:true},"amenity/fast_food/KFC":{name:"KFC",icon:"maki-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","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC"},removeTags:{amenity:"fast_food",brand:"KFC","brand:wikidata":"Q524757","brand:wikipedia":"en:KFC",cuisine:"chicken",name:"KFC"},matchScore:2,suggestion:true},"amenity/fast_food/Kochlöffel":{name:"Kochlöffel",icon:"maki-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","brand:wikidata":"Q315539"},addTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",name:"Kochlöffel"},removeTags:{amenity:"fast_food",brand:"Kochlöffel","brand:wikidata":"Q315539","brand:wikipedia":"en:Kochlöffel",name:"Kochlöffel"},matchScore:2,suggestion:true},"amenity/fast_food/Kotipizza":{name:"Kotipizza",icon:"maki-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","brand:wikidata":"Q1628625"},addTags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza"},removeTags:{amenity:"fast_food",brand:"Kotipizza","brand:wikidata":"Q1628625","brand:wikipedia":"en:Kotipizza",cuisine:"pizza",name:"Kotipizza"},matchScore:2,suggestion:true},"amenity/fast_food/Krispy Kreme":{name:"Krispy Kreme",icon:"maki-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","brand:wikidata":"Q1192805"},addTags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme"},removeTags:{amenity:"fast_food",brand:"Krispy Kreme","brand:wikidata":"Q1192805","brand:wikipedia":"en:Krispy Kreme",cuisine:"donut",name:"Krispy Kreme"},matchScore:2,suggestion:true},"amenity/fast_food/Little Caesars":{name:"Little Caesars",icon:"maki-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","brand:wikidata":"Q1393809"},addTags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars"},removeTags:{amenity:"fast_food",brand:"Little Caesars","brand:wikidata":"Q1393809","brand:wikipedia":"en:Little Caesars",cuisine:"pizza",name:"Little Caesars"},matchScore:2,suggestion:true},"amenity/fast_food/Long John Silver's":{name:"Long John Silver's",icon:"maki-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","brand:wikidata":"Q1535221"},addTags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's"},removeTags:{amenity:"fast_food",brand:"Long John Silver's","brand:wikidata":"Q1535221","brand:wikipedia":"en:Long John Silver's",cuisine:"seafood",name:"Long John Silver's"},matchScore:2,suggestion:true},"amenity/fast_food/Lotteria":{name:"Lotteria",icon:"maki-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","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria"},removeTags:{amenity:"fast_food",brand:"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"en:Lotteria",cuisine:"burger",name:"Lotteria"},matchScore:2,suggestion:true},"amenity/fast_food/Mang Inasal":{name:"Mang Inasal",icon:"maki-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","brand:wikidata":"Q6748573"},addTags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal"},removeTags:{amenity:"fast_food",brand:"Mang Inasal","brand:wikidata":"Q6748573","brand:wikipedia":"en:Mang Inasal",cuisine:"barbecue",name:"Mang Inasal"},matchScore:2,suggestion:true},"amenity/fast_food/McDonald's":{name:"McDonald's",icon:"maki-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","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's"},removeTags:{amenity:"fast_food",brand:"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/Moe's Southwest Grill":{name:"Moe's Southwest Grill",icon:"maki-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","brand:wikidata":"Q6889938"},addTags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill"},removeTags:{amenity:"fast_food",brand:"Moe's Southwest Grill","brand:wikidata":"Q6889938","brand:wikipedia":"en:Moe's Southwest Grill",cuisine:"mexican",name:"Moe's Southwest Grill"},matchScore:2,suggestion:true},"amenity/fast_food/Mr. Sub":{name:"Mr. Sub",icon:"maki-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","brand:wikidata":"Q6929225"},addTags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub"},removeTags:{amenity:"fast_food",brand:"Mr. Sub","brand:wikidata":"Q6929225","brand:wikipedia":"en:Mr. Sub",cuisine:"sandwich",name:"Mr. Sub"},matchScore:2,suggestion:true},"amenity/fast_food/Nordsee":{name:"Nordsee",icon:"maki-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","brand:wikidata":"Q74866"},addTags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee"},removeTags:{amenity:"fast_food",brand:"Nordsee","brand:wikidata":"Q74866","brand:wikipedia":"en:Nordsee",cuisine:"seafood",name:"Nordsee"},matchScore:2,suggestion:true},"amenity/fast_food/O'Tacos":{name:"O'Tacos",icon:"maki-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","brand:wikidata":"Q28494040"},addTags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos"},removeTags:{amenity:"fast_food",brand:"O'Tacos","brand:wikidata":"Q28494040","brand:wikipedia":"en:O'Tacos",cuisine:"mexican",name:"O'Tacos"},matchScore:2,suggestion:true},"amenity/fast_food/Panago":{name:"Panago",icon:"maki-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","brand:wikidata":"Q17111672"},addTags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago"},removeTags:{amenity:"fast_food",brand:"Panago","brand:wikidata":"Q17111672","brand:wikipedia":"en:Panago",cuisine:"pizza",name:"Panago"},matchScore:2,suggestion:true},"amenity/fast_food/Panda Express":{name:"Panda Express",icon:"maki-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","brand:wikidata":"Q1358690"},addTags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express"},removeTags:{amenity:"fast_food",brand:"Panda Express","brand:wikidata":"Q1358690","brand:wikipedia":"en:Panda Express",cuisine:"chinese",name:"Panda Express"},matchScore:2,suggestion:true},"amenity/fast_food/Panera Bread":{name:"Panera Bread",icon:"maki-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","brand:wikidata":"Q7130852"},addTags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread"},removeTags:{amenity:"fast_food",brand:"Panera Bread","brand:wikidata":"Q7130852","brand:wikipedia":"en:Panera Bread",cuisine:"sandwich",name:"Panera Bread"},matchScore:2,suggestion:true},"amenity/fast_food/Papa John's":{name:"Papa John's",icon:"maki-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","brand:wikidata":"Q2759586"},addTags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's"},removeTags:{amenity:"fast_food",brand:"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"en:Papa John's Pizza",cuisine:"pizza",name:"Papa John's"},matchScore:2,suggestion:true},"amenity/fast_food/Papa Murphy's":{name:"Papa Murphy's",icon:"maki-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","brand:wikidata":"Q7132349"},addTags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's"},removeTags:{amenity:"fast_food",brand:"Papa Murphy's","brand:wikidata":"Q7132349","brand:wikipedia":"en:Papa Murphy's",cuisine:"pizza",name:"Papa Murphy's"},matchScore:2,suggestion:true},"amenity/fast_food/Pita Pit":{name:"Pita Pit",icon:"maki-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","brand:wikidata":"Q7757289"},addTags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit"},removeTags:{amenity:"fast_food",brand:"Pita Pit","brand:wikidata":"Q7757289","brand:wikipedia":"en:Pita Pit",cuisine:"pita",name:"Pita Pit"},matchScore:2,suggestion:true},"amenity/fast_food/Pizza Hut Delivery":{name:"Pizza Hut Delivery",icon:"maki-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","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery"},removeTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut Delivery"},matchScore:2,suggestion:true},"amenity/fast_food/Pizza Hut Express":{name:"Pizza Hut Express",icon:"maki-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","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikipedia":"en:Pizza Hut","brand:wikidata":"Q191615",cuisine:"pizza",name:"Pizza Hut Express"},removeTags:{amenity:"fast_food",brand:"Pizza Hut","brand:wikipedia":"en:Pizza Hut","brand:wikidata":"Q191615",cuisine:"pizza",name:"Pizza Hut Express"},matchScore:2,suggestion:true},"amenity/fast_food/Pizza Nova":{name:"Pizza Nova",icon:"maki-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","brand:wikidata":"Q7199971"},addTags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova"},removeTags:{amenity:"fast_food",brand:"Pizza Nova","brand:wikidata":"Q7199971","brand:wikipedia":"en:Pizza Nova",cuisine:"pizza",name:"Pizza Nova"},matchScore:2,suggestion:true},"amenity/fast_food/Pizza Pizza":{name:"Pizza Pizza",icon:"maki-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","brand:wikidata":"Q1194143"},addTags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza"},removeTags:{amenity:"fast_food",brand:"Pizza Pizza","brand:wikidata":"Q1194143","brand:wikipedia":"en:Pizza Pizza",cuisine:"pizza",name:"Pizza Pizza"},matchScore:2,suggestion:true},"amenity/fast_food/Pollo Campero":{name:"Pollo Campero",icon:"maki-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","brand:wikidata":"Q942741"},addTags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero"},removeTags:{amenity:"fast_food",brand:"Pollo Campero","brand:wikidata":"Q942741","brand:wikipedia":"en:Pollo Campero",cuisine:"chicken",name:"Pollo Campero"},matchScore:2,suggestion:true},"amenity/fast_food/Popeye's":{name:"Popeye's",icon:"maki-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","brand:wikidata":"Q1330910"},addTags:{amenity:"fast_food",brand:"Popeye's","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeye's"},removeTags:{amenity:"fast_food",brand:"Popeye's","brand:wikidata":"Q1330910","brand:wikipedia":"en:Popeyes",cuisine:"chicken",name:"Popeye's"},matchScore:2,suggestion:true},"amenity/fast_food/Potbelly":{name:"Potbelly",icon:"maki-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","brand:wikidata":"Q7234777"},addTags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Works",cuisine:"sandwich",name:"Potbelly"},removeTags:{amenity:"fast_food",brand:"Potbelly","brand:wikidata":"Q7234777","brand:wikipedia":"en:Potbelly Sandwich Works",cuisine:"sandwich",name:"Potbelly"},matchScore:2,suggestion:true},"amenity/fast_food/Qdoba":{name:"Qdoba",icon:"maki-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","brand:wikidata":"Q1363885"},addTags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba"},removeTags:{amenity:"fast_food",brand:"Qdoba","brand:wikidata":"Q1363885","brand:wikipedia":"en:Qdoba",cuisine:"mexican",name:"Qdoba"},matchScore:2,suggestion:true},"amenity/fast_food/Quick":{name:"Quick",icon:"maki-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","brand:wikidata":"Q286494"},addTags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick"},removeTags:{amenity:"fast_food",brand:"Quick","brand:wikidata":"Q286494","brand:wikipedia":"en:Quick (restaurant)",cuisine:"burger",name:"Quick"},matchScore:2,suggestion:true},"amenity/fast_food/Quiznos":{name:"Quiznos",icon:"maki-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","brand:wikidata":"Q1936229"},addTags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos"},removeTags:{amenity:"fast_food",brand:"Quiznos","brand:wikidata":"Q1936229","brand:wikipedia":"en:Quiznos",cuisine:"sandwich",name:"Quiznos"},matchScore:2,suggestion:true},"amenity/fast_food/Rally's":{name:"Rally's",icon:"maki-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","brand:wikidata":"Q3419341"},addTags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Rally's"},removeTags:{amenity:"fast_food",brand:"Rally's","brand:wikidata":"Q3419341","brand:wikipedia":"en:Checkers and Rally's",cuisine:"burger",name:"Rally's"},matchScore:2,suggestion:true},"amenity/fast_food/Red Rooster":{name:"Red Rooster",icon:"maki-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","brand:wikidata":"Q376466"},addTags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster"},removeTags:{amenity:"fast_food",brand:"Red Rooster","brand:wikidata":"Q376466","brand:wikipedia":"en:Red Rooster",cuisine:"chicken",name:"Red Rooster"},matchScore:2,suggestion:true},"amenity/fast_food/Sbarro":{name:"Sbarro",icon:"maki-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","brand:wikidata":"Q2589409"},addTags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro"},removeTags:{amenity:"fast_food",brand:"Sbarro","brand:wikidata":"Q2589409","brand:wikipedia":"en:Sbarro",cuisine:"pizza",name:"Sbarro"},matchScore:2,suggestion:true},"amenity/fast_food/Smashburger":{name:"Smashburger",icon:"maki-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","brand:wikidata":"Q17061332"},addTags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger"},removeTags:{amenity:"fast_food",brand:"Smashburger","brand:wikidata":"Q17061332","brand:wikipedia":"en:Smashburger",cuisine:"burger",name:"Smashburger"},matchScore:2,suggestion:true},"amenity/fast_food/Smoothie King":{name:"Smoothie King",icon:"maki-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","brand:wikidata":"Q5491421"},addTags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King"},removeTags:{amenity:"fast_food",brand:"Smoothie King","brand:wikidata":"Q5491421","brand:wikipedia":"en:Smoothie King",cuisine:"juice",name:"Smoothie King"},matchScore:2,suggestion:true},"amenity/fast_food/Sonic":{name:"Sonic",icon:"maki-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","brand:wikidata":"Q7561808"},addTags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic"},removeTags:{amenity:"fast_food",brand:"Sonic","brand:wikidata":"Q7561808","brand:wikipedia":"en:Sonic Drive-In",cuisine:"burger",name:"Sonic"},matchScore:2,suggestion:true},"amenity/fast_food/Steers":{name:"Steers",icon:"maki-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","brand:wikidata":"Q56599145"},addTags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers"},removeTags:{amenity:"fast_food",brand:"Steers","brand:wikidata":"Q56599145","brand:wikipedia":"en:Steers",cuisine:"burger",name:"Steers"},matchScore:2,suggestion:true},"amenity/fast_food/Subway":{name:"Subway",icon:"maki-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","brand:wikidata":"Q244457"},addTags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway"},removeTags:{amenity:"fast_food",brand:"Subway","brand:wikidata":"Q244457","brand:wikipedia":"en:Subway (restaurant)",cuisine:"sandwich",name:"Subway"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Bell":{name:"Taco Bell",icon:"maki-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","brand:wikidata":"Q752941"},addTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"mexican",name:"Taco Bell"},removeTags:{amenity:"fast_food",brand:"Taco Bell","brand:wikidata":"Q752941","brand:wikipedia":"en:Taco Bell",cuisine:"mexican",name:"Taco Bell"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Bueno":{name:"Taco Bueno",icon:"maki-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","brand:wikidata":"Q7673958"},addTags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno"},removeTags:{amenity:"fast_food",brand:"Taco Bueno","brand:wikidata":"Q7673958","brand:wikipedia":"en:Taco Bueno",cuisine:"mexican",name:"Taco Bueno"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Cabana":{name:"Taco Cabana",icon:"maki-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","brand:wikidata":"Q12070488"},addTags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana"},removeTags:{amenity:"fast_food",brand:"Taco Cabana","brand:wikidata":"Q12070488","brand:wikipedia":"en:Taco Cabana",cuisine:"mexican",name:"Taco Cabana"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Del Mar":{name:"Taco Del Mar",icon:"maki-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","brand:wikidata":"Q7673972"},addTags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar"},removeTags:{amenity:"fast_food",brand:"Taco Del Mar","brand:wikidata":"Q7673972","brand:wikipedia":"en:Taco del Mar",cuisine:"mexican",name:"Taco Del Mar"},matchScore:2,suggestion:true},"amenity/fast_food/Taco John's":{name:"Taco John's",icon:"maki-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","brand:wikidata":"Q7673962"},addTags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's"},removeTags:{amenity:"fast_food",brand:"Taco John's","brand:wikidata":"Q7673962","brand:wikipedia":"en:Taco John's",cuisine:"mexican",name:"Taco John's"},matchScore:2,suggestion:true},"amenity/fast_food/Taco Time":{name:"Taco Time",icon:"maki-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","brand:wikidata":"Q7673969"},addTags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time"},removeTags:{amenity:"fast_food",brand:"Taco Time","brand:wikidata":"Q7673969","brand:wikipedia":"en:Taco Time",cuisine:"mexican",name:"Taco Time"},matchScore:2,suggestion:true},"amenity/fast_food/Telepizza":{name:"Telepizza",icon:"maki-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","brand:wikidata":"Q2699863"},addTags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza"},removeTags:{amenity:"fast_food",brand:"Telepizza","brand:wikidata":"Q2699863","brand:wikipedia":"en:Telepizza",cuisine:"pizza",name:"Telepizza"},matchScore:2,suggestion:true},"amenity/fast_food/Thai Express":{name:"Thai Express",icon:"maki-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","brand:wikidata":"Q7709119"},addTags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express"},removeTags:{amenity:"fast_food",brand:"Thai Express","brand:wikidata":"Q7709119","brand:wikipedia":"en:Thai Express",cuisine:"thai",name:"Thai Express"},matchScore:2,suggestion:true},"amenity/fast_food/The Pizza Company":{name:"The Pizza Company",icon:"maki-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","brand:wikidata":"Q2413520"},addTags:{amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company"},removeTags:{amenity:"fast_food",brand:"The Pizza Company","brand:wikidata":"Q2413520","brand:wikipedia":"en:The Pizza Company",cuisine:"pizza",name:"The Pizza Company"},matchScore:2,suggestion:true},"amenity/fast_food/Wendy's":{name:"Wendy's",icon:"maki-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","brand:wikidata":"Q550258"},addTags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's"},removeTags:{amenity:"fast_food",brand:"Wendy's","brand:wikidata":"Q550258","brand:wikipedia":"en:Wendy's",cuisine:"burger",name:"Wendy's"},matchScore:2,suggestion:true},"amenity/fast_food/Whataburger":{name:"Whataburger",icon:"maki-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","brand:wikidata":"Q376627"},addTags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger"},removeTags:{amenity:"fast_food",brand:"Whataburger","brand:wikidata":"Q376627","brand:wikipedia":"en:Whataburger",cuisine:"burger",name:"Whataburger"},matchScore:2,suggestion:true},"amenity/fast_food/White Castle":{name:"White Castle",icon:"maki-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","brand:wikidata":"Q1244034"},addTags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle"},removeTags:{amenity:"fast_food",brand:"White Castle","brand:wikidata":"Q1244034","brand:wikipedia":"en:White Castle (restaurant)",cuisine:"burger",name:"White Castle"},matchScore:2,suggestion:true},"amenity/fast_food/Wienerschnitzel":{name:"Wienerschnitzel",icon:"maki-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","brand:wikidata":"Q324679"},addTags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel"},removeTags:{amenity:"fast_food",brand:"Wienerschnitzel","brand:wikidata":"Q324679","brand:wikipedia":"en:Wienerschnitzel",cuisine:"hot_dog",name:"Wienerschnitzel"},matchScore:2,suggestion:true},"amenity/fast_food/Wimpy":{name:"Wimpy",icon:"maki-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","brand:wikidata":"Q2811992"},addTags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy"},removeTags:{amenity:"fast_food",brand:"Wimpy","brand:wikidata":"Q2811992","brand:wikipedia":"en:Wimpy (restaurant)",cuisine:"burger",name:"Wimpy"},matchScore:2,suggestion:true},"amenity/fast_food/Zaxby's":{name:"Zaxby's",icon:"maki-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","brand:wikidata":"Q8067525"},addTags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's"},removeTags:{amenity:"fast_food",brand:"Zaxby's","brand:wikidata":"Q8067525","brand:wikipedia":"en:Zaxby's",cuisine:"chicken",name:"Zaxby's"},matchScore:2,suggestion:true},"amenity/fast_food/Бургер Кинг":{name:"Бургер Кинг",icon:"maki-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","brand:wikidata":"Q177054"},addTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King"},removeTags:{amenity:"fast_food",brand:"Бургер Кинг","brand:en":"Burger King","brand:wikidata":"Q177054","brand:wikipedia":"en:Burger King",cuisine:"burger",name:"Бургер Кинг","name:en":"Burger King"},matchScore:2,suggestion:true},"amenity/fast_food/Крошка Картошка":{name:"Крошка Картошка",icon:"maki-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","brand:wikidata":"Q4241838"},addTags:{amenity:"fast_food",brand:"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",name:"Крошка Картошка"},removeTags:{amenity:"fast_food",brand:"Крошка Картошка","brand:wikidata":"Q4241838","brand:wikipedia":"ru:Крошка Картошка",name:"Крошка Картошка"},matchScore:2,suggestion:true},"amenity/fast_food/Макдоналдс":{name:"Макдоналдс",icon:"maki-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","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"Макдоналдс","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"en:McDonald's",cuisine:"burger",name:"Макдоналдс","name:en":"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/Папа Джонс":{name:"Папа Джонс",icon:"maki-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","brand:wikidata":"Q2759586"},addTags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's"},removeTags:{amenity:"fast_food",brand:"Папа Джонс","brand:en":"Papa John's","brand:wikidata":"Q2759586","brand:wikipedia":"ru:Papa John’s",cuisine:"pizza",name:"Папа Джонс","name:en":"Papa John's"},matchScore:2,suggestion:true},"amenity/fast_food/Стардог!s":{name:"Стардог!s",icon:"maki-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","brand:wikidata":"Q4439856"},addTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",name:"Стардог!s","name:en":"Stardog!s"},removeTags:{amenity:"fast_food",brand:"Стардог!s","brand:en":"Stardog!s","brand:wikidata":"Q4439856","brand:wikipedia":"ru:Стардогс",name:"Стардог!s","name:en":"Stardog!s"},matchScore:2,suggestion:true},"amenity/fast_food/Теремок":{name:"Теремок",icon:"maki-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","brand:wikidata":"Q4455593"},addTags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",name:"Теремок","name:en":"Teremok"},removeTags:{amenity:"fast_food",brand:"Теремок","brand:en":"Teremok","brand:wikidata":"Q4455593","brand:wikipedia":"ru:Теремок (сеть быстрого питания)",name:"Теремок","name:en":"Teremok"},matchScore:2,suggestion:true},"amenity/fast_food/מקדונלד'ס":{name:"מקדונלד'ס",icon:"maki-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","brand:wikidata":"Q12061542"},addTags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"מקדונלד'ס","brand:en":"McDonald's","brand:wikidata":"Q12061542","brand:wikipedia":"en:McDonald's Israel",cuisine:"burger",name:"מקדונלד'ס","name:en":"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/かっぱ寿司":{name:"かっぱ寿司",icon:"maki-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","brand:wikidata":"Q11263916"},addTags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi"},removeTags:{amenity:"fast_food",brand:"かっぱ寿司","brand:en":"Kappazushi","brand:wikidata":"Q11263916","brand:wikipedia":"ja:かっぱ寿司",cuisine:"sushi",name:"かっぱ寿司","name:en":"Kappazushi"},matchScore:2,suggestion:true},"amenity/fast_food/かつや":{name:"かつや",icon:"maki-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","brand:wikidata":"Q2855257"},addTags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ko":"카쯔야","name:zh":"吉豚屋"},removeTags:{amenity:"fast_food",brand:"かつや","brand:en":"Katsuya","brand:wikidata":"Q2855257","brand:wikipedia":"ja:かつや",cuisine:"fried_food",name:"かつや","name:en":"Katsuya","name:ko":"카쯔야","name:zh":"吉豚屋"},matchScore:2,suggestion:true},"amenity/fast_food/くら寿司":{name:"くら寿司",icon:"maki-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","brand:wikidata":"Q6445491"},addTags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くらコーポレーション",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi"},removeTags:{amenity:"fast_food",brand:"くら寿司","brand:en":"Kurazushi","brand:wikidata":"Q6445491","brand:wikipedia":"ja:くらコーポレーション",cuisine:"sushi",name:"くら寿司","name:en":"Kurazushi"},matchScore:2,suggestion:true},"amenity/fast_food/すき家":{name:"すき家",icon:"maki-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","brand:wikidata":"Q6137375"},addTags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",name:"すき家","name:en":"Sukiya"},removeTags:{amenity:"fast_food",brand:"すき家","brand:en":"Sukiya","brand:wikidata":"Q6137375","brand:wikipedia":"ja:すき家",name:"すき家","name:en":"Sukiya"},matchScore:2,suggestion:true},"amenity/fast_food/なか卯":{name:"なか卯",icon:"maki-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","brand:wikidata":"Q11274132"},addTags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",name:"なか卯","name:en":"Nakau"},removeTags:{amenity:"fast_food",brand:"なか卯","brand:en":"Nakau","brand:wikidata":"Q11274132","brand:wikipedia":"ja:なか卯",name:"なか卯","name:en":"Nakau"},matchScore:2,suggestion:true},"amenity/fast_food/はま寿司":{name:"はま寿司",icon:"maki-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","brand:wikidata":"Q17220385"},addTags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",name:"はま寿司","name:en":"Hamazushi"},removeTags:{amenity:"fast_food",brand:"はま寿司","brand:en":"Hamazushi","brand:wikidata":"Q17220385","brand:wikipedia":"ja:はま寿司",name:"はま寿司","name:en":"Hamazushi"},matchScore:2,suggestion:true},"amenity/fast_food/ほっかほっか亭":{name:"ほっかほっか亭",icon:"maki-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","brand:wikidata":"Q5878035"},addTags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei"},removeTags:{amenity:"fast_food",brand:"ほっかほっか亭","brand:en":"Hokka Hokka Tei","brand:wikidata":"Q5878035","brand:wikipedia":"ja:ほっかほっか亭",name:"ほっかほっか亭","name:en":"Hokka Hokka Tei"},matchScore:2,suggestion:true},"amenity/fast_food/ほっともっと":{name:"ほっともっと",icon:"maki-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","brand:wikidata":"Q10850949"},addTags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto"},removeTags:{amenity:"fast_food",brand:"ほっともっと","brand:en":"Hotto Motto","brand:wikidata":"Q10850949","brand:wikipedia":"ja:ほっともっと",name:"ほっともっと","name:en":"Hotto Motto"},matchScore:2,suggestion:true},"amenity/fast_food/オリジン弁当":{name:"オリジン弁当",icon:"maki-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","brand:wikidata":"Q11292632"},addTags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",name:"オリジン弁当","name:en":"Origin Bentō"},removeTags:{amenity:"fast_food",brand:"オリジン弁当","brand:en":"Origin Bentō","brand:wikidata":"Q11292632","brand:wikipedia":"ja:オリジン東秀",name:"オリジン弁当","name:en":"Origin Bentō"},matchScore:2,suggestion:true},"amenity/fast_food/ケンタッキーフライドチキン":{name:"ケンタッキーフライドチキン",icon:"maki-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","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC"},removeTags:{amenity:"fast_food",brand:"ケンタッキーフライドチキン","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"ja:KFCコーポレーション",cuisine:"chicken",name:"ケンタッキーフライドチキン","name:en":"KFC"},matchScore:2,suggestion:true},"amenity/fast_food/サブウェイ":{name:"サブウェイ",icon:"maki-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","brand:wikidata":"Q244457"},addTags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway"},removeTags:{amenity:"fast_food",brand:"サブウェイ","brand:en":"Subway","brand:wikidata":"Q244457","brand:wikipedia":"ja:サブウェイ",cuisine:"sandwich",name:"サブウェイ","name:en":"Subway"},matchScore:2,suggestion:true},"amenity/fast_food/スシロー":{name:"スシロー",icon:"maki-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","brand:wikidata":"Q11257037"},addTags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:zh":"壽司郎"},removeTags:{amenity:"fast_food",brand:"スシロー","brand:en":"Sushiro","brand:wikidata":"Q11257037","brand:wikipedia":"ja:あきんどスシロー",cuisine:"sushi",name:"スシロー","name:en":"Sushiro","name:zh":"壽司郎"},matchScore:2,suggestion:true},"amenity/fast_food/ピザハット":{name:"ピザハット",icon:"maki-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","brand:wikidata":"Q191615"},addTags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut"},removeTags:{amenity:"fast_food",brand:"ピザハット","brand:en":"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"ja:ピザハット",cuisine:"pizza",name:"ピザハット","name:en":"Pizza Hut"},matchScore:2,suggestion:true},"amenity/fast_food/マクドナルド":{name:"マクドナルド",icon:"maki-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","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"マクドナルド","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"ja:マクドナルド",cuisine:"burger",name:"マクドナルド","name:en":"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/ミスタードーナツ":{name:"ミスタードーナツ",icon:"maki-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","brand:wikidata":"Q1065819"},addTags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut"},removeTags:{amenity:"fast_food",brand:"ミスタードーナツ","brand:en":"Mister Donut","brand:wikidata":"Q1065819","brand:wikipedia":"en:Mister Donut",cuisine:"donut",name:"ミスタードーナツ","name:en":"Mister Donut"},matchScore:2,suggestion:true},"amenity/fast_food/モスバーガー":{name:"モスバーガー",icon:"maki-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","brand:wikidata":"Q1204169"},addTags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger"},removeTags:{amenity:"fast_food",brand:"モスバーガー","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"ja:モスバーガー",cuisine:"burger",name:"モスバーガー","name:en":"MOS Burger"},matchScore:2,suggestion:true},"amenity/fast_food/ロッテリア":{name:"ロッテリア",icon:"maki-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","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria"},removeTags:{amenity:"fast_food",brand:"ロッテリア","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ja:ロッテリア",cuisine:"burger",name:"ロッテリア","name:en":"Lotteria"},matchScore:2,suggestion:true},"amenity/fast_food/吉野家":{name:"吉野家",icon:"maki-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","brand:wikidata":"Q776272"},addTags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",name:"吉野家","name:en":"Yoshinoya"},removeTags:{amenity:"fast_food",brand:"吉野家","brand:en":"Yoshinoya","brand:wikidata":"Q776272","brand:wikipedia":"ja:吉野家",name:"吉野家","name:en":"Yoshinoya"},matchScore:2,suggestion:true},"amenity/fast_food/富士そば":{name:"富士そば",icon:"maki-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","brand:wikidata":"Q11414722"},addTags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",name:"富士そば","name:en":"Fuji Soba"},removeTags:{amenity:"fast_food",brand:"富士そば","brand:en":"Fuji Soba","brand:wikidata":"Q11414722","brand:wikipedia":"ja:名代富士そば",name:"富士そば","name:en":"Fuji Soba"},matchScore:2,suggestion:true},"amenity/fast_food/幸楽苑":{name:"幸楽苑",icon:"maki-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","brand:wikidata":"Q11484003"},addTags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",name:"幸楽苑","name:en":"Kourakuen"},removeTags:{amenity:"fast_food",brand:"幸楽苑","brand:en":"Kourakuen","brand:wikidata":"Q11484003","brand:wikipedia":"ja:幸楽苑",name:"幸楽苑","name:en":"Kourakuen"},matchScore:2,suggestion:true},"amenity/fast_food/摩斯漢堡":{name:"摩斯漢堡",icon:"maki-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","brand:wikidata":"Q1204169"},addTags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger"},removeTags:{amenity:"fast_food",brand:"摩斯漢堡","brand:en":"MOS Burger","brand:wikidata":"Q1204169","brand:wikipedia":"zh:摩斯漢堡",cuisine:"burger",name:"摩斯漢堡","name:en":"MOS Burger"},matchScore:2,suggestion:true},"amenity/fast_food/松屋":{name:"松屋",icon:"maki-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","brand:wikidata":"Q848773"},addTags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya Foods","brand:wikidata":"Q848773","brand:wikipedia":"zh:松屋食品",name:"松屋","name:en":"Matsuya Foods"},removeTags:{amenity:"fast_food",brand:"松屋","brand:en":"Matsuya Foods","brand:wikidata":"Q848773","brand:wikipedia":"zh:松屋食品",name:"松屋","name:en":"Matsuya Foods"},matchScore:2,suggestion:true},"amenity/fast_food/肯德基":{name:"肯德基",icon:"maki-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","brand:wikidata":"Q524757"},addTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",name:"肯德基","name:en":"KFC"},removeTags:{amenity:"fast_food",brand:"肯德基","brand:en":"KFC","brand:wikidata":"Q524757","brand:wikipedia":"zh:肯德基",name:"肯德基","name:en":"KFC"},matchScore:2,suggestion:true},"amenity/fast_food/麥當勞":{name:"麥當勞",icon:"maki-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","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"麥當勞","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh_classical:麥當勞",cuisine:"burger",name:"麥當勞","name:en":"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/麦当劳":{name:"麦当劳",icon:"maki-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","brand:wikidata":"Q38076"},addTags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's"},removeTags:{amenity:"fast_food",brand:"麦当劳","brand:en":"McDonald's","brand:wikidata":"Q38076","brand:wikipedia":"zh:麦当劳",cuisine:"burger",name:"麦当劳","name:en":"McDonald's"},matchScore:2,suggestion:true},"amenity/fast_food/롯데리아":{name:"롯데리아",icon:"maki-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","brand:wikidata":"Q249525"},addTags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria"},removeTags:{amenity:"fast_food",brand:"롯데리아","brand:en":"Lotteria","brand:wikidata":"Q249525","brand:wikipedia":"ko:롯데리아",cuisine:"burger",name:"롯데리아","name:en":"Lotteria"},matchScore:2,suggestion:true},"amenity/fuel/1-2-3":{name:"1-2-3",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4545742"},addTags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"},removeTags:{amenity:"fuel",brand:"1-2-3","brand:wikidata":"Q4545742","brand:wikipedia":"en:1-2-3 (fuel station)",name:"1-2-3"},matchScore:2,suggestion:true},"amenity/fuel/ABC":{name:"ABC",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10397504"},addTags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"},removeTags:{amenity:"fuel",brand:"ABC","brand:wikidata":"Q10397504","brand:wikipedia":"fi:ABC-ketju",name:"ABC"},matchScore:2,suggestion:true},"amenity/fuel/ADNOC":{name:"ADNOC",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q166729"},addTags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"},removeTags:{amenity:"fuel",brand:"ADNOC","brand:wikidata":"Q166729","brand:wikipedia":"en:Abu Dhabi National Oil Company",name:"ADNOC"},matchScore:2,suggestion:true},"amenity/fuel/Afriquia":{name:"Afriquia",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2829178"},addTags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"},removeTags:{amenity:"fuel",brand:"Afriquia","brand:wikidata":"Q2829178","brand:wikipedia":"en:Akwa Group",name:"Afriquia"},matchScore:2,suggestion:true},"amenity/fuel/Agip":{name:"Agip",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q377915"},addTags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"},removeTags:{amenity:"fuel",brand:"Agip","brand:wikidata":"Q377915","brand:wikipedia":"en:Agip",name:"Agip"},matchScore:2,suggestion:true},"amenity/fuel/Aral":{name:"Aral",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q565734"},addTags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"},removeTags:{amenity:"fuel",brand:"Aral","brand:wikidata":"Q565734","brand:wikipedia":"en:Aral AG",name:"Aral"},matchScore:2,suggestion:true},"amenity/fuel/Arco":{name:"Arco",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q304769"},addTags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"},removeTags:{amenity:"fuel",brand:"Arco","brand:wikidata":"Q304769","brand:wikipedia":"en:ARCO",name:"Arco"},matchScore:2,suggestion:true},"amenity/fuel/Avia":{name:"Avia",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q300147"},addTags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"},removeTags:{amenity:"fuel",brand:"Avia","brand:wikidata":"Q300147","brand:wikipedia":"de:Avia International",name:"Avia"},matchScore:2,suggestion:true},"amenity/fuel/BP":{name:"BP",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q152057"},addTags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"},removeTags:{amenity:"fuel",brand:"BP","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP"},matchScore:2,suggestion:true},"amenity/fuel/Bharat Petroleum":{name:"Bharat Petroleum",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q854826"},addTags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"},removeTags:{amenity:"fuel",brand:"Bharat Petroleum","brand:wikidata":"Q854826","brand:wikipedia":"en:Bharat Petroleum",name:"Bharat Petroleum"},matchScore:2,suggestion:true},"amenity/fuel/Bliska":{name:"Bliska",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4016378"},addTags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"},removeTags:{amenity:"fuel",brand:"Bliska","brand:wikidata":"Q4016378","brand:wikipedia":"pl:Bliska",name:"Bliska"},matchScore:2,suggestion:true},"amenity/fuel/CAMPSA":{name:"CAMPSA",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1031623"},addTags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"},removeTags:{amenity:"fuel",brand:"CAMPSA","brand:wikidata":"Q1031623","brand:wikipedia":"en:Campsa",name:"CAMPSA"},matchScore:2,suggestion:true},"amenity/fuel/CEPSA":{name:"CEPSA",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q608819"},addTags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Compañía Española de Petróleos",name:"CEPSA"},removeTags:{amenity:"fuel",brand:"CEPSA","brand:wikidata":"Q608819","brand:wikipedia":"en:Compañía Española de Petróleos",name:"CEPSA"},matchScore:2,suggestion:true},"amenity/fuel/Caltex":{name:"Caltex",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q277470"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"},removeTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q277470","brand:wikipedia":"en:Caltex",name:"Caltex"},matchScore:2,suggestion:true},"amenity/fuel/Canadian Tire Gas+":{name:"Canadian Tire Gas+",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1032400"},addTags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"},removeTags:{amenity:"fuel",brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire"},matchScore:2,suggestion:true},"amenity/fuel/Cenex":{name:"Cenex",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5011381"},addTags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"},removeTags:{amenity:"fuel",brand:"Cenex","brand:wikidata":"Q5011381","brand:wikipedia":"en:CHS Inc.",name:"Cenex"},matchScore:2,suggestion:true},"amenity/fuel/Clark":{name:"Clark",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5127157"},addTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},removeTags:{amenity:"fuel",brand:"Clark","brand:wikidata":"Q5127157","brand:wikipedia":"en:Clark Brands",name:"Clark"},matchScore:2,suggestion:true},"amenity/fuel/Co-op":{name:"Co-op",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5440676"},addTags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"},removeTags:{amenity:"fuel",brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op"},matchScore:2,suggestion:true},"amenity/fuel/Conoco":{name:"Conoco",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1126518"},addTags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"},removeTags:{amenity:"fuel",brand:"Conoco","brand:wikidata":"Q1126518","brand:wikipedia":"en:Conoco",name:"Conoco"},matchScore:2,suggestion:true},"amenity/fuel/Costco Gasoline":{name:"Costco Gasoline",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q715583"},addTags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"},removeTags:{amenity:"fuel",brand:"Costco Gasoline","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Gasoline"},matchScore:2,suggestion:true},"amenity/fuel/Diamond Shamrock":{name:"Diamond Shamrock",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q16973722"},addTags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"},removeTags:{amenity:"fuel",brand:"Diamond Shamrock","brand:wikidata":"Q16973722","brand:wikipedia":"en:Diamond Shamrock",name:"Diamond Shamrock"},matchScore:2,suggestion:true},"amenity/fuel/EKO (Canada)":{name:"EKO (Canada)",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3045934"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"},removeTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q3045934","brand:wikipedia":"fr:EKO",name:"EKO"},matchScore:2,suggestion:true},"amenity/fuel/EKO (Greece)":{name:"EKO (Greece)",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q903198"},addTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"},removeTags:{amenity:"fuel",brand:"EKO","brand:wikidata":"Q903198","brand:wikipedia":"el:Ελληνικά Πετρέλαια",name:"EKO"},matchScore:2,suggestion:true},"amenity/fuel/ENEOS":{name:"ENEOS",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1640290"},addTags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"},removeTags:{amenity:"fuel",brand:"ENEOS","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"ENEOS"},matchScore:2,suggestion:true},"amenity/fuel/Elan":{name:"Elan",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q57980752"},addTags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"},removeTags:{amenity:"fuel",brand:"Elan","brand:wikidata":"Q57980752",name:"Elan"},matchScore:2,suggestion:true},"amenity/fuel/Eni":{name:"Eni",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q565594"},addTags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"},removeTags:{amenity:"fuel",brand:"Eni","brand:wikidata":"Q565594","brand:wikipedia":"en:Eni",name:"Eni"},matchScore:2,suggestion:true},"amenity/fuel/Esso":{name:"Esso",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"},removeTags:{amenity:"fuel",brand:"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"Esso"},matchScore:2,suggestion:true},"amenity/fuel/Esso Express":{name:"Esso Express",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2350336"},addTags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"},removeTags:{amenity:"fuel",brand:"Esso Express","brand:wikidata":"Q2350336","brand:wikipedia":"nl:Esso Express",name:"Esso Express"},matchScore:2,suggestion:true},"amenity/fuel/Exxon":{name:"Exxon",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4781944"},addTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},removeTags:{amenity:"fuel",brand:"Exxon","brand:wikidata":"Q4781944","brand:wikipedia":"en:Exxon",name:"Exxon"},matchScore:2,suggestion:true},"amenity/fuel/Freie Tankstelle":{name:"Freie Tankstelle",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1009104"},addTags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"},removeTags:{amenity:"fuel",brand:"Freie Tankstelle","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"Freie Tankstelle"},matchScore:2,suggestion:true},"amenity/fuel/Gazprom":{name:"Gazprom",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q102673"},addTags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"},removeTags:{amenity:"fuel",brand:"Gazprom","brand:wikidata":"Q102673","brand:wikipedia":"en:Gazprom",name:"Gazprom"},matchScore:2,suggestion:true},"amenity/fuel/GetGo":{name:"GetGo",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5553766"},addTags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"},removeTags:{amenity:"fuel",brand:"GetGo","brand:wikidata":"Q5553766","brand:wikipedia":"en:GetGo",name:"GetGo"},matchScore:2,suggestion:true},"amenity/fuel/Goil":{name:"Goil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5555383"},addTags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"},removeTags:{amenity:"fuel",brand:"Goil","brand:wikidata":"Q5555383","brand:wikipedia":"en:Ghana Oil Company",name:"Goil"},matchScore:2,suggestion:true},"amenity/fuel/HEM":{name:"HEM",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1563517"},addTags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"},removeTags:{amenity:"fuel",brand:"HEM","brand:wikidata":"Q1563517","brand:wikipedia":"de:Deutsche Tamoil",name:"HEM"},matchScore:2,suggestion:true},"amenity/fuel/Hindustan Petroleum":{name:"Hindustan Petroleum",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1619375"},addTags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"Hindustan Petroleum"},removeTags:{amenity:"fuel",brand:"Hindustan Petroleum","brand:wikidata":"Q1619375","brand:wikipedia":"en:Hindustan Petroleum",name:"Hindustan Petroleum"},matchScore:2,suggestion:true},"amenity/fuel/Indian Oil":{name:"Indian Oil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1289348"},addTags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"},removeTags:{amenity:"fuel",brand:"Indian Oil","brand:wikidata":"Q1289348","brand:wikipedia":"en:Indian Oil Corporation",name:"Indian Oil"},matchScore:2,suggestion:true},"amenity/fuel/Ingo":{name:"Ingo",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q17048617"},addTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},removeTags:{amenity:"fuel",brand:"Ingo","brand:wikidata":"Q17048617","brand:wikipedia":"en:Ingo (brand)",name:"Ingo"},matchScore:2,suggestion:true},"amenity/fuel/Intermarché":{name:"Intermarché",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3153200"},addTags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"},removeTags:{amenity:"fuel",brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché"},matchScore:2,suggestion:true},"amenity/fuel/Ipiranga":{name:"Ipiranga",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2081136"},addTags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"},removeTags:{amenity:"fuel",brand:"Ipiranga","brand:wikidata":"Q2081136","brand:wikipedia":"pt:Ipiranga (empresa)",name:"Ipiranga"},matchScore:2,suggestion:true},"amenity/fuel/Jet":{name:"Jet",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q568940"},addTags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"},removeTags:{amenity:"fuel",brand:"Jet","brand:wikidata":"Q568940","brand:wikipedia":"en:Jet (brand)",name:"Jet"},matchScore:2,suggestion:true},"amenity/fuel/Kroger":{name:"Kroger",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q153417"},addTags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"},removeTags:{amenity:"fuel",brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger"},matchScore:2,suggestion:true},"amenity/fuel/Kwik Trip":{name:"Kwik Trip",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q6450420"},addTags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"},removeTags:{amenity:"fuel",brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip"},matchScore:2,suggestion:true},"amenity/fuel/Lukoil":{name:"Lukoil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q329347"},addTags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"},removeTags:{amenity:"fuel",brand:"Lukoil","brand:wikidata":"Q329347","brand:wikipedia":"en:Lukoil",name:"Lukoil"},matchScore:2,suggestion:true},"amenity/fuel/Marathon":{name:"Marathon",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q458363"},addTags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"},removeTags:{amenity:"fuel",brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon"},matchScore:2,suggestion:true},"amenity/fuel/Maxol":{name:"Maxol",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3302837"},addTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},removeTags:{amenity:"fuel",brand:"Maxol","brand:wikidata":"Q3302837","brand:wikipedia":"en:Maxol",name:"Maxol"},matchScore:2,suggestion:true},"amenity/fuel/Mobil":{name:"Mobil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3088656"},addTags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"},removeTags:{amenity:"fuel",brand:"Mobil","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil"},matchScore:2,suggestion:true},"amenity/fuel/Murphy USA":{name:"Murphy USA",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q19604459"},addTags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"},removeTags:{amenity:"fuel",brand:"Murphy USA","brand:wikidata":"Q19604459","brand:wikipedia":"en:Murphy USA",name:"Murphy USA"},matchScore:2,suggestion:true},"amenity/fuel/Neste":{name:"Neste",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q616376"},addTags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"},removeTags:{amenity:"fuel",brand:"Neste","brand:wikidata":"Q616376","brand:wikipedia":"en:Neste",name:"Neste"},matchScore:2,suggestion:true},"amenity/fuel/OIL!":{name:"OIL!",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2007561"},addTags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"},removeTags:{amenity:"fuel",brand:"OIL!","brand:wikidata":"Q2007561","brand:wikipedia":"de:OIL! Tankstellen",name:"OIL!"},matchScore:2,suggestion:true},"amenity/fuel/OK":{name:"OK",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12329785"},addTags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"},removeTags:{amenity:"fuel",brand:"OK","brand:wikidata":"Q12329785","brand:wikipedia":"da:OK a.m.b.a.",name:"OK"},matchScore:2,suggestion:true},"amenity/fuel/OMV":{name:"OMV",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q168238"},addTags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"},removeTags:{amenity:"fuel",brand:"OMV","brand:wikidata":"Q168238","brand:wikipedia":"en:OMV",name:"OMV"},matchScore:2,suggestion:true},"amenity/fuel/Oilibya":{name:"Oilibya",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7081491"},addTags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"},removeTags:{amenity:"fuel",brand:"Oilibya","brand:wikidata":"Q7081491","brand:wikipedia":"en:Oilibya",name:"Oilibya","name:ar":"أويليبيا"},matchScore:2,suggestion:true},"amenity/fuel/Opet":{name:"Opet",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7072824"},addTags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"},removeTags:{amenity:"fuel",brand:"Opet","brand:wikidata":"Q7072824","brand:wikipedia":"en:Opet",name:"Opet"},matchScore:2,suggestion:true},"amenity/fuel/Oxxo":{name:"Oxxo",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1342538"},addTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",amenity:"fuel"},removeTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",amenity:"fuel"},matchScore:2,suggestion:true},"amenity/fuel/Pacific Pride":{name:"Pacific Pride",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7122637"},addTags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"},removeTags:{amenity:"fuel",brand:"Pacific Pride","brand:wikidata":"Q7122637","brand:wikipedia":"en:Pacific Pride",name:"Pacific Pride"},matchScore:2,suggestion:true},"amenity/fuel/Pemex":{name:"Pemex",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q871308"},addTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},removeTags:{amenity:"fuel",brand:"Pemex","brand:wikidata":"Q871308","brand:wikipedia":"en:Pemex",name:"Pemex"},matchScore:2,suggestion:true},"amenity/fuel/Pertamina":{name:"Pertamina",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1641044"},addTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},removeTags:{amenity:"fuel",brand:"Pertamina","brand:wikidata":"Q1641044","brand:wikipedia":"en:Pertamina",name:"Pertamina"},matchScore:2,suggestion:true},"amenity/fuel/PetroPerú":{name:"PetroPerú",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2506390"},addTags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"},removeTags:{amenity:"fuel",brand:"PetroPerú","brand:wikidata":"Q2506390","brand:wikipedia":"es:Petroperú",name:"PetroPerú"},matchScore:2,suggestion:true},"amenity/fuel/Petrochina":{name:"Petrochina",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q503182"},addTags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"},removeTags:{amenity:"fuel",brand:"Petrochina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"Petrochina"},matchScore:2,suggestion:true},"amenity/fuel/Petroecuador":{name:"Petroecuador",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1812822"},addTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},removeTags:{amenity:"fuel",brand:"Petroecuador","brand:wikidata":"Q1812822","brand:wikipedia":"en:Petroecuador",name:"Petroecuador"},matchScore:2,suggestion:true},"amenity/fuel/Petrol Ofisi":{name:"Petrol Ofisi",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1278087"},addTags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"},removeTags:{amenity:"fuel",brand:"Petrol Ofisi","brand:wikidata":"Q1278087","brand:wikipedia":"en:Petrol Ofisi",name:"Petrol Ofisi"},matchScore:2,suggestion:true},"amenity/fuel/Petrolimex":{name:"Petrolimex",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10831598"},addTags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"},removeTags:{amenity:"fuel",brand:"Petrolimex","brand:wikidata":"Q10831598","brand:wikipedia":"en:Petrolimex",name:"Petrolimex"},matchScore:2,suggestion:true},"amenity/fuel/Petrolina":{name:"Petrolina",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q17013948"},addTags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"},removeTags:{amenity:"fuel",brand:"Petrolina","brand:wikidata":"Q17013948","brand:wikipedia":"en:Petrolina (company)",name:"Petrolina"},matchScore:2,suggestion:true},"amenity/fuel/Petrom":{name:"Petrom",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1755034"},addTags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"},removeTags:{amenity:"fuel",brand:"Petrom","brand:wikidata":"Q1755034","brand:wikipedia":"en:Petrom",name:"Petrom"},matchScore:2,suggestion:true},"amenity/fuel/Petronas":{name:"Petronas",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q221692"},addTags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"},removeTags:{amenity:"fuel",brand:"Petronas","brand:wikidata":"Q221692","brand:wikipedia":"en:Petronas",name:"Petronas"},matchScore:2,suggestion:true},"amenity/fuel/Petronor":{name:"Petronor",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1726547"},addTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},removeTags:{amenity:"fuel",brand:"Petronor","brand:wikidata":"Q1726547","brand:wikipedia":"es:Petronor",name:"Petronor"},matchScore:2,suggestion:true},"amenity/fuel/Phillips 66":{name:"Phillips 66",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1656230"},addTags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"},removeTags:{amenity:"fuel",brand:"Phillips 66","brand:wikidata":"Q1656230","brand:wikipedia":"en:Phillips 66",name:"Phillips 66"},matchScore:2,suggestion:true},"amenity/fuel/Preem":{name:"Preem",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q598835"},addTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},removeTags:{amenity:"fuel",brand:"Preem","brand:wikidata":"Q598835","brand:wikipedia":"en:Preem",name:"Preem"},matchScore:2,suggestion:true},"amenity/fuel/QT":{name:"QT",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7271953"},addTags:{amenity:"fuel",brand:"QT","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QT"},removeTags:{amenity:"fuel",brand:"QT","brand:wikidata":"Q7271953","brand:wikipedia":"en:QuikTrip",name:"QT"},matchScore:2,suggestion:true},"amenity/fuel/Repsol":{name:"Repsol",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q174747"},addTags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"},removeTags:{amenity:"fuel",brand:"Repsol","brand:wikidata":"Q174747","brand:wikipedia":"es:Repsol",name:"Repsol"},matchScore:2,suggestion:true},"amenity/fuel/Rompetrol":{name:"Rompetrol",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1788862"},addTags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"},removeTags:{amenity:"fuel",brand:"Rompetrol","brand:wikidata":"Q1788862","brand:wikipedia":"en:Rompetrol",name:"Rompetrol"},matchScore:2,suggestion:true},"amenity/fuel/Rubis":{name:"Rubis",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3446514"},addTags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"},removeTags:{amenity:"fuel",brand:"Rubis","brand:wikidata":"Q3446514","brand:wikipedia":"en:Rubis (company)",name:"Rubis"},matchScore:2,suggestion:true},"amenity/fuel/Safeway":{name:"Safeway",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1508234"},addTags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"},removeTags:{amenity:"fuel",brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway"},matchScore:2,suggestion:true},"amenity/fuel/Sam's Club":{name:"Sam's Club",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1972120"},addTags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},removeTags:{amenity:"fuel",brand:"Sam's Club","brand:wikidata":"Q1972120","brand:wikipedia":"en:Sam's Club",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},matchScore:2,suggestion:true},"amenity/fuel/Sasol":{name:"Sasol",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q905998"},addTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},removeTags:{amenity:"fuel",brand:"Sasol","brand:wikidata":"Q905998","brand:wikipedia":"en:Sasol",name:"Sasol"},matchScore:2,suggestion:true},"amenity/fuel/Sea Oil":{name:"Sea Oil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7389549"},addTags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"},removeTags:{amenity:"fuel",brand:"Sea Oil","brand:wikidata":"Q7389549","brand:wikipedia":"en:Seaoil Philippines",name:"Sea Oil"},matchScore:2,suggestion:true},"amenity/fuel/Sheetz":{name:"Sheetz",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7492551"},addTags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"},removeTags:{amenity:"fuel",brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz"},matchScore:2,suggestion:true},"amenity/fuel/Shell":{name:"Shell",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q154950"},addTags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"},removeTags:{amenity:"fuel",brand:"Shell","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell"},matchScore:2,suggestion:true},"amenity/fuel/Shell Express":{name:"Shell Express",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2289188"},addTags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"},removeTags:{amenity:"fuel",brand:"Shell Express","brand:wikidata":"Q2289188","brand:wikipedia":"nl:Shell Express",name:"Shell Express"},matchScore:2,suggestion:true},"amenity/fuel/Slovnaft":{name:"Slovnaft",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1587563"},addTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},removeTags:{amenity:"fuel",brand:"Slovnaft","brand:wikidata":"Q1587563","brand:wikipedia":"en:Slovnaft",name:"Slovnaft"},matchScore:2,suggestion:true},"amenity/fuel/Socar":{name:"Socar",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1622293"},addTags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"},removeTags:{amenity:"fuel",brand:"Socar","brand:wikidata":"Q1622293","brand:wikipedia":"en:SOCAR",name:"Socar"},matchScore:2,suggestion:true},"amenity/fuel/Sokimex":{name:"Sokimex",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1149575"},addTags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"},removeTags:{amenity:"fuel",brand:"Sokimex","brand:wikidata":"Q1149575","brand:wikipedia":"en:Sokimex",name:"Sokimex"},matchScore:2,suggestion:true},"amenity/fuel/Speedway":{name:"Speedway",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7575683"},addTags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"},removeTags:{amenity:"fuel",brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway"},matchScore:2,suggestion:true},"amenity/fuel/Sprint":{name:"Sprint",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q57588452"},addTags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"},removeTags:{amenity:"fuel",brand:"Sprint","brand:wikidata":"Q57588452",name:"Sprint"},matchScore:2,suggestion:true},"amenity/fuel/St1":{name:"St1",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7592214"},addTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},removeTags:{amenity:"fuel",brand:"St1","brand:wikidata":"Q7592214","brand:wikipedia":"en:St1",name:"St1"},matchScore:2,suggestion:true},"amenity/fuel/Star":{name:"Star",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2031095"},addTags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"},removeTags:{amenity:"fuel",brand:"Star","brand:wikidata":"Q2031095","brand:wikipedia":"de:Orlen Deutschland",name:"Star"},matchScore:2,suggestion:true},"amenity/fuel/Statoil":{name:"Statoil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1776022"},addTags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"},removeTags:{amenity:"fuel",brand:"Statoil","brand:wikidata":"Q1776022","brand:wikipedia":"en:Equinor",name:"Statoil"},matchScore:2,suggestion:true},"amenity/fuel/Super U":{name:"Super U",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2529029"},addTags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"},removeTags:{amenity:"fuel",brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U"},matchScore:2,suggestion:true},"amenity/fuel/Tamoil":{name:"Tamoil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q706793"},addTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},removeTags:{amenity:"fuel",brand:"Tamoil","brand:wikidata":"Q706793","brand:wikipedia":"en:Tamoil",name:"Tamoil"},matchScore:2,suggestion:true},"amenity/fuel/Tanka":{name:"Tanka",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q10690640"},addTags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"},removeTags:{amenity:"fuel",brand:"Tanka","brand:wikidata":"Q10690640","brand:wikipedia":"sv:Tanka (bensinstationskedja)",name:"Tanka"},matchScore:2,suggestion:true},"amenity/fuel/Teboil":{name:"Teboil",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7692079"},addTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},removeTags:{amenity:"fuel",brand:"Teboil","brand:wikidata":"Q7692079","brand:wikipedia":"en:Teboil",name:"Teboil"},matchScore:2,suggestion:true},"amenity/fuel/Terpel":{name:"Terpel",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7703003"},addTags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"},removeTags:{amenity:"fuel",brand:"Terpel","brand:wikidata":"Q7703003","brand:wikipedia":"en:Terpel",name:"Terpel"},matchScore:2,suggestion:true},"amenity/fuel/Uno-X":{name:"Uno-X",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3362746"},addTags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"},removeTags:{amenity:"fuel",brand:"Uno-X","brand:wikidata":"Q3362746","brand:wikipedia":"en:Uno-X",name:"Uno-X"},matchScore:2,suggestion:true},"amenity/fuel/WOG":{name:"WOG",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q12072939"},addTags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"},removeTags:{amenity:"fuel",brand:"WOG","brand:wikidata":"Q12072939","brand:wikipedia":"en:WOG (gas stations)",name:"WOG"},matchScore:2,suggestion:true},"amenity/fuel/Wawa":{name:"Wawa",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5936320"},addTags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"},removeTags:{amenity:"fuel",brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa"},matchScore:2,suggestion:true},"amenity/fuel/Westfalen":{name:"Westfalen",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1411209"},addTags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"},removeTags:{amenity:"fuel",brand:"Westfalen","brand:wikidata":"Q1411209","brand:wikipedia":"en:Westfalen AG",name:"Westfalen"},matchScore:2,suggestion:true},"amenity/fuel/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q5023980"},addTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"},removeTags:{amenity:"fuel",brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol"},matchScore:2,suggestion:true},"amenity/fuel/YPF":{name:"YPF",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2006989"},addTags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"},removeTags:{amenity:"fuel",brand:"YPF","brand:wikidata":"Q2006989","brand:wikipedia":"en:YPF",name:"YPF"},matchScore:2,suggestion:true},"amenity/fuel/bft":{name:"bft",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1009104"},addTags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"},removeTags:{amenity:"fuel",brand:"bft","brand:wikidata":"Q1009104","brand:wikipedia":"de:Bundesverband freier Tankstellen",name:"bft"},matchScore:2,suggestion:true},"amenity/fuel/Башнефть":{name:"Башнефть",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q809985"},addTags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"},removeTags:{amenity:"fuel",brand:"Башнефть","brand:en":"Bashneft","brand:wikidata":"Q809985","brand:wikipedia":"en:Bashneft",name:"Башнефть","name:en":"Bashneft"},matchScore:2,suggestion:true},"amenity/fuel/ОККО":{name:"ОККО",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q7072617"},addTags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"},removeTags:{amenity:"fuel",brand:"ОККО","brand:en":"OKKO","brand:wikidata":"Q7072617","brand:wikipedia":"en:OKKO",name:"ОККО","name:en":"OKKO"},matchScore:2,suggestion:true},"amenity/fuel/ПТК":{name:"ПТК",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q4360193"},addTags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"},removeTags:{amenity:"fuel",brand:"ПТК","brand:en":"The Petersburg Fuel Company","brand:wikidata":"Q4360193","brand:wikipedia":"en:Petersburg Fuel Company",name:"ПТК","name:en":"The Petersburg Fuel Company"},matchScore:2,suggestion:true},"amenity/fuel/Роснефть":{name:"Роснефть",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1141123"},addTags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"},removeTags:{amenity:"fuel",brand:"Роснефть","brand:en":"Rosneft","brand:wikidata":"Q1141123","brand:wikipedia":"en:Rosneft",name:"Роснефть","name:en":"Rosneft"},matchScore:2,suggestion:true},"amenity/fuel/Сургутнефтегаз":{name:"Сургутнефтегаз",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q680776"},addTags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"},removeTags:{amenity:"fuel",brand:"Сургутнефтегаз","brand:en":"Surgutneftegas","brand:wikidata":"Q680776","brand:wikipedia":"en:Surgutneftegas",name:"Сургутнефтегаз","name:en":"Surgutneftegas"},matchScore:2,suggestion:true},"amenity/fuel/ТНК":{name:"ТНК",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2298901"},addTags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"},removeTags:{amenity:"fuel",brand:"ТНК","brand:wikidata":"Q2298901","brand:wikipedia":"en:TNK-BP",name:"ТНК"},matchScore:2,suggestion:true},"amenity/fuel/Татнефть":{name:"Татнефть",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1616858"},addTags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"},removeTags:{amenity:"fuel",brand:"Татнефть","brand:en":"Tatneft","brand:wikidata":"Q1616858","brand:wikipedia":"en:Tatneft",name:"Татнефть","name:en":"Tatneft"},matchScore:2,suggestion:true},"amenity/fuel/Укрнафта":{name:"Укрнафта",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2447961"},addTags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"},removeTags:{amenity:"fuel",brand:"Укрнафта","brand:en":"Ukrnafta","brand:wikidata":"Q2447961","brand:wikipedia":"en:Ukrnafta",name:"Укрнафта","name:en":"Ukrnafta"},matchScore:2,suggestion:true},"amenity/fuel/סונול":{name:"סונול",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q3701622"},addTags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol"},removeTags:{amenity:"fuel",brand:"סונול","brand:en":"Sonol","brand:wikidata":"Q3701622","brand:wikipedia":"en:Sonol",name:"סונול","name:en":"Sonol"},matchScore:2,suggestion:true},"amenity/fuel/เอสโซ่":{name:"เอสโซ่",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso"},removeTags:{amenity:"fuel",brand:"เอสโซ่","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"เอสโซ่","name:en":"Esso"},matchScore:2,suggestion:true},"amenity/fuel/エッソ":{name:"エッソ",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q867662"},addTags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso"},removeTags:{amenity:"fuel",brand:"エッソ","brand:en":"Esso","brand:wikidata":"Q867662","brand:wikipedia":"en:Esso",name:"エッソ","name:en":"Esso"},matchScore:2,suggestion:true},"amenity/fuel/エネオス":{name:"エネオス",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q1640290"},addTags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy"},removeTags:{amenity:"fuel",brand:"エネオス","brand:en":"JXTG Nippon Oil & Energy","brand:wikidata":"Q1640290","brand:wikipedia":"en:JXTG Nippon Oil & Energy",name:"エネオス","name:en":"JXTG Nippon Oil & Energy"},matchScore:2,suggestion:true},"amenity/fuel/コスモ石油":{name:"コスモ石油",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2498318"},addTags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company"},removeTags:{amenity:"fuel",brand:"コスモ石油","brand:en":"Cosmo Oil Company","brand:wikidata":"Q2498318","brand:wikipedia":"en:Cosmo Oil Company",name:"コスモ石油","name:en":"Cosmo Oil Company"},matchScore:2,suggestion:true},"amenity/fuel/中国石化":{name:"中国石化",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q831445"},addTags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"},removeTags:{amenity:"fuel",brand:"中国石化","brand:en":"Sinopec","brand:wikidata":"Q831445","brand:wikipedia":"en:Sinopec",name:"中国石化","name:en":"Sinopec"},matchScore:2,suggestion:true},"amenity/fuel/中国石油":{name:"中国石油",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q503182"},addTags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"},removeTags:{amenity:"fuel",brand:"中国石油","brand:en":"PetroChina","brand:wikidata":"Q503182","brand:wikipedia":"en:PetroChina",name:"中国石油","name:en":"PetroChina"},matchScore:2,suggestion:true},"amenity/fuel/出光":{name:"出光",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q2216770"},addTags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"},removeTags:{amenity:"fuel",brand:"出光","brand:en":"Idemitsu Kosan","brand:wikidata":"Q2216770","brand:wikipedia":"en:Idemitsu Kosan",name:"出光","name:en":"Idemitsu Kosan"},matchScore:2,suggestion:true},"amenity/fuel/台灣中油":{name:"台灣中油",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q21527177"},addTags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation",name:"台灣中油","name:en":"CPC Corporation, Taiwan"},removeTags:{amenity:"fuel",brand:"台灣中油","brand:en":"CPC Corporation, Taiwan","brand:wikidata":"Q21527177","brand:wikipedia":"en:CPC Corporation",name:"台灣中油","name:en":"CPC Corporation, Taiwan"},matchScore:2,suggestion:true},"amenity/fuel/昭和シェル":{name:"昭和シェル",icon:"maki-fuel",fields:["name","brand","operator","address","fuel_multi","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"fuel","brand:wikidata":"Q277115"},addTags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu"},removeTags:{amenity:"fuel",brand:"昭和シェル","brand:en":"Showa Shell Sekiyu","brand:wikidata":"Q277115","brand:wikipedia":"en:Showa Shell Sekiyu",name:"昭和シェル","name:en":"Showa Shell Sekiyu"},matchScore:2,suggestion:true},"amenity/ice_cream/Baskin-Robbins":{name:"Baskin-Robbins",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q584601"},addTags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"},removeTags:{amenity:"ice_cream",brand:"Baskin-Robbins","brand:wikidata":"Q584601","brand:wikipedia":"en:Baskin-Robbins",cuisine:"ice_cream",name:"Baskin-Robbins"},matchScore:2,suggestion:true},"amenity/ice_cream/Ben & Jerry's":{name:"Ben & Jerry's",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q816412"},addTags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"},removeTags:{amenity:"ice_cream",brand:"Ben & Jerry's","brand:wikidata":"Q816412","brand:wikipedia":"en:Ben & Jerry's",cuisine:"ice_cream",name:"Ben & Jerry's"},matchScore:2,suggestion:true},"amenity/ice_cream/Cold Stone Creamery":{name:"Cold Stone Creamery",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q1094923"},addTags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"},removeTags:{amenity:"ice_cream",brand:"Cold Stone Creamery","brand:wikidata":"Q1094923","brand:wikipedia":"en:Cold Stone Creamery",cuisine:"ice_cream",name:"Cold Stone Creamery"},matchScore:2,suggestion:true},"amenity/ice_cream/Freddo":{name:"Freddo",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q28823999"},addTags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"},removeTags:{amenity:"ice_cream",brand:"Freddo","brand:wikidata":"Q28823999","brand:wikipedia":"es:Freddo",cuisine:"ice_cream",name:"Freddo"},matchScore:2,suggestion:true},"amenity/ice_cream/Grido":{name:"Grido",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q5885724"},addTags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"},removeTags:{amenity:"ice_cream",brand:"Grido","brand:wikidata":"Q5885724","brand:wikipedia":"es:Grido Helado",cuisine:"ice_cream",name:"Grido"},matchScore:2,suggestion:true},"amenity/ice_cream/sweetFrog":{name:"sweetFrog",icon:"maki-ice-cream",fields:["name","address","building_area","opening_hours","takeaway","delivery","outdoor_seating"],geometry:["point","area"],tags:{amenity:"ice_cream","brand:wikidata":"Q16952110"},addTags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"},removeTags:{amenity:"ice_cream",brand:"sweetFrog","brand:wikidata":"Q16952110","brand:wikipedia":"en:Sweet Frog",cuisine:"frozen_yogurt",name:"sweetFrog"},matchScore:2,suggestion:true},"amenity/money_transfer/Express Union":{name:"Express Union",icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],tags:{amenity:"money_transfer","brand:wikidata":"Q3062276"},addTags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"},removeTags:{amenity:"money_transfer",brand:"Express Union","brand:wikidata":"Q3062276","brand:wikipedia":"fr:Express Union",name:"Express Union"},matchScore:2,suggestion:true},"amenity/money_transfer/Western Union":{name:"Western Union",icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],tags:{amenity:"money_transfer","brand:wikidata":"Q861042"},addTags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},removeTags:{amenity:"money_transfer",brand:"Western Union","brand:wikidata":"Q861042","brand:wikipedia":"en:Western Union",name:"Western Union"},matchScore:2,suggestion:true},"amenity/payment_centre/Rapipago":{name:"Rapipago",icon:"maki-bank",fields:["name","brand","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{amenity:"payment_centre","brand:wikidata":"Q6100413"},addTags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"},removeTags:{amenity:"payment_centre",brand:"Rapipago","brand:wikidata":"Q6100413","brand:wikipedia":"es:Rapipago",name:"Rapipago"},matchScore:2,suggestion:true},"amenity/payment_terminal/Qiwi":{name:"Qiwi",icon:"maki-bank",fields:["name","brand","address","opening_hours","payment_multi"],geometry:["point"],tags:{amenity:"payment_terminal","brand:wikidata":"Q4047736"},addTags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"},removeTags:{amenity:"payment_terminal",brand:"Qiwi","brand:wikidata":"Q4047736","brand:wikipedia":"en:Qiwi",name:"Qiwi"},matchScore:2,suggestion:true},"amenity/pharmacy/Apotek Hjärtat":{name:"Apotek Hjärtat",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q10416114"},addTags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"},removeTags:{amenity:"pharmacy",brand:"Apotek Hjärtat","brand:wikidata":"Q10416114","brand:wikipedia":"sv:Apotek Hjärtat",healthcare:"pharmacy",name:"Apotek Hjärtat"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Bartell Drugs":{name:"Bartell Drugs",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q4865152"},addTags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"},removeTags:{amenity:"pharmacy",brand:"Bartell Drugs","brand:wikidata":"Q4865152","brand:wikipedia":"en:Bartell Drugs",healthcare:"pharmacy",name:"Bartell Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Chemist Warehouse":{name:"Chemist Warehouse",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q48782120"},addTags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"},removeTags:{amenity:"pharmacy",brand:"Chemist Warehouse","brand:wikidata":"Q48782120","brand:wikipedia":"en:Chemist Warehouse",healthcare:"pharmacy",name:"Chemist Warehouse"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Costco Pharmacy":{name:"Costco Pharmacy",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q715583"},addTags:{amenity:"pharmacy",healthcare:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Pharmacy"},removeTags:{amenity:"pharmacy",healthcare:"pharmacy",brand:"Costco Pharmacy","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Drogaria São Paulo":{name:"Drogaria São Paulo",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5308184"},addTags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"},removeTags:{amenity:"pharmacy",brand:"Drogaria São Paulo","brand:wikidata":"Q5308184","brand:wikipedia":"en:Grupo DPSP",healthcare:"pharmacy",name:"Drogaria São Paulo"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Duane Reade":{name:"Duane Reade",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5310380"},addTags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"},removeTags:{amenity:"pharmacy",brand:"Duane Reade","brand:wikidata":"Q5310380","brand:wikipedia":"en:Duane Reade",healthcare:"pharmacy",name:"Duane Reade"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Eurovaistinė":{name:"Eurovaistinė",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q267205"},addTags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"},removeTags:{amenity:"pharmacy",brand:"Eurovaistinė","brand:wikidata":"Q267205","brand:wikipedia":"en:Euroapotheca",healthcare:"pharmacy",name:"Eurovaistinė"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Familiprix":{name:"Familiprix",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3064881"},addTags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"},removeTags:{amenity:"pharmacy",brand:"Familiprix","brand:wikidata":"Q3064881","brand:wikipedia":"en:Familiprix",healthcare:"pharmacy",name:"Familiprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Farmacia Guadalajara":{name:"Farmacia Guadalajara",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q5435609"},addTags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"},removeTags:{amenity:"pharmacy",brand:"Farmacia Guadalajara","brand:wikidata":"Q5435609","brand:wikipedia":"en:Farmacias Guadalajara",healthcare:"pharmacy",name:"Farmacia Guadalajara"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Gintarinė vaistinė":{name:"Gintarinė vaistinė",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q15857801"},addTags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"},removeTags:{amenity:"pharmacy",brand:"Gintarinė vaistinė","brand:wikidata":"Q15857801","brand:wikipedia":"lt:Gintarinė vaistinė",healthcare:"pharmacy",name:"Gintarinė vaistinė"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Jean Coutu":{name:"Jean Coutu",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3117457"},addTags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"},removeTags:{amenity:"pharmacy",brand:"Jean Coutu","brand:wikidata":"Q3117457","brand:wikipedia":"en:Jean Coutu Group",healthcare:"pharmacy",name:"Jean Coutu"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Kimia Farma":{name:"Kimia Farma",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q11264892"},addTags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"},removeTags:{amenity:"pharmacy",brand:"Kimia Farma","brand:wikidata":"Q11264892","brand:wikipedia":"en:Kimia Farma",healthcare:"pharmacy",name:"Kimia Farma"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Kinney Drugs":{name:"Kinney Drugs",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6414090"},addTags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"},removeTags:{amenity:"pharmacy",brand:"Kinney Drugs","brand:wikidata":"Q6414090","brand:wikipedia":"en:Kinney Drugs",healthcare:"pharmacy",name:"Kinney Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Lloyds Pharmacy":{name:"Lloyds Pharmacy",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6662870"},addTags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Lloyds Pharmacy","brand:wikidata":"Q6662870","brand:wikipedia":"en:LloydsPharmacy",healthcare:"pharmacy",name:"Lloyds Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/London Drugs":{name:"London Drugs",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q3258955"},addTags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"},removeTags:{amenity:"pharmacy",brand:"London Drugs","brand:wikidata":"Q3258955","brand:wikipedia":"en:London Drugs",healthcare:"pharmacy",name:"London Drugs"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Mercury Drug":{name:"Mercury Drug",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q6818610"},addTags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"},removeTags:{amenity:"pharmacy",brand:"Mercury Drug","brand:wikidata":"Q6818610","brand:wikipedia":"en:Mercury Drug",healthcare:"pharmacy",name:"Mercury Drug"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pague Menos":{name:"Pague Menos",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7124466"},addTags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"},removeTags:{amenity:"pharmacy",brand:"Pague Menos","brand:wikidata":"Q7124466","brand:wikipedia":"pt:Pague Menos",healthcare:"pharmacy",name:"Pague Menos"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pharmaprix":{name:"Pharmaprix",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1820137"},addTags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"},removeTags:{amenity:"pharmacy",brand:"Pharmaprix","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Pharmaprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Pharmasave":{name:"Pharmasave",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q17093822"},addTags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"},removeTags:{amenity:"pharmacy",brand:"Pharmasave","brand:wikidata":"Q17093822","brand:wikipedia":"en:Pharmasave",healthcare:"pharmacy",name:"Pharmasave"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Rexall":{name:"Rexall",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7319360"},addTags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"},removeTags:{amenity:"pharmacy",brand:"Rexall","brand:wikidata":"Q7319360","brand:wikipedia":"en:Rexall",healthcare:"pharmacy",name:"Rexall"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Shoppers Drug Mart":{name:"Shoppers Drug Mart",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1820137"},addTags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"},removeTags:{amenity:"pharmacy",brand:"Shoppers Drug Mart","brand:wikidata":"Q1820137","brand:wikipedia":"en:Shoppers Drug Mart",healthcare:"pharmacy",name:"Shoppers Drug Mart"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/South Star Drug":{name:"South Star Drug",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7568544"},addTags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"},removeTags:{amenity:"pharmacy",brand:"South Star Drug","brand:wikidata":"Q7568544","brand:wikipedia":"en:South Star Drug",healthcare:"pharmacy",name:"South Star Drug"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Uniprix":{name:"Uniprix",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q683265"},addTags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"},removeTags:{amenity:"pharmacy",brand:"Uniprix","brand:wikidata":"Q683265","brand:wikipedia":"en:Uniprix",healthcare:"pharmacy",name:"Uniprix"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Walgreens":{name:"Walgreens",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q1591889"},addTags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"},removeTags:{amenity:"pharmacy",brand:"Walgreens","brand:wikidata":"Q1591889","brand:wikipedia":"en:Walgreens",healthcare:"pharmacy",name:"Walgreens"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Walmart Pharmacy":{name:"Walmart Pharmacy",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q483551"},addTags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},removeTags:{amenity:"pharmacy",brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",healthcare:"pharmacy",name:"Walmart Pharmacy",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/pharmacy/Well Pharmacy":{name:"Well Pharmacy",icon:"maki-pharmacy",fields:["name","operator","address","building_area","drive_through","opening_hours","payment_multi","dispensing"],geometry:["point","area"],tags:{amenity:"pharmacy","brand:wikidata":"Q7726524"},addTags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"},removeTags:{amenity:"pharmacy",brand:"Well Pharmacy","brand:wikidata":"Q7726524","brand:wikipedia":"en:Well Pharmacy",healthcare:"pharmacy",name:"Well Pharmacy"},reference:{key:"amenity",value:"pharmacy"},matchScore:2,suggestion:true},"amenity/post_box/Deutsche Post":{name:"Deutsche Post",icon:"maki-post",fields:["operator","collection_times","drive_through","ref"],geometry:["point","vertex"],tags:{amenity:"post_box","brand:wikidata":"Q157645"},addTags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},removeTags:{amenity:"post_box",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},matchScore:2,suggestion:true},"amenity/post_box/USPS":{name:"USPS",icon:"maki-post",fields:["operator","collection_times","drive_through","ref"],geometry:["point","vertex"],tags:{amenity:"post_box","brand:wikidata":"Q668687"},addTags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS",operator:"USPS"},removeTags:{amenity:"post_box",brand:"USPS","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"USPS",operator:"USPS"},matchScore:2,suggestion:true},"amenity/post_office/Australia Post":{name:"Australia Post",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1142936"},addTags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"},removeTags:{amenity:"post_office",brand:"Australia Post","brand:wikidata":"Q1142936","brand:wikipedia":"en:Australia Post",name:"Australia Post"},matchScore:2,suggestion:true},"amenity/post_office/CTT":{name:"CTT",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q909429"},addTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},removeTags:{amenity:"post_office",brand:"CTT","brand:wikidata":"Q909429","brand:wikipedia":"en:CTT (Macau)",name:"CTT"},matchScore:2,suggestion:true},"amenity/post_office/Canada Post":{name:"Canada Post",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1032001"},addTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},removeTags:{amenity:"post_office",brand:"Canada Post","brand:wikidata":"Q1032001","brand:wikipedia":"en:Canada Post",name:"Canada Post"},matchScore:2,suggestion:true},"amenity/post_office/Correios":{name:"Correios",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q3375004"},addTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},removeTags:{amenity:"post_office",brand:"Correios","brand:wikidata":"Q3375004","brand:wikipedia":"en:Correios",name:"Correios"},matchScore:2,suggestion:true},"amenity/post_office/Correo Argentino":{name:"Correo Argentino",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q4036566"},addTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},removeTags:{amenity:"post_office",brand:"Correo Argentino","brand:wikidata":"Q4036566","brand:wikipedia":"en:Correo Argentino",name:"Correo Argentino"},matchScore:2,suggestion:true},"amenity/post_office/Correos de Chile":{name:"Correos de Chile",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q5172893"},addTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},removeTags:{amenity:"post_office",brand:"Correos de Chile","brand:wikidata":"Q5172893","brand:wikipedia":"en:Correos de Chile",name:"Correos de Chile"},matchScore:2,suggestion:true},"amenity/post_office/Correos de Costa Rica":{name:"Correos de Costa Rica",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q5172894"},addTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},removeTags:{amenity:"post_office",brand:"Correos de Costa Rica","brand:wikidata":"Q5172894","brand:wikipedia":"en:Correos de Costa Rica",name:"Correos de Costa Rica"},matchScore:2,suggestion:true},"amenity/post_office/DHL":{name:"DHL",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q489815"},addTags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL",operator:"DHL"},removeTags:{amenity:"post_office",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL",operator:"DHL"},matchScore:2,suggestion:true},"amenity/post_office/DPD Paketshop":{name:"DPD Paketshop",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q541030"},addTags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"},removeTags:{amenity:"post_office",brand:"DPD Paketshop","brand:wikidata":"Q541030","brand:wikipedia":"en:DPDgroup",name:"DPD Paketshop"},matchScore:2,suggestion:true},"amenity/post_office/Deutsche Post":{name:"Deutsche Post",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q157645"},addTags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},removeTags:{amenity:"post_office",brand:"Deutsche Post","brand:wikidata":"Q157645","brand:wikipedia":"en:Deutsche Post",name:"Deutsche Post"},matchScore:2,suggestion:true},"amenity/post_office/Fancourier":{name:"Fancourier",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q12727984"},addTags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"},removeTags:{amenity:"post_office",brand:"Fancourier","brand:wikidata":"Q12727984","brand:wikipedia":"ro:FAN Courier Express",name:"Fancourier"},matchScore:2,suggestion:true},"amenity/post_office/FedEx":{name:"FedEx",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q459477"},addTags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},removeTags:{amenity:"post_office",brand:"FedEx","brand:wikidata":"Q459477","brand:wikipedia":"en:FedEx",name:"FedEx"},matchScore:2,suggestion:true},"amenity/post_office/Hermes Paketshop":{name:"Hermes Paketshop",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1613532"},addTags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"},removeTags:{amenity:"post_office",brand:"Hermes Paketshop","brand:wikidata":"Q1613532","brand:wikipedia":"en:Hermes Group",name:"Hermes Paketshop"},matchScore:2,suggestion:true},"amenity/post_office/LBC":{name:"LBC",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q17075584"},addTags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"},removeTags:{amenity:"post_office",brand:"LBC","brand:wikidata":"Q17075584","brand:wikipedia":"en:LBC Express",name:"LBC"},matchScore:2,suggestion:true},"amenity/post_office/La Poste":{name:"La Poste",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q373724"},addTags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"},removeTags:{amenity:"post_office",brand:"La Poste","brand:wikidata":"Q373724","brand:wikipedia":"fr:La Poste (entreprise française)",name:"La Poste"},matchScore:2,suggestion:true},"amenity/post_office/MRW":{name:"MRW",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q23767821"},addTags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"},removeTags:{amenity:"post_office",brand:"MRW","brand:wikidata":"Q23767821","brand:wikipedia":"es:MRW",name:"MRW"},matchScore:2,suggestion:true},"amenity/post_office/Oficina de Correos":{name:"Oficina de Correos",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q776605"},addTags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"},removeTags:{amenity:"post_office",brand:"Oficina de Correos","brand:wikidata":"Q776605","brand:wikipedia":"es:Correos (España)",name:"Oficina de Correos"},matchScore:2,suggestion:true},"amenity/post_office/Poczta Polska":{name:"Poczta Polska",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q168833"},addTags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"en:Poczta Polska",name:"Poczta Polska"},removeTags:{amenity:"post_office",brand:"Poczta Polska","brand:wikidata":"Q168833","brand:wikipedia":"en:Poczta Polska",name:"Poczta Polska"},matchScore:2,suggestion:true},"amenity/post_office/Poste Italiane":{name:"Poste Italiane",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q495026"},addTags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"},removeTags:{amenity:"post_office",brand:"Poste Italiane","brand:wikidata":"Q495026","brand:wikipedia":"en:Poste italiane",name:"Poste Italiane"},matchScore:2,suggestion:true},"amenity/post_office/Slovenská pošta":{name:"Slovenská pošta",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1191849"},addTags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"},removeTags:{amenity:"post_office",brand:"Slovenská pošta","brand:wikidata":"Q1191849","brand:wikipedia":"en:Slovenská pošta",name:"Slovenská pošta"},matchScore:2,suggestion:true},"amenity/post_office/The UPS Store":{name:"The UPS Store",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q7771029"},addTags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store"},removeTags:{amenity:"post_office",brand:"The UPS Store","brand:wikidata":"Q7771029","brand:wikipedia":"en:The UPS Store",name:"The UPS Store"},matchScore:2,suggestion:true},"amenity/post_office/US Post Office":{name:"US Post Office",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q668687"},addTags:{amenity:"post_office",brand:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"},removeTags:{amenity:"post_office",brand:"US Post Office","brand:wikidata":"Q668687","brand:wikipedia":"en:United States Postal Service",name:"US Post Office",operator:"USPS"},matchScore:2,suggestion:true},"amenity/post_office/ΕΛΤΑ":{name:"ΕΛΤΑ",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1275135"},addTags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"},removeTags:{amenity:"post_office",brand:"ΕΛΤΑ","brand:wikidata":"Q1275135","brand:wikipedia":"el:Ελληνικά Ταχυδρομεία",name:"ΕΛΤΑ"},matchScore:2,suggestion:true},"amenity/post_office/中国邮政":{name:"中国邮政",icon:"maki-post",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"post_office","brand:wikidata":"Q1066476"},addTags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"},removeTags:{amenity:"post_office",brand:"中国邮政","brand:en":"China Post","brand:wikidata":"Q1066476","brand:wikipedia":"en:China Post",name:"中国邮政","name:en":"China Post"},matchScore:2,suggestion:true},"amenity/public_bookcase/Little Free Library":{name:"Little Free Library",icon:"maki-library",fields:["name","operator","capacity","website"],geometry:["point","area"],tags:{amenity:"public_bookcase","brand:wikidata":"Q6650101"},addTags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"},removeTags:{amenity:"public_bookcase",brand:"Little Free Library","brand:wikidata":"Q6650101","brand:wikipedia":"en:Little Free Library",name:"Little Free Library"},matchScore:2,suggestion:true},"amenity/restaurant/100 Montaditos":{name:"100 Montaditos",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q8355805"},addTags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",name:"100 Montaditos"},removeTags:{amenity:"restaurant",brand:"100 Montaditos","brand:wikidata":"Q8355805","brand:wikipedia":"en:Cervecería 100 Montaditos",name:"100 Montaditos"},matchScore:2,suggestion:true},"amenity/restaurant/Applebee’s Neighborhood Grill & Bar":{name:"Applebee’s Neighborhood Grill & Bar",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q621532"},addTags:{amenity:"restaurant",brand:"Applebee’s Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee’s Neighborhood Grill & Bar"},removeTags:{amenity:"restaurant",brand:"Applebee’s Neighborhood Grill & Bar","brand:wikidata":"Q621532","brand:wikipedia":"en:Applebee's",cuisine:"american",name:"Applebee’s Neighborhood Grill & Bar"},matchScore:2,suggestion:true},"amenity/restaurant/Autogrill":{name:"Autogrill",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q786790"},addTags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"},removeTags:{amenity:"restaurant",brand:"Autogrill","brand:wikidata":"Q786790","brand:wikipedia":"en:Autogrill",name:"Autogrill"},matchScore:2,suggestion:true},"amenity/restaurant/Bella Italia":{name:"Bella Italia",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4883362"},addTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",name:"Bella Italia"},removeTags:{amenity:"restaurant",brand:"Bella Italia","brand:wikidata":"Q4883362","brand:wikipedia":"en:Bella Italia",name:"Bella Italia"},matchScore:2,suggestion:true},"amenity/restaurant/Big Boy":{name:"Big Boy",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4386779"},addTags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"Big Boy"},removeTags:{amenity:"restaurant",brand:"Big Boy","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"Big Boy"},matchScore:2,suggestion:true},"amenity/restaurant/Black Bear Diner":{name:"Black Bear Diner",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4920343"},addTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",name:"Black Bear Diner"},removeTags:{amenity:"restaurant",brand:"Black Bear Diner","brand:wikidata":"Q4920343","brand:wikipedia":"en:Black Bear Diner",name:"Black Bear Diner"},matchScore:2,suggestion:true},"amenity/restaurant/Bob Evans":{name:"Bob Evans",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4932385"},addTags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932385","brand:wikipedia":"en:Bob Evans (restaurateur)",name:"Bob Evans"},removeTags:{amenity:"restaurant",brand:"Bob Evans","brand:wikidata":"Q4932385","brand:wikipedia":"en:Bob Evans (restaurateur)",name:"Bob Evans"},matchScore:2,suggestion:true},"amenity/restaurant/Bonefish Grill":{name:"Bonefish Grill",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4941599"},addTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",name:"Bonefish Grill"},removeTags:{amenity:"restaurant",brand:"Bonefish Grill","brand:wikidata":"Q4941599","brand:wikipedia":"en:Bonefish Grill",name:"Bonefish Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Boston Pizza":{name:"Boston Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q894578"},addTags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"},removeTags:{amenity:"restaurant",brand:"Boston Pizza","brand:wikidata":"Q894578","brand:wikipedia":"en:Boston Pizza",cuisine:"pizza",name:"Boston Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Grill":{name:"Buffalo Grill",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q944655"},addTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",name:"Buffalo Grill"},removeTags:{amenity:"restaurant",brand:"Buffalo Grill","brand:wikidata":"Q944655","brand:wikipedia":"en:Buffalo Grill",name:"Buffalo Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Buffalo Wild Wings":{name:"Buffalo Wild Wings",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q509255"},addTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",name:"Buffalo Wild Wings"},removeTags:{amenity:"restaurant",brand:"Buffalo Wild Wings","brand:wikidata":"Q509255","brand:wikipedia":"en:Buffalo Wild Wings",name:"Buffalo Wild Wings"},matchScore:2,suggestion:true},"amenity/restaurant/Cafe Rio":{name:"Cafe Rio",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5017108"},addTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",name:"Cafe Rio"},removeTags:{amenity:"restaurant",brand:"Cafe Rio","brand:wikidata":"Q5017108","brand:wikipedia":"en:Cafe Rio",name:"Cafe Rio"},matchScore:2,suggestion:true},"amenity/restaurant/California Pizza Kitchen":{name:"California Pizza Kitchen",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q15109854"},addTags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"},removeTags:{amenity:"restaurant",brand:"California Pizza Kitchen","brand:wikidata":"Q15109854","brand:wikipedia":"en:California Pizza Kitchen",cuisine:"pizza",name:"California Pizza Kitchen"},matchScore:2,suggestion:true},"amenity/restaurant/Carluccio's":{name:"Carluccio's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q25111797"},addTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",name:"Carluccio's"},removeTags:{amenity:"restaurant",brand:"Carluccio's","brand:wikidata":"Q25111797","brand:wikipedia":"en:Carluccio's Ltd",name:"Carluccio's"},matchScore:2,suggestion:true},"amenity/restaurant/Carrabba's Italian Grill":{name:"Carrabba's Italian Grill",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5045999"},addTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",name:"Carrabba's Italian Grill"},removeTags:{amenity:"restaurant",brand:"Carrabba's Italian Grill","brand:wikidata":"Q5045999","brand:wikipedia":"en:Carrabba's Italian Grill",name:"Carrabba's Italian Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Cheesecake Factory":{name:"Cheesecake Factory",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1045842"},addTags:{amenity:"restaurant",brand:"Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",name:"Cheesecake Factory"},removeTags:{amenity:"restaurant",brand:"Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",name:"Cheesecake Factory"},matchScore:2,suggestion:true},"amenity/restaurant/Chili's":{name:"Chili's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1072948"},addTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",name:"Chili's"},removeTags:{amenity:"restaurant",brand:"Chili's","brand:wikidata":"Q1072948","brand:wikipedia":"en:Chili's",name:"Chili's"},matchScore:2,suggestion:true},"amenity/restaurant/Chiquito":{name:"Chiquito",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5101775"},addTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",name:"Chiquito"},removeTags:{amenity:"restaurant",brand:"Chiquito","brand:wikidata":"Q5101775","brand:wikipedia":"en:Chiquito (restaurant)",name:"Chiquito"},matchScore:2,suggestion:true},"amenity/restaurant/Chuck E. Cheese's":{name:"Chuck E. Cheese's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2438391"},addTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},removeTags:{amenity:"restaurant",brand:"Chuck E. Cheese's","brand:wikidata":"Q2438391","brand:wikipedia":"en:Chuck E. Cheese's",cuisine:"pizza",name:"Chuck E. Cheese's"},matchScore:2,suggestion:true},"amenity/restaurant/Cici's Pizza":{name:"Cici's Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2972189"},addTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza",name:"Cici's Pizza"},removeTags:{amenity:"restaurant",brand:"Cici's Pizza","brand:wikidata":"Q2972189","brand:wikipedia":"en:Cicis",cuisine:"pizza",name:"Cici's Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Cracker Barrel":{name:"Cracker Barrel",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4492609"},addTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",name:"Cracker Barrel"},removeTags:{amenity:"restaurant",brand:"Cracker Barrel","brand:wikidata":"Q4492609","brand:wikipedia":"en:Cracker Barrel",name:"Cracker Barrel"},matchScore:2,suggestion:true},"amenity/restaurant/Denny's":{name:"Denny's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1189695"},addTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",name:"Denny's"},removeTags:{amenity:"restaurant",brand:"Denny's","brand:wikidata":"Q1189695","brand:wikipedia":"en:Denny's",name:"Denny's"},matchScore:2,suggestion:true},"amenity/restaurant/Dickey's Barbecue Pit":{name:"Dickey's Barbecue Pit",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q19880747"},addTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",name:"Dickey's Barbecue Pit"},removeTags:{amenity:"restaurant",brand:"Dickey's Barbecue Pit","brand:wikidata":"Q19880747","brand:wikipedia":"en:Dickey's Barbecue Pit",name:"Dickey's Barbecue Pit"},matchScore:2,suggestion:true},"amenity/restaurant/East Side Mario's":{name:"East Side Mario's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5329375"},addTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",name:"East Side Mario's"},removeTags:{amenity:"restaurant",brand:"East Side Mario's","brand:wikidata":"Q5329375","brand:wikipedia":"en:East Side Mario's",name:"East Side Mario's"},matchScore:2,suggestion:true},"amenity/restaurant/Famous Dave's":{name:"Famous Dave's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5433448"},addTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",name:"Famous Dave's"},removeTags:{amenity:"restaurant",brand:"Famous Dave's","brand:wikidata":"Q5433448","brand:wikipedia":"en:Famous Dave's",name:"Famous Dave's"},matchScore:2,suggestion:true},"amenity/restaurant/Flunch":{name:"Flunch",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q629326"},addTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",name:"Flunch"},removeTags:{amenity:"restaurant",brand:"Flunch","brand:wikidata":"Q629326","brand:wikipedia":"en:Flunch",name:"Flunch"},matchScore:2,suggestion:true},"amenity/restaurant/Foster's Hollywood":{name:"Foster's Hollywood",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5864366"},addTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",name:"Foster's Hollywood"},removeTags:{amenity:"restaurant",brand:"Foster's Hollywood","brand:wikidata":"Q5864366","brand:wikipedia":"en:Foster's Hollywood",name:"Foster's Hollywood"},matchScore:2,suggestion:true},"amenity/restaurant/Frankie & Benny's":{name:"Frankie & Benny's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5490892"},addTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",name:"Frankie & Benny's"},removeTags:{amenity:"restaurant",brand:"Frankie & Benny's","brand:wikidata":"Q5490892","brand:wikipedia":"en:Frankie & Benny's",name:"Frankie & Benny's"},matchScore:2,suggestion:true},"amenity/restaurant/Friendly's":{name:"Friendly's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1464513"},addTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",name:"Friendly's"},removeTags:{amenity:"restaurant",brand:"Friendly's","brand:wikidata":"Q1464513","brand:wikipedia":"en:Friendly's",name:"Friendly's"},matchScore:2,suggestion:true},"amenity/restaurant/Fuddruckers":{name:"Fuddruckers",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5507056"},addTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",name:"Fuddruckers"},removeTags:{amenity:"restaurant",brand:"Fuddruckers","brand:wikidata":"Q5507056","brand:wikipedia":"en:Fuddruckers",name:"Fuddruckers"},matchScore:2,suggestion:true},"amenity/restaurant/Golden Corral":{name:"Golden Corral",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4039560"},addTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",name:"Golden Corral"},removeTags:{amenity:"restaurant",brand:"Golden Corral","brand:wikidata":"Q4039560","brand:wikipedia":"en:Golden Corral",name:"Golden Corral"},matchScore:2,suggestion:true},"amenity/restaurant/Gourmet Burger Kitchen":{name:"Gourmet Burger Kitchen",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5588445"},addTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",name:"Gourmet Burger Kitchen"},removeTags:{amenity:"restaurant",brand:"Gourmet Burger Kitchen","brand:wikidata":"Q5588445","brand:wikipedia":"en:Gourmet Burger Kitchen",name:"Gourmet Burger Kitchen"},matchScore:2,suggestion:true},"amenity/restaurant/Hard Rock Cafe":{name:"Hard Rock Cafe",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q918151"},addTags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",name:"Hard Rock Cafe"},removeTags:{amenity:"restaurant",brand:"Hard Rock Cafe","brand:wikidata":"Q918151","brand:wikipedia":"en:Hard Rock Cafe",name:"Hard Rock Cafe"},matchScore:2,suggestion:true},"amenity/restaurant/Harvester":{name:"Harvester",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5676915"},addTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",name:"Harvester"},removeTags:{amenity:"restaurant",brand:"Harvester","brand:wikidata":"Q5676915","brand:wikipedia":"en:Harvester (restaurant)",name:"Harvester"},matchScore:2,suggestion:true},"amenity/restaurant/Hippopotamus":{name:"Hippopotamus",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3136174"},addTags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",name:"Hippopotamus"},removeTags:{amenity:"restaurant",brand:"Hippopotamus","brand:wikidata":"Q3136174","brand:wikipedia":"fr:Hippopotamus (restaurant)",name:"Hippopotamus"},matchScore:2,suggestion:true},"amenity/restaurant/Hooters":{name:"Hooters",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1025921"},addTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",name:"Hooters"},removeTags:{amenity:"restaurant",brand:"Hooters","brand:wikidata":"Q1025921","brand:wikipedia":"en:Hooters",name:"Hooters"},matchScore:2,suggestion:true},"amenity/restaurant/Huddle House":{name:"Huddle House",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5928324"},addTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",name:"Huddle House"},removeTags:{amenity:"restaurant",brand:"Huddle House","brand:wikidata":"Q5928324","brand:wikipedia":"en:Huddle House",name:"Huddle House"},matchScore:2,suggestion:true},"amenity/restaurant/IHOP":{name:"IHOP",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1185675"},addTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",name:"IHOP"},removeTags:{amenity:"restaurant",brand:"IHOP","brand:wikidata":"Q1185675","brand:wikipedia":"en:IHOP",name:"IHOP"},matchScore:2,suggestion:true},"amenity/restaurant/Jason's Deli":{name:"Jason's Deli",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q16997641"},addTags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",name:"Jason's Deli"},removeTags:{amenity:"restaurant",brand:"Jason's Deli","brand:wikidata":"Q16997641","brand:wikipedia":"en:Jason's Deli",name:"Jason's Deli"},matchScore:2,suggestion:true},"amenity/restaurant/Jet's Pizza":{name:"Jet's Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q16997713"},addTags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"},removeTags:{amenity:"restaurant",brand:"Jet's Pizza","brand:wikidata":"Q16997713","brand:wikipedia":"en:Jet's Pizza",cuisine:"pizza",name:"Jet's Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Joe's Crab Shack":{name:"Joe's Crab Shack",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6208210"},addTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",name:"Joe's Crab Shack"},removeTags:{amenity:"restaurant",brand:"Joe's Crab Shack","brand:wikidata":"Q6208210","brand:wikipedia":"en:Joe's Crab Shack",name:"Joe's Crab Shack"},matchScore:2,suggestion:true},"amenity/restaurant/Kelsey's":{name:"Kelsey's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6386459"},addTags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",name:"Kelsey's"},removeTags:{amenity:"restaurant",brand:"Kelsey's","brand:wikidata":"Q6386459","brand:wikipedia":"en:Kelseys Original Roadhouse",name:"Kelsey's"},matchScore:2,suggestion:true},"amenity/restaurant/Logan's Roadhouse":{name:"Logan's Roadhouse",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6666872"},addTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",name:"Logan's Roadhouse"},removeTags:{amenity:"restaurant",brand:"Logan's Roadhouse","brand:wikidata":"Q6666872","brand:wikipedia":"en:Logan's Roadhouse",name:"Logan's Roadhouse"},matchScore:2,suggestion:true},"amenity/restaurant/LongHorn Steakhouse":{name:"LongHorn Steakhouse",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3259007"},addTags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",name:"LongHorn Steakhouse"},removeTags:{amenity:"restaurant",brand:"LongHorn Steakhouse","brand:wikidata":"Q3259007","brand:wikipedia":"en:LongHorn Steakhouse",name:"LongHorn Steakhouse"},matchScore:2,suggestion:true},"amenity/restaurant/Loving Hut":{name:"Loving Hut",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3491655"},addTags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",name:"Loving Hut"},removeTags:{amenity:"restaurant",brand:"Loving Hut","brand:wikidata":"Q3491655","brand:wikipedia":"en:Loving Hut",name:"Loving Hut"},matchScore:2,suggestion:true},"amenity/restaurant/Léon de Bruxelles":{name:"Léon de Bruxelles",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q21041507"},addTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",name:"Léon de Bruxelles"},removeTags:{amenity:"restaurant",brand:"Léon de Bruxelles","brand:wikidata":"Q21041507","brand:wikipedia":"en:Léon de Bruxelles",name:"Léon de Bruxelles"},matchScore:2,suggestion:true},"amenity/restaurant/MOD Pizza":{name:"MOD Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q19903469"},addTags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"},removeTags:{amenity:"restaurant",brand:"MOD Pizza","brand:wikidata":"Q19903469","brand:wikipedia":"en:MOD Pizza",cuisine:"pizza",name:"MOD Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Marco's Pizza":{name:"Marco's Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6757382"},addTags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"},removeTags:{amenity:"restaurant",brand:"Marco's Pizza","brand:wikidata":"Q6757382","brand:wikipedia":"en:Marco's Pizza",cuisine:"pizza",name:"Marco's Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Max's Restaurant":{name:"Max's Restaurant",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6794477"},addTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",name:"Max's Restaurant"},removeTags:{amenity:"restaurant",brand:"Max's Restaurant","brand:wikidata":"Q6794477","brand:wikipedia":"en:Max's of Manila",name:"Max's Restaurant"},matchScore:2,suggestion:true},"amenity/restaurant/McAlister's Deli":{name:"McAlister's Deli",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q17020829"},addTags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",name:"McAlister's Deli"},removeTags:{amenity:"restaurant",brand:"McAlister's Deli","brand:wikidata":"Q17020829","brand:wikipedia":"en:McAlister's Deli",name:"McAlister's Deli"},matchScore:2,suggestion:true},"amenity/restaurant/Mellow Mushroom":{name:"Mellow Mushroom",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q17021360"},addTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",name:"Mellow Mushroom"},removeTags:{amenity:"restaurant",brand:"Mellow Mushroom","brand:wikidata":"Q17021360","brand:wikipedia":"en:Mellow Mushroom",name:"Mellow Mushroom"},matchScore:2,suggestion:true},"amenity/restaurant/Nando's":{name:"Nando's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3472954"},addTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",name:"Nando's"},removeTags:{amenity:"restaurant",brand:"Nando's","brand:wikidata":"Q3472954","brand:wikipedia":"en:Nando's",name:"Nando's"},matchScore:2,suggestion:true},"amenity/restaurant/Noodles & Company":{name:"Noodles & Company",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7049673"},addTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",name:"Noodles & Company"},removeTags:{amenity:"restaurant",brand:"Noodles & Company","brand:wikidata":"Q7049673","brand:wikipedia":"en:Noodles & Company",name:"Noodles & Company"},matchScore:2,suggestion:true},"amenity/restaurant/O'Charley's":{name:"O'Charley's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7071703"},addTags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",name:"O'Charley's"},removeTags:{amenity:"restaurant",brand:"O'Charley's","brand:wikidata":"Q7071703","brand:wikipedia":"en:O'Charley's",name:"O'Charley's"},matchScore:2,suggestion:true},"amenity/restaurant/Old Chicago":{name:"Old Chicago",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5180522"},addTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q5180522","brand:wikipedia":"en:CraftWorks Restaurants & Breweries",name:"Old Chicago"},removeTags:{amenity:"restaurant",brand:"Old Chicago","brand:wikidata":"Q5180522","brand:wikipedia":"en:CraftWorks Restaurants & Breweries",name:"Old Chicago"},matchScore:2,suggestion:true},"amenity/restaurant/Old Wild West":{name:"Old Wild West",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q25402475"},addTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",name:"Old Wild West"},removeTags:{amenity:"restaurant",brand:"Old Wild West","brand:wikidata":"Q25402475","brand:wikipedia":"it:Old Wild West",name:"Old Wild West"},matchScore:2,suggestion:true},"amenity/restaurant/Olive Garden":{name:"Olive Garden",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q3045312"},addTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",name:"Olive Garden"},removeTags:{amenity:"restaurant",brand:"Olive Garden","brand:wikidata":"Q3045312","brand:wikipedia":"en:Olive Garden",name:"Olive Garden"},matchScore:2,suggestion:true},"amenity/restaurant/Outback Steakhouse":{name:"Outback Steakhouse",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1064893"},addTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",name:"Outback Steakhouse"},removeTags:{amenity:"restaurant",brand:"Outback Steakhouse","brand:wikidata":"Q1064893","brand:wikipedia":"en:Outback Steakhouse",name:"Outback Steakhouse"},matchScore:2,suggestion:true},"amenity/restaurant/P.F. Chang's":{name:"P.F. Chang's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q5360181"},addTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",name:"P.F. Chang's"},removeTags:{amenity:"restaurant",brand:"P.F. Chang's","brand:wikidata":"Q5360181","brand:wikipedia":"en:P. F. Chang's China Bistro",name:"P.F. Chang's"},matchScore:2,suggestion:true},"amenity/restaurant/Pei Wei":{name:"Pei Wei",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7160898"},addTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",name:"Pei Wei"},removeTags:{amenity:"restaurant",brand:"Pei Wei","brand:wikidata":"Q7160898","brand:wikipedia":"en:Pei Wei Asian Diner",name:"Pei Wei"},matchScore:2,suggestion:true},"amenity/restaurant/Pizza Factory":{name:"Pizza Factory",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q39054369"},addTags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"},removeTags:{amenity:"restaurant",brand:"Pizza Factory","brand:wikidata":"Q39054369","brand:wikipedia":"en:Pizza Factory",cuisine:"pizza",name:"Pizza Factory"},matchScore:2,suggestion:true},"amenity/restaurant/Pizza Hut":{name:"Pizza Hut",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q191615"},addTags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"},removeTags:{amenity:"restaurant",brand:"Pizza Hut","brand:wikidata":"Q191615","brand:wikipedia":"en:Pizza Hut",cuisine:"pizza",name:"Pizza Hut"},matchScore:2,suggestion:true},"amenity/restaurant/Pizza Ranch":{name:"Pizza Ranch",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7199978"},addTags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"},removeTags:{amenity:"restaurant",brand:"Pizza Ranch","brand:wikidata":"Q7199978","brand:wikipedia":"en:Pizza Ranch",cuisine:"pizza",name:"Pizza Ranch"},matchScore:2,suggestion:true},"amenity/restaurant/PizzaExpress":{name:"PizzaExpress",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q662845"},addTags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikipedia":"en:PizzaExpress","brand:wikidata":"Q662845",cuisine:"pizza",name:"PizzaExpress"},removeTags:{amenity:"restaurant",brand:"PizzaExpress","brand:wikipedia":"en:PizzaExpress","brand:wikidata":"Q662845",cuisine:"pizza",name:"PizzaExpress"},matchScore:2,suggestion:true},"amenity/restaurant/Prezzo":{name:"Prezzo",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7242489"},addTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",name:"Prezzo"},removeTags:{amenity:"restaurant",brand:"Prezzo","brand:wikidata":"Q7242489","brand:wikipedia":"en:Prezzo (restaurant)",name:"Prezzo"},matchScore:2,suggestion:true},"amenity/restaurant/Red Lobster":{name:"Red Lobster",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q846301"},addTags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"},removeTags:{amenity:"restaurant",brand:"Red Lobster","brand:wikidata":"Q846301","brand:wikipedia":"en:Red Lobster",cuisine:"seafood",name:"Red Lobster"},matchScore:2,suggestion:true},"amenity/restaurant/Red Robin":{name:"Red Robin",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7304886"},addTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",name:"Red Robin"},removeTags:{amenity:"restaurant",brand:"Red Robin","brand:wikidata":"Q7304886","brand:wikipedia":"en:Red Robin",name:"Red Robin"},matchScore:2,suggestion:true},"amenity/restaurant/Round Table Pizza":{name:"Round Table Pizza",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7371139"},addTags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"},removeTags:{amenity:"restaurant",brand:"Round Table Pizza","brand:wikidata":"Q7371139","brand:wikipedia":"en:Round Table Pizza",cuisine:"pizza",name:"Round Table Pizza"},matchScore:2,suggestion:true},"amenity/restaurant/Ruby Tuesday":{name:"Ruby Tuesday",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7376400"},addTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",name:"Ruby Tuesday"},removeTags:{amenity:"restaurant",brand:"Ruby Tuesday","brand:wikidata":"Q7376400","brand:wikipedia":"en:Ruby Tuesday (restaurant)",name:"Ruby Tuesday"},matchScore:2,suggestion:true},"amenity/restaurant/Shakey's":{name:"Shakey's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q6134929"},addTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",name:"Shakey's"},removeTags:{amenity:"restaurant",brand:"Shakey's","brand:wikidata":"Q6134929","brand:wikipedia":"en:Shakey's Pizza",name:"Shakey's"},matchScore:2,suggestion:true},"amenity/restaurant/Shari's":{name:"Shari's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7489612"},addTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",name:"Shari's"},removeTags:{amenity:"restaurant",brand:"Shari's","brand:wikidata":"Q7489612","brand:wikipedia":"en:Shari's Cafe & Pies",name:"Shari's"},matchScore:2,suggestion:true},"amenity/restaurant/Shoney's":{name:"Shoney's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7500392"},addTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",name:"Shoney's"},removeTags:{amenity:"restaurant",brand:"Shoney's","brand:wikidata":"Q7500392","brand:wikipedia":"en:Shoney's",name:"Shoney's"},matchScore:2,suggestion:true},"amenity/restaurant/Sizzler":{name:"Sizzler",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1848822"},addTags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",name:"Sizzler"},removeTags:{amenity:"restaurant",brand:"Sizzler","brand:wikidata":"Q1848822","brand:wikipedia":"en:Sizzler",name:"Sizzler"},matchScore:2,suggestion:true},"amenity/restaurant/Skyline Chili":{name:"Skyline Chili",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q151224"},addTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",name:"Skyline Chili"},removeTags:{amenity:"restaurant",brand:"Skyline Chili","brand:wikidata":"Q151224","brand:wikipedia":"en:Skyline Chili",name:"Skyline Chili"},matchScore:2,suggestion:true},"amenity/restaurant/Smitty's":{name:"Smitty's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7545728"},addTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",name:"Smitty's"},removeTags:{amenity:"restaurant",brand:"Smitty's","brand:wikidata":"Q7545728","brand:wikipedia":"en:Smitty's",name:"Smitty's"},matchScore:2,suggestion:true},"amenity/restaurant/Spur":{name:"Spur",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7581546"},addTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",name:"Spur"},removeTags:{amenity:"restaurant",brand:"Spur","brand:wikidata":"Q7581546","brand:wikipedia":"en:Spur Steak Ranches",name:"Spur"},matchScore:2,suggestion:true},"amenity/restaurant/Steak 'n Shake":{name:"Steak 'n Shake",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7605233"},addTags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"},removeTags:{amenity:"restaurant",brand:"Steak 'n Shake","brand:wikidata":"Q7605233","brand:wikipedia":"en:Steak 'n Shake",cuisine:"burger",name:"Steak 'n Shake"},matchScore:2,suggestion:true},"amenity/restaurant/Sunset Grill":{name:"Sunset Grill",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7641264"},addTags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q7641264","brand:wikipedia":"en:Sunset Grill (restaurant)",name:"Sunset Grill"},removeTags:{amenity:"restaurant",brand:"Sunset Grill","brand:wikidata":"Q7641264","brand:wikipedia":"en:Sunset Grill (restaurant)",name:"Sunset Grill"},matchScore:2,suggestion:true},"amenity/restaurant/Swiss Chalet":{name:"Swiss Chalet",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2372909"},addTags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",name:"Swiss Chalet"},removeTags:{amenity:"restaurant",brand:"Swiss Chalet","brand:wikidata":"Q2372909","brand:wikipedia":"en:Swiss Chalet",name:"Swiss Chalet"},matchScore:2,suggestion:true},"amenity/restaurant/TGI Friday's":{name:"TGI Friday's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1524184"},addTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",name:"TGI Friday's"},removeTags:{amenity:"restaurant",brand:"TGI Friday's","brand:wikidata":"Q1524184","brand:wikipedia":"en:TGI Fridays",name:"TGI Friday's"},matchScore:2,suggestion:true},"amenity/restaurant/Texas Roadhouse":{name:"Texas Roadhouse",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7707945"},addTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",name:"Texas Roadhouse"},removeTags:{amenity:"restaurant",brand:"Texas Roadhouse","brand:wikidata":"Q7707945","brand:wikipedia":"en:Texas Roadhouse",name:"Texas Roadhouse"},matchScore:2,suggestion:true},"amenity/restaurant/The Cheesecake Factory":{name:"The Cheesecake Factory",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1045842"},addTags:{amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",name:"The Cheesecake Factory"},removeTags:{amenity:"restaurant",brand:"The Cheesecake Factory","brand:wikidata":"Q1045842","brand:wikipedia":"en:The Cheesecake Factory",name:"The Cheesecake Factory"},matchScore:2,suggestion:true},"amenity/restaurant/The Keg":{name:"The Keg",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7744066"},addTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",name:"The Keg"},removeTags:{amenity:"restaurant",brand:"The Keg","brand:wikidata":"Q7744066","brand:wikipedia":"en:The Keg",name:"The Keg"},matchScore:2,suggestion:true},"amenity/restaurant/Toby Carvery":{name:"Toby Carvery",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7811777"},addTags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",name:"Toby Carvery"},removeTags:{amenity:"restaurant",brand:"Toby Carvery","brand:wikidata":"Q7811777","brand:wikipedia":"en:Toby Carvery",name:"Toby Carvery"},matchScore:2,suggestion:true},"amenity/restaurant/Toks":{name:"Toks",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q48835586"},addTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",name:"Toks"},removeTags:{amenity:"restaurant",brand:"Toks","brand:wikidata":"Q48835586","brand:wikipedia":"en:Toks",name:"Toks"},matchScore:2,suggestion:true},"amenity/restaurant/Tony Roma's":{name:"Tony Roma's",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q2213883"},addTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",name:"Tony Roma's"},removeTags:{amenity:"restaurant",brand:"Tony Roma's","brand:wikidata":"Q2213883","brand:wikipedia":"en:Tony Roma's",name:"Tony Roma's"},matchScore:2,suggestion:true},"amenity/restaurant/Vapiano":{name:"Vapiano",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q506252"},addTags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"},removeTags:{amenity:"restaurant",brand:"Vapiano","brand:wikidata":"Q506252","brand:wikipedia":"en:Vapiano",cuisine:"italian",name:"Vapiano"},matchScore:2,suggestion:true},"amenity/restaurant/Village Inn":{name:"Village Inn",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7930659"},addTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",name:"Village Inn"},removeTags:{amenity:"restaurant",brand:"Village Inn","brand:wikidata":"Q7930659","brand:wikipedia":"en:Village Inn",name:"Village Inn"},matchScore:2,suggestion:true},"amenity/restaurant/Vips":{name:"Vips",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q12599540"},addTags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"Vips"},removeTags:{amenity:"restaurant",brand:"Vips","brand:wikidata":"Q12599540","brand:wikipedia":"en:VIPS (restaurant)",name:"Vips"},matchScore:2,suggestion:true},"amenity/restaurant/Waffle House":{name:"Waffle House",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q1701206"},addTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",name:"Waffle House"},removeTags:{amenity:"restaurant",brand:"Waffle House","brand:wikidata":"Q1701206","brand:wikipedia":"en:Waffle House",name:"Waffle House"},matchScore:2,suggestion:true},"amenity/restaurant/Wagamama":{name:"Wagamama",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q503715"},addTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",name:"Wagamama"},removeTags:{amenity:"restaurant",brand:"Wagamama","brand:wikidata":"Q503715","brand:wikipedia":"en:Wagamama",name:"Wagamama"},matchScore:2,suggestion:true},"amenity/restaurant/Wasabi":{name:"Wasabi",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q23891278"},addTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",name:"Wasabi"},removeTags:{amenity:"restaurant",brand:"Wasabi","brand:wikidata":"Q23891278","brand:wikipedia":"en:Wasabi (restaurant)",name:"Wasabi"},matchScore:2,suggestion:true},"amenity/restaurant/White Spot":{name:"White Spot",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7995414"},addTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",name:"White Spot"},removeTags:{amenity:"restaurant",brand:"White Spot","brand:wikidata":"Q7995414","brand:wikipedia":"en:White Spot",name:"White Spot"},matchScore:2,suggestion:true},"amenity/restaurant/Wingstop":{name:"Wingstop",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q8025339"},addTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",name:"Wingstop"},removeTags:{amenity:"restaurant",brand:"Wingstop","brand:wikidata":"Q8025339","brand:wikipedia":"en:Wingstop",name:"Wingstop"},matchScore:2,suggestion:true},"amenity/restaurant/Zizzi":{name:"Zizzi",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q8072944"},addTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",name:"Zizzi"},removeTags:{amenity:"restaurant",brand:"Zizzi","brand:wikidata":"Q8072944","brand:wikipedia":"en:Zizzi",name:"Zizzi"},matchScore:2,suggestion:true},"amenity/restaurant/はなまるうどん":{name:"はなまるうどん",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11275674"},addTags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",name:"はなまるうどん","name:en":"Hanamarūdon"},removeTags:{amenity:"restaurant",brand:"はなまるうどん","brand:en":"Hanamarūdon","brand:wikidata":"Q11275674","brand:wikipedia":"ja:はなまるうどん",name:"はなまるうどん","name:en":"Hanamarūdon"},matchScore:2,suggestion:true},"amenity/restaurant/びっくりドンキー":{name:"びっくりドンキー",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11276815"},addTags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",name:"びっくりドンキー","name:en":"Bikkuri Donkey"},removeTags:{amenity:"restaurant",brand:"びっくりドンキー","brand:en":"Bikkuri Donkey","brand:wikidata":"Q11276815","brand:wikipedia":"ja:びっくりドンキー",name:"びっくりドンキー","name:en":"Bikkuri Donkey"},matchScore:2,suggestion:true},"amenity/restaurant/やよい軒":{name:"やよい軒",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11280577"},addTags:{amenity:"restaurant",brand:"やよい軒","brand:en":"YAYOI","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",name:"やよい軒","name:en":"YAYOI"},removeTags:{amenity:"restaurant",brand:"やよい軒","brand:en":"YAYOI","brand:wikidata":"Q11280577","brand:wikipedia":"ja:やよい軒",name:"やよい軒","name:en":"YAYOI"},matchScore:2,suggestion:true},"amenity/restaurant/ガスト":{name:"ガスト",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11253593"},addTags:{amenity:"restaurant",brand:"ガスト","brand:en":"Gusto","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"ガスト","name:en":"Gusto"},removeTags:{amenity:"restaurant",brand:"ガスト","brand:en":"Gusto","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"ガスト","name:en":"Gusto"},matchScore:2,suggestion:true},"amenity/restaurant/ココス":{name:"ココス",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11301951"},addTags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",name:"ココス","name:en":"Coco's"},removeTags:{amenity:"restaurant",brand:"ココス","brand:en":"Coco's","brand:wikidata":"Q11301951","brand:wikipedia":"ja:ココスジャパン",name:"ココス","name:en":"Coco's"},matchScore:2,suggestion:true},"amenity/restaurant/サイゼリヤ":{name:"サイゼリヤ",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q886564"},addTags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",name:"サイゼリヤ","name:en":"Saizeriya"},removeTags:{amenity:"restaurant",brand:"サイゼリヤ","brand:en":"Saizeriya","brand:wikidata":"Q886564","brand:wikipedia":"en:Saizeriya",name:"サイゼリヤ","name:en":"Saizeriya"},matchScore:2,suggestion:true},"amenity/restaurant/ジョイフル":{name:"ジョイフル",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11310517"},addTags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",name:"ジョイフル","name:en":"Joyfull"},removeTags:{amenity:"restaurant",brand:"ジョイフル","brand:en":"Joyfull","brand:wikidata":"Q11310517","brand:wikipedia":"ja:ジョイフル",name:"ジョイフル","name:en":"Joyfull"},matchScore:2,suggestion:true},"amenity/restaurant/ジョナサン":{name:"ジョナサン",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11310628"},addTags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",name:"ジョナサン","name:en":"Jonathan's"},removeTags:{amenity:"restaurant",brand:"ジョナサン","brand:en":"Jonathan's","brand:wikidata":"Q11310628","brand:wikipedia":"ja:ジョナサン (ファミリーレストラン)",name:"ジョナサン","name:en":"Jonathan's"},matchScore:2,suggestion:true},"amenity/restaurant/ジョリーパスタ":{name:"ジョリーパスタ",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q10852718"},addTags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",name:"ジョリーパスタ","name:en":"Jolly-Pasta"},removeTags:{amenity:"restaurant",brand:"ジョリーパスタ","brand:en":"Jolly-Pasta","brand:wikidata":"Q10852718","brand:wikipedia":"ja:ジョリーパスタ",name:"ジョリーパスタ","name:en":"Jolly-Pasta"},matchScore:2,suggestion:true},"amenity/restaurant/デニーズ":{name:"デニーズ",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11320661"},addTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",name:"デニーズ","name:en":"Denny's"},removeTags:{amenity:"restaurant",brand:"デニーズ","brand:en":"Denny's","brand:wikidata":"Q11320661","brand:wikipedia":"ja:デニーズ (日本)",name:"デニーズ","name:en":"Denny's"},matchScore:2,suggestion:true},"amenity/restaurant/バーミヤン":{name:"バーミヤン",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11328598"},addTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",name:"バーミヤン","name:en":"Bamiyan"},removeTags:{amenity:"restaurant",brand:"バーミヤン","brand:en":"Bamiyan","brand:wikidata":"Q11328598","brand:wikipedia":"ja:バーミヤン (レストランチェーン)",name:"バーミヤン","name:en":"Bamiyan"},matchScore:2,suggestion:true},"amenity/restaurant/ビッグボーイ":{name:"ビッグボーイ",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q4386779"},addTags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"ビッグボーイ","name:en":"Big Boy Restaurants"},removeTags:{amenity:"restaurant",brand:"ビッグボーイ","brand:en":"Big Boy Restaurants","brand:wikidata":"Q4386779","brand:wikipedia":"en:Big Boy Restaurants",name:"ビッグボーイ","name:en":"Big Boy Restaurants"},matchScore:2,suggestion:true},"amenity/restaurant/リンガーハット":{name:"リンガーハット",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q7334856"},addTags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",name:"リンガーハット","name:en":"Ringer Hut"},removeTags:{amenity:"restaurant",brand:"リンガーハット","brand:en":"Ringer Hut","brand:wikidata":"Q7334856","brand:wikipedia":"en:Ringer Hut",name:"リンガーハット","name:en":"Ringer Hut"},matchScore:2,suggestion:true},"amenity/restaurant/ロイヤルホスト":{name:"ロイヤルホスト",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11120884"},addTags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",name:"ロイヤルホスト","name:en":"Royal Host"},removeTags:{amenity:"restaurant",brand:"ロイヤルホスト","brand:en":"Royal Host","brand:wikidata":"Q11120884","brand:wikipedia":"ja:ロイヤルホスト",name:"ロイヤルホスト","name:en":"Royal Host"},matchScore:2,suggestion:true},"amenity/restaurant/丸亀製麺":{name:"丸亀製麺",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q10877253"},addTags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ko":"마루가메 제면"},removeTags:{amenity:"restaurant",brand:"丸亀製麺","brand:en":"Marugame Seimen","brand:wikidata":"Q10877253","brand:wikipedia":"ja:丸亀製麺",cuisine:"noodle",name:"丸亀製麺","name:en":"Marugame Seimen","name:ko":"마루가메 제면"},matchScore:2,suggestion:true},"amenity/restaurant/和食さと":{name:"和食さと",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11304897"},addTags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",name:"和食さと","name:en":"Washoku Sato"},removeTags:{amenity:"restaurant",brand:"和食さと","brand:en":"Washoku Sato","brand:wikidata":"Q11304897","brand:wikipedia":"ja:SRSホールディングス",name:"和食さと","name:en":"Washoku Sato"},matchScore:2,suggestion:true},"amenity/restaurant/夢庵":{name:"夢庵",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11253593"},addTags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"夢庵","name:en":"Yumean"},removeTags:{amenity:"restaurant",brand:"夢庵","brand:en":"Yumean","brand:wikidata":"Q11253593","brand:wikipedia":"ja:すかいらーく",name:"夢庵","name:en":"Yumean"},matchScore:2,suggestion:true},"amenity/restaurant/大戸屋":{name:"大戸屋",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11435522"},addTags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya"},removeTags:{amenity:"restaurant",brand:"大戸屋","brand:en":"Ootoya","brand:wikidata":"Q11435522","brand:wikipedia":"ja:大戸屋ホールディングス",cuisine:"japanese",name:"大戸屋","name:en":"Ootoya"},matchScore:2,suggestion:true},"amenity/restaurant/大阪王将":{name:"大阪王将",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q48743717"},addTags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",name:"大阪王将","name:en":"Osaka Ohsho"},removeTags:{amenity:"restaurant",brand:"大阪王将","brand:en":"Osaka Ohsho","brand:wikidata":"Q48743717","brand:wikipedia":"ja:大阪王将",name:"大阪王将","name:en":"Osaka Ohsho"},matchScore:2,suggestion:true},"amenity/restaurant/天下一品":{name:"天下一品",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11442172"},addTags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",name:"天下一品","name:en":"Tenkaippin"},removeTags:{amenity:"restaurant",brand:"天下一品","brand:en":"Tenkaippin","brand:wikidata":"Q11442172","brand:wikipedia":"en:Tenkaippin",name:"天下一品","name:en":"Tenkaippin"},matchScore:2,suggestion:true},"amenity/restaurant/安楽亭":{name:"安楽亭",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11450866"},addTags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"},removeTags:{amenity:"restaurant",brand:"安楽亭","brand:en":"Anrakutei","brand:wikidata":"Q11450866","brand:wikipedia":"ja:安楽亭",cuisine:"barbecue",name:"安楽亭","name:en":"Anrakutei"},matchScore:2,suggestion:true},"amenity/restaurant/日高屋":{name:"日高屋",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11326050"},addTags:{amenity:"restaurant",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya"},removeTags:{amenity:"restaurant",brand:"日高屋","brand:en":"Hidakaya","brand:wikidata":"Q11326050","brand:wikipedia":"ja:ハイデイ日高",cuisine:"noodle",name:"日高屋","name:en":"Hidakaya"},matchScore:2,suggestion:true},"amenity/restaurant/牛角":{name:"牛角",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11349387"},addTags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"},removeTags:{amenity:"restaurant",brand:"牛角","brand:en":"Gyū-Kaku","brand:wikidata":"Q11349387","brand:wikipedia":"en:Gyu-Kaku",cuisine:"barbecue",name:"牛角","name:en":"Gyū-Kaku"},matchScore:2,suggestion:true},"amenity/restaurant/餃子の王将":{name:"餃子の王将",icon:"maki-restaurant",fields:["name","cuisine","address","building_area","opening_hours","capacity","takeaway","delivery","smoking","outdoor_seating"],geometry:["point","area"],tags:{amenity:"restaurant","brand:wikidata":"Q11666805"},addTags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",name:"餃子の王将","name:en":"Gyoza no Ohsho"},removeTags:{amenity:"restaurant",brand:"餃子の王将","brand:en":"Gyoza no Ohsho","brand:wikidata":"Q11666805","brand:wikipedia":"en:Gyoza no Ohsho",name:"餃子の王将","name:en":"Gyoza no Ohsho"},matchScore:2,suggestion:true},"amenity/vending_machine/DHL Packstation":{name:"DHL Packstation",icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q489815"},addTags:{amenity:"vending_machine",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL Packstation",operator:"DHL",vending:"parcel_pickup;parcel_mail_in"},removeTags:{amenity:"vending_machine",brand:"DHL","brand:wikidata":"Q489815","brand:wikipedia":"en:DHL Express",name:"DHL Packstation",operator:"DHL",vending:"parcel_pickup;parcel_mail_in"},matchScore:2,suggestion:true},"amenity/vending_machine/KKM":{name:"KKM",icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q57515549"},addTags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"},removeTags:{amenity:"vending_machine",brand:"KKM","brand:wikidata":"Q57515549",name:"KKM",vending:"public_transport_tickets"},matchScore:2,suggestion:true},"amenity/vending_machine/Paczkomat InPost":{name:"Paczkomat InPost",icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q3182097"},addTags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"},removeTags:{amenity:"vending_machine",brand:"InPost","brand:wikidata":"Q3182097","brand:wikipedia":"pl:InPost",name:"Paczkomat InPost",vending:"parcel_pickup;parcel_mail_in"},matchScore:2,suggestion:true},"amenity/vending_machine/Redbox":{name:"Redbox",icon:"temaki-vending_machine",fields:["vending","operator","payment_multi","currency_multi"],geometry:["point"],tags:{amenity:"vending_machine","brand:wikidata":"Q7305489"},addTags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox"},removeTags:{amenity:"vending_machine",brand:"Redbox","brand:wikidata":"Q7305489","brand:wikipedia":"en:Redbox",name:"Redbox"},matchScore:2,suggestion:true},"amenity/veterinary/Banfield Pet Hospital":{name:"Banfield Pet Hospital",icon:"maki-veterinary",fields:["name","operator","address","building_area","opening_hours"],geometry:["point","area"],tags:{amenity:"veterinary","brand:wikidata":"Q2882416"},addTags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"},removeTags:{amenity:"veterinary",brand:"Banfield Pet Hospital","brand:wikidata":"Q2882416","brand:wikipedia":"en:Banfield Pet Hospital",name:"Banfield Pet Hospital"},matchScore:2,suggestion:true},"leisure/fitness_centre/24 Hour Fitness":{name:"24 Hour Fitness",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q4631849"},addTags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"},removeTags:{brand:"24 Hour Fitness","brand:wikidata":"Q4631849","brand:wikipedia":"en:24 Hour Fitness",leisure:"fitness_centre",name:"24 Hour Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Anytime Fitness":{name:"Anytime Fitness",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q4778364"},addTags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"},removeTags:{brand:"Anytime Fitness","brand:wikidata":"Q4778364","brand:wikipedia":"en:Anytime Fitness",leisure:"fitness_centre",name:"Anytime Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Curves":{name:"Curves",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q5196080"},addTags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"},removeTags:{brand:"Curves","brand:wikidata":"Q5196080","brand:wikipedia":"en:Curves International",leisure:"fitness_centre",name:"Curves"},matchScore:2,suggestion:true},"leisure/fitness_centre/Gold's Gym":{name:"Gold's Gym",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q1536234"},addTags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"},removeTags:{brand:"Gold's Gym","brand:wikidata":"Q1536234","brand:wikipedia":"en:Gold's Gym",leisure:"fitness_centre",name:"Gold's Gym"},matchScore:2,suggestion:true},"leisure/fitness_centre/LA Fitness":{name:"LA Fitness",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q6457180"},addTags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"},removeTags:{brand:"LA Fitness","brand:wikidata":"Q6457180","brand:wikipedia":"en:LA Fitness",leisure:"fitness_centre",name:"LA Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Planet Fitness":{name:"Planet Fitness",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q7201095"},addTags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"},removeTags:{brand:"Planet Fitness","brand:wikidata":"Q7201095","brand:wikipedia":"en:Planet Fitness",leisure:"fitness_centre",name:"Planet Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/Snap Fitness":{name:"Snap Fitness",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q7547254"},addTags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"},removeTags:{brand:"Snap Fitness","brand:wikidata":"Q7547254","brand:wikipedia":"en:Snap Fitness",leisure:"fitness_centre",name:"Snap Fitness"},matchScore:2,suggestion:true},"leisure/fitness_centre/YMCA":{name:"YMCA",icon:"fas-dumbbell",fields:["name","sport","address","building_area","opening_hours"],geometry:["point","area"],tags:{leisure:"fitness_centre","brand:wikidata":"Q157169"},addTags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"fitness_centre",name:"YMCA"},removeTags:{brand:"YMCA","brand:wikidata":"Q157169","brand:wikipedia":"en:YMCA",leisure:"fitness_centre",name:"YMCA"},matchScore:2,suggestion:true},"shop/alcohol/Alko":{name:"Alko",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1849187"},addTags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"},removeTags:{brand:"Alko","brand:wikidata":"Q1849187","brand:wikipedia":"en:Alko",name:"Alko",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/BC Liquor Store":{name:"BC Liquor Store",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q43079557"},addTags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"},removeTags:{brand:"BC Liquor Store","brand:wikidata":"Q43079557","brand:wikipedia":"en:BC Liquor Stores",name:"BC Liquor Store",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/BWS":{name:"BWS",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q4836848"},addTags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"},removeTags:{brand:"BWS","brand:wikidata":"Q4836848","brand:wikipedia":"en:BWS (liquor retailer)",name:"BWS",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Bargain Booze":{name:"Bargain Booze",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q16971315"},addTags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"},removeTags:{brand:"Bargain Booze","brand:wikidata":"Q16971315","brand:wikipedia":"en:Bargain Booze",name:"Bargain Booze",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Dan Murphy's":{name:"Dan Murphy's",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q5214075"},addTags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"},removeTags:{brand:"Dan Murphy's","brand:wikidata":"Q5214075","brand:wikipedia":"en:Dan Murphy's",name:"Dan Murphy's",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/LCBO":{name:"LCBO",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q845263"},addTags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"},removeTags:{brand:"LCBO","brand:wikidata":"Q845263","brand:wikipedia":"en:Liquor Control Board of Ontario",name:"LCBO",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Liquorland":{name:"Liquorland",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q2283837"},addTags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"},removeTags:{brand:"Liquorland","brand:wikidata":"Q2283837","brand:wikipedia":"en:Liquorland",name:"Liquorland",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Nicolas":{name:"Nicolas",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q3340012"},addTags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"},removeTags:{brand:"Nicolas","brand:wikidata":"Q3340012","brand:wikipedia":"en:Nicolas (wine retailer)",name:"Nicolas",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Systembolaget":{name:"Systembolaget",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1476113"},addTags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"},removeTags:{brand:"Systembolaget","brand:wikidata":"Q1476113","brand:wikipedia":"en:Systembolaget",name:"Systembolaget",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/The Beer Store":{name:"The Beer Store",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q16243674"},addTags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"},removeTags:{brand:"The Beer Store","brand:wikidata":"Q16243674","brand:wikipedia":"en:The Beer Store",name:"The Beer Store",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Vinmonopolet":{name:"Vinmonopolet",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q1740534"},addTags:{brand:"Vinmonopolet","brand:wikidata":"Q1740534","brand:wikipedia":"en:Vinmonopolet",name:"Vinmonopolet",shop:"alcohol"},removeTags:{brand:"Vinmonopolet","brand:wikidata":"Q1740534","brand:wikipedia":"en:Vinmonopolet",name:"Vinmonopolet",shop:"alcohol"},matchScore:2,suggestion:true},"shop/alcohol/Красное & Белое":{name:"Красное & Белое",icon:"maki-alcohol-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","drive_through"],geometry:["point","area"],tags:{shop:"alcohol","brand:wikidata":"Q24933790"},addTags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Red&White",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"},removeTags:{brand:"Красное & Белое","brand:en":"Red&White","brand:wikidata":"Q24933790","brand:wikipedia":"en:Red&White",name:"Красное & Белое","name:en":"Red&White",shop:"alcohol"},matchScore:2,suggestion:true},"shop/baby_goods/Babies R Us":{name:"Babies R Us",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"baby_goods","brand:wikidata":"Q696334"},addTags:{brand:"Babies R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Babies R Us",shop:"baby_goods"},removeTags:{brand:"Babies R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Babies R Us",shop:"baby_goods"},matchScore:2,suggestion:true},"shop/baby_goods/Mothercare":{name:"Mothercare",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"baby_goods","brand:wikidata":"Q136738"},addTags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"},removeTags:{brand:"Mothercare","brand:wikidata":"Q136738","brand:wikipedia":"en:Mothercare",name:"Mothercare",shop:"baby_goods"},matchScore:2,suggestion:true},"shop/bakery/Bakers Delight":{name:"Bakers Delight",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q4849261"},addTags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"},removeTags:{brand:"Bakers Delight","brand:wikidata":"Q4849261","brand:wikipedia":"en:Bakers Delight",name:"Bakers Delight",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Cooplands":{name:"Cooplands",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q5167971"},addTags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"},removeTags:{brand:"Cooplands","brand:wikidata":"Q5167971","brand:wikipedia":"en:Cooplands",name:"Cooplands",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Der Beck":{name:"Der Beck",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1192443"},addTags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"},removeTags:{brand:"Der Beck","brand:wikidata":"Q1192443","brand:wikipedia":"en:Der Beck",name:"Der Beck",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Ditsch":{name:"Ditsch",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q911573"},addTags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"},removeTags:{brand:"Ditsch","brand:wikidata":"Q911573","brand:wikipedia":"en:Ditsch",name:"Ditsch",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Greggs":{name:"Greggs",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3403981"},addTags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"},removeTags:{brand:"Greggs","brand:wikidata":"Q3403981","brand:wikipedia":"en:Greggs",name:"Greggs",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Hofpfisterei":{name:"Hofpfisterei",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1623217"},addTags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"},removeTags:{brand:"Hofpfisterei","brand:wikidata":"Q1623217","brand:wikipedia":"en:Hofpfisterei",name:"Hofpfisterei",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Kamps":{name:"Kamps",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q1723381"},addTags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"},removeTags:{brand:"Kamps","brand:wikidata":"Q1723381","brand:wikipedia":"de:Kamps (Unternehmen)",name:"Kamps",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/La Mie Câline":{name:"La Mie Câline",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3210704"},addTags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"},removeTags:{brand:"La Mie Câline","brand:wikidata":"Q3210704","brand:wikipedia":"fr:La Mie câline",name:"La Mie Câline",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Lila Bäcker":{name:"Lila Bäcker",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q57516591"},addTags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"},removeTags:{brand:"Lila Bäcker","brand:wikidata":"Q57516591",name:"Lila Bäcker",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Red Ribbon":{name:"Red Ribbon",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q7304789"},addTags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"},removeTags:{brand:"Red Ribbon","brand:wikidata":"Q7304789","brand:wikipedia":"en:Red Ribbon Bakeshop",name:"Red Ribbon",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/Steinecke":{name:"Steinecke",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q57516278"},addTags:{brand:"Steinecke","brand:wikidata":"Q57516278",name:"Steinecke",shop:"bakery"},removeTags:{brand:"Steinecke","brand:wikidata":"Q57516278",name:"Steinecke",shop:"bakery"},matchScore:2,suggestion:true},"shop/bakery/뚜레쥬르":{name:"뚜레쥬르",icon:"maki-bakery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bakery","brand:wikidata":"Q3535609"},addTags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours",shop:"bakery"},removeTags:{brand:"뚜레쥬르","brand:en":"Tous Les Jours","brand:wikidata":"Q3535609","brand:wikipedia":"ko:뚜레쥬르",name:"뚜레쥬르","name:en":"Tous Les Jours",shop:"bakery"},matchScore:2,suggestion:true},"shop/beauty/Bath & Body Works":{name:"Bath & Body Works",icon:"maki-shop",fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q810773"},addTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"},removeTags:{brand:"Bath & Body Works","brand:wikidata":"Q810773","brand:wikipedia":"en:Bath & Body Works",name:"Bath & Body Works",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/European Wax Center":{name:"European Wax Center",icon:"maki-shop",fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q5413426"},addTags:{brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"},removeTags:{brand:"European Wax Center","brand:wikidata":"Q5413426","brand:wikipedia":"en:European Wax Center",name:"European Wax Center",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/Ulta Beauty":{name:"Ulta Beauty",icon:"maki-shop",fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q7880076"},addTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"},removeTags:{brand:"Ulta Beauty","brand:wikidata":"Q7880076","brand:wikipedia":"en:Ulta Beauty",name:"Ulta Beauty",shop:"beauty"},matchScore:2,suggestion:true},"shop/beauty/Yves Rocher":{name:"Yves Rocher",icon:"maki-shop",fields:["name","operator","address","building_area","beauty","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beauty","brand:wikidata":"Q28496595"},addTags:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"fr:Yves Rocher (entreprise)",name:"Yves Rocher",shop:"beauty"},removeTags:{brand:"Yves Rocher","brand:wikidata":"Q28496595","brand:wikipedia":"fr:Yves Rocher (entreprise)",name:"Yves Rocher",shop:"beauty"},matchScore:2,suggestion:true},"shop/bed/Matratzen Concord":{name:"Matratzen Concord",icon:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q18629057"},addTags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"},removeTags:{brand:"Matratzen Concord","brand:wikidata":"Q18629057","brand:wikipedia":"de:Matratzen Concord",name:"Matratzen Concord",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Mattress Firm":{name:"Mattress Firm",icon:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q6791878"},addTags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"},removeTags:{brand:"Mattress Firm","brand:wikidata":"Q6791878","brand:wikipedia":"en:Mattress Firm",name:"Mattress Firm",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Sleep Number":{name:"Sleep Number",icon:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q7447640"},addTags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"},removeTags:{brand:"Sleep Number","brand:wikidata":"Q7447640","brand:wikipedia":"en:Sleep Number",name:"Sleep Number",shop:"bed"},matchScore:2,suggestion:true},"shop/bed/Sleepy's":{name:"Sleepy's",icon:"maki-lodging",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bed","brand:wikidata":"Q17088336"},addTags:{brand:"Sleepy's","brand:wikidata":"Q17088336","brand:wikipedia":"en:Sleepy's",name:"Sleepy's",shop:"bed"},removeTags:{brand:"Sleepy's","brand:wikidata":"Q17088336","brand:wikipedia":"en:Sleepy's",name:"Sleepy's",shop:"bed"},matchScore:2,suggestion:true},"shop/beverages/Edeka Getränkemarkt":{name:"Edeka Getränkemarkt",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57450576"},addTags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"},removeTags:{brand:"Edeka Getränkemarkt","brand:wikidata":"Q57450576",name:"Edeka Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Hol'ab":{name:"Hol'ab",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57557270"},addTags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"},removeTags:{brand:"Hol'ab","brand:wikidata":"Q57557270",name:"Hol'ab",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Rewe Getränkemarkt":{name:"Rewe Getränkemarkt",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q57519344"},addTags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"},removeTags:{brand:"Rewe Getränkemarkt","brand:wikidata":"Q57519344",name:"Rewe Getränkemarkt",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/Trinkgut":{name:"Trinkgut",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q2453627"},addTags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"},removeTags:{brand:"Trinkgut","brand:wikidata":"Q2453627","brand:wikipedia":"de:Trinkgut",name:"Trinkgut",shop:"beverages"},matchScore:2,suggestion:true},"shop/beverages/清心福全":{name:"清心福全",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"beverages","brand:wikidata":"Q10391229"},addTags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"},removeTags:{brand:"清心福全","brand:wikidata":"Q10391229","brand:wikipedia":"zh:清心福全冷飲站",name:"清心福全",shop:"beverages"},matchScore:2,suggestion:true},"shop/bicycle/Evans Cycles":{name:"Evans Cycles",icon:"maki-bicycle",fields:["name","operator","address","building_area","service/bicycle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bicycle","brand:wikidata":"Q5415901"},addTags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"},removeTags:{brand:"Evans Cycles","brand:wikidata":"Q5415901","brand:wikipedia":"en:Evans Cycles",name:"Evans Cycles",shop:"bicycle"},matchScore:2,suggestion:true},"shop/bookmaker/Betfred":{name:"Betfred",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q4897425"},addTags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"},removeTags:{brand:"Betfred","brand:wikidata":"Q4897425","brand:wikipedia":"en:Betfred",name:"Betfred",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Coral":{name:"Coral",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q54621344"},addTags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"},removeTags:{brand:"Coral","brand:wikidata":"Q54621344","brand:wikipedia":"en:Coral (bookmaker)",name:"Coral",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Ladbrokes":{name:"Ladbrokes",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q1799875"},addTags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"},removeTags:{brand:"Ladbrokes","brand:wikidata":"Q1799875","brand:wikipedia":"en:Ladbrokes Coral",name:"Ladbrokes",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Paddy Power":{name:"Paddy Power",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q3888718"},addTags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"},removeTags:{brand:"Paddy Power","brand:wikidata":"Q3888718","brand:wikipedia":"en:Paddy Power",name:"Paddy Power",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/Tipico":{name:"Tipico",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q15851003"},addTags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"},removeTags:{brand:"Tipico","brand:wikidata":"Q15851003","brand:wikipedia":"en:Tipico",name:"Tipico",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/William Hill":{name:"William Hill",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q4053147"},addTags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"},removeTags:{brand:"William Hill","brand:wikidata":"Q4053147","brand:wikipedia":"en:William Hill (bookmaker)",name:"William Hill",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/bookmaker/ΟΠΑΠ":{name:"ΟΠΑΠ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"bookmaker","brand:wikidata":"Q2007823"},addTags:{brand:"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"},removeTags:{brand:"ΟΠΑΠ","brand:en":"OPAP","brand:wikidata":"Q2007823","brand:wikipedia":"en:OPAP",name:"ΟΠΑΠ","name:en":"OPAP",shop:"bookmaker"},matchScore:2,suggestion:true},"shop/books/Akademibokhandeln":{name:"Akademibokhandeln",icon:"maki-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","brand:wikidata":"Q10403918"},addTags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"},removeTags:{brand:"Akademibokhandeln","brand:wikidata":"Q10403918","brand:wikipedia":"sv:Akademibokhandeln",name:"Akademibokhandeln",shop:"books"},matchScore:2,suggestion:true},"shop/books/Barnes & Noble":{name:"Barnes & Noble",icon:"maki-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","brand:wikidata":"Q795454"},addTags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"},removeTags:{brand:"Barnes & Noble","brand:wikidata":"Q795454","brand:wikipedia":"en:Barnes & Noble",name:"Barnes & Noble",shop:"books"},matchScore:2,suggestion:true},"shop/books/Chapters":{name:"Chapters",icon:"maki-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","brand:wikidata":"Q5073540"},addTags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters",name:"Chapters",shop:"books"},removeTags:{brand:"Chapters","brand:wikidata":"Q5073540","brand:wikipedia":"en:Chapters",name:"Chapters",shop:"books"},matchScore:2,suggestion:true},"shop/books/Empik":{name:"Empik",icon:"maki-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","brand:wikidata":"Q3045978"},addTags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"en:Empik",name:"Empik",shop:"books"},removeTags:{brand:"Empik","brand:wikidata":"Q3045978","brand:wikipedia":"en:Empik",name:"Empik",shop:"books"},matchScore:2,suggestion:true},"shop/books/Fnac":{name:"Fnac",icon:"maki-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","brand:wikidata":"Q676585"},addTags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"},removeTags:{brand:"Fnac","brand:wikidata":"Q676585","brand:wikipedia":"en:Fnac",name:"Fnac",shop:"books"},matchScore:2,suggestion:true},"shop/books/Half Price Books":{name:"Half Price Books",icon:"maki-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","brand:wikidata":"Q5641744"},addTags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"},removeTags:{brand:"Half Price Books","brand:wikidata":"Q5641744","brand:wikipedia":"en:Half Price Books",name:"Half Price Books",shop:"books"},matchScore:2,suggestion:true},"shop/books/Hugendubel":{name:"Hugendubel",icon:"maki-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","brand:wikidata":"Q1634142"},addTags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"},removeTags:{brand:"Hugendubel","brand:wikidata":"Q1634142","brand:wikipedia":"en:Hugendubel",name:"Hugendubel",shop:"books"},matchScore:2,suggestion:true},"shop/books/National Book Store":{name:"National Book Store",icon:"maki-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","brand:wikidata":"Q6971094"},addTags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"},removeTags:{brand:"National Book Store","brand:wikidata":"Q6971094","brand:wikipedia":"en:National Book Store",name:"National Book Store",shop:"books"},matchScore:2,suggestion:true},"shop/books/TSUTAYA":{name:"TSUTAYA",icon:"maki-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","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"books"},matchScore:2,suggestion:true},"shop/books/Thalia":{name:"Thalia",icon:"maki-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","brand:wikidata":"Q2408854"},addTags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"},removeTags:{brand:"Thalia","brand:wikidata":"Q2408854","brand:wikipedia":"de:Thalia Bücher",name:"Thalia",shop:"books"},matchScore:2,suggestion:true},"shop/books/Waterstones":{name:"Waterstones",icon:"maki-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","brand:wikidata":"Q151779"},addTags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"},removeTags:{brand:"Waterstones","brand:wikidata":"Q151779","brand:wikipedia":"en:Waterstones",name:"Waterstones",shop:"books"},matchScore:2,suggestion:true},"shop/books/Weltbild":{name:"Weltbild",icon:"maki-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","brand:wikidata":"Q883522"},addTags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"},removeTags:{brand:"Weltbild","brand:wikidata":"Q883522","brand:wikipedia":"en:Weltbild Publishing Group",name:"Weltbild",shop:"books"},matchScore:2,suggestion:true},"shop/books/ブックオフ":{name:"ブックオフ",icon:"maki-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","brand:wikidata":"Q893011"},addTags:{brand:"ブックオフ","brand:en":"Book Off","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off",shop:"books"},removeTags:{brand:"ブックオフ","brand:en":"Book Off","brand:wikidata":"Q893011","brand:wikipedia":"en:Book Off",name:"ブックオフ","name:en":"Book Off",shop:"books"},matchScore:2,suggestion:true},"shop/books/新华书店":{name:"新华书店",icon:"maki-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","brand:wikidata":"Q6124193"},addTags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore",name:"新华书店","name:en":"Xinhua Bookstore",shop:"books"},removeTags:{brand:"新华书店","brand:en":"Xinhua Bookstore","brand:wikidata":"Q6124193","brand:wikipedia":"en:Xinhua Bookstore",name:"新华书店","name:en":"Xinhua Bookstore",shop:"books"},matchScore:2,suggestion:true},"shop/butcher/Родинна ковбаска":{name:"Родинна ковбаска",icon:"maki-slaughterhouse",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"butcher","brand:wikidata":"Q30969660"},addTags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"},removeTags:{brand:"Родинна ковбаска","brand:en":"Rodynna-kovbaska","brand:wikidata":"Q30969660","brand:wikipedia":"uk:ТзОВ «Барком»",name:"Родинна ковбаска","name:en":"Rodynna-kovbaska",shop:"butcher"},matchScore:2,suggestion:true},"shop/car_parts/Advance Auto Parts":{name:"Advance Auto Parts",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q4686051"},addTags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"},removeTags:{brand:"Advance Auto Parts","brand:wikidata":"Q4686051","brand:wikipedia":"en:Advance Auto Parts",name:"Advance Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/AutoZone":{name:"AutoZone",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q4826087"},addTags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"},removeTags:{brand:"AutoZone","brand:wikidata":"Q4826087","brand:wikipedia":"en:AutoZone",name:"AutoZone",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Halfords":{name:"Halfords",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q3398786"},addTags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"},removeTags:{brand:"Halfords","brand:wikidata":"Q3398786","brand:wikipedia":"en:Halfords",name:"Halfords","service:bicycle:retail":"yes",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/NAPA Auto Parts":{name:"NAPA Auto Parts",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q6970842"},addTags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"},removeTags:{brand:"NAPA Auto Parts","brand:wikidata":"Q6970842","brand:wikipedia":"en:National Automotive Parts Association",name:"NAPA Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/O'Reilly Auto Parts":{name:"O'Reilly Auto Parts",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q7071951"},addTags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"},removeTags:{brand:"O'Reilly Auto Parts","brand:wikidata":"Q7071951","brand:wikipedia":"en:O'Reilly Auto Parts",name:"O'Reilly Auto Parts",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Repco":{name:"Repco",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q173425"},addTags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"},removeTags:{brand:"Repco","brand:wikidata":"Q173425","brand:wikipedia":"en:Repco",name:"Repco",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_parts/Supercheap Auto":{name:"Supercheap Auto",icon:"maki-car",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_parts","brand:wikidata":"Q7643119"},addTags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"},removeTags:{brand:"Supercheap Auto","brand:wikidata":"Q7643119","brand:wikipedia":"en:Supercheap Auto",name:"Supercheap Auto",shop:"car_parts"},matchScore:2,suggestion:true},"shop/car_repair/A.T.U":{name:"A.T.U",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q784721"},addTags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"},removeTags:{brand:"A.T.U","brand:wikidata":"Q784721","brand:wikipedia":"de:Auto-Teile-Unger",name:"A.T.U",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/ATS Euromaster":{name:"ATS Euromaster",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q4654920"},addTags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"},removeTags:{brand:"ATS Euromaster","brand:wikidata":"Q4654920","brand:wikipedia":"en:ATS Euromaster",name:"ATS Euromaster",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Bosch Car Service":{name:"Bosch Car Service",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q234021"},addTags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"de:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"},removeTags:{brand:"Bosch Car Service","brand:wikidata":"Q234021","brand:wikipedia":"de:Robert Bosch GmbH",name:"Bosch Car Service",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Carglass":{name:"Carglass",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q1035997"},addTags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"},removeTags:{brand:"Carglass","brand:wikidata":"Q1035997","brand:wikipedia":"de:Carglass",name:"Carglass",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Firestone":{name:"Firestone",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q420837"},addTags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",shop:"car_repair"},removeTags:{brand:"Firestone","brand:wikidata":"Q420837","brand:wikipedia":"en:Firestone Tire and Rubber Company",name:"Firestone",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Ford":{name:"Ford",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q44294"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"},removeTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Goodyear":{name:"Goodyear",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q620875"},addTags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"},removeTags:{brand:"Goodyear","brand:wikidata":"Q620875","brand:wikipedia":"en:Goodyear Tire and Rubber Company",name:"Goodyear",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Grease Monkey":{name:"Grease Monkey",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q5598563"},addTags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"},removeTags:{brand:"Grease Monkey","brand:wikidata":"Q5598563","brand:wikipedia":"en:Grease Monkey (business)",name:"Grease Monkey",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Halfords Autocentre":{name:"Halfords Autocentre",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q5641894"},addTags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"},removeTags:{brand:"Halfords Auocentre","brand:wikidata":"Q5641894","brand:wikipedia":"en:Halfords Autocentre",name:"Halfords Autocentre",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Jiffy Lube":{name:"Jiffy Lube",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6192247"},addTags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"},removeTags:{brand:"Jiffy Lube","brand:wikidata":"Q6192247","brand:wikipedia":"en:Jiffy Lube",name:"Jiffy Lube",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Kwik Fit":{name:"Kwik Fit",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q958053"},addTags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"},removeTags:{brand:"Kwik Fit","brand:wikidata":"Q958053","brand:wikipedia":"en:Kwik Fit",name:"Kwik Fit",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Meineke":{name:"Meineke",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6810159"},addTags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",shop:"car_repair"},removeTags:{brand:"Meineke","brand:wikidata":"Q6810159","brand:wikipedia":"en:Meineke Car Care Centers",name:"Meineke",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Midas":{name:"Midas",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3312613"},addTags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"},removeTags:{brand:"Midas","brand:wikidata":"Q3312613","brand:wikipedia":"en:Midas (automotive service)",name:"Midas",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Mr. Lube":{name:"Mr. Lube",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q17104067"},addTags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"},removeTags:{brand:"Mr. Lube","brand:wikidata":"Q17104067","brand:wikipedia":"en:Mr. Lube",name:"Mr. Lube",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Norauto":{name:"Norauto",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3317698"},addTags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"},removeTags:{brand:"Norauto","brand:wikidata":"Q3317698","brand:wikipedia":"en:Mobivia Groupe",name:"Norauto",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Pep Boys":{name:"Pep Boys",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3375007"},addTags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"},removeTags:{brand:"Pep Boys","brand:wikidata":"Q3375007","brand:wikipedia":"en:Pep Boys",name:"Pep Boys",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Peugeot":{name:"Peugeot",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6742"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"},removeTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Renault":{name:"Renault",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q6686"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"},removeTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Roady":{name:"Roady",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q3434112"},addTags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"},removeTags:{brand:"Roady","brand:wikidata":"Q3434112","brand:wikipedia":"en:Roady (Mousquetaires)",name:"Roady",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Toyota":{name:"Toyota",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q53268"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"},removeTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car_repair"},matchScore:2,suggestion:true},"shop/car_repair/Valvoline":{name:"Valvoline",icon:"maki-car-repair",fields:["name","operator","address","building_area","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car_repair","brand:wikidata":"Q7912852"},addTags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",shop:"car_repair"},removeTags:{brand:"Valvoline","brand:wikidata":"Q7912852","brand:wikipedia":"en:Valvoline Instant Oil Change",name:"Valvoline",shop:"car_repair"},matchScore:2,suggestion:true},"shop/carpet/Carpetright":{name:"Carpetright",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"carpet","brand:wikidata":"Q5045782"},addTags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"},removeTags:{brand:"Carpetright","brand:wikidata":"Q5045782","brand:wikipedia":"en:Carpetright",name:"Carpetright",shop:"carpet"},matchScore:2,suggestion:true},"shop/car/Audi":{name:"Audi",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q23317"},addTags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"},removeTags:{brand:"Audi","brand:wikidata":"Q23317","brand:wikipedia":"en:Audi",name:"Audi",shop:"car"},matchScore:2,suggestion:true},"shop/car/BMW":{name:"BMW",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q26678"},addTags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"},removeTags:{brand:"BMW","brand:wikidata":"Q26678","brand:wikipedia":"en:BMW",name:"BMW",shop:"car"},matchScore:2,suggestion:true},"shop/car/Chevrolet":{name:"Chevrolet",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29570"},addTags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"},removeTags:{brand:"Chevrolet","brand:wikidata":"Q29570","brand:wikipedia":"en:Chevrolet",name:"Chevrolet",shop:"car"},matchScore:2,suggestion:true},"shop/car/Dacia":{name:"Dacia",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q27460"},addTags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"},removeTags:{brand:"Dacia","brand:wikidata":"Q27460","brand:wikipedia":"en:Automobile Dacia",name:"Dacia",shop:"car"},matchScore:2,suggestion:true},"shop/car/Fiat":{name:"Fiat",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q27597"},addTags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"},removeTags:{brand:"Fiat","brand:wikidata":"Q27597","brand:wikipedia":"en:Fiat Automobiles",name:"Fiat",shop:"car"},matchScore:2,suggestion:true},"shop/car/Ford":{name:"Ford",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q44294"},addTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"},removeTags:{brand:"Ford","brand:wikidata":"Q44294","brand:wikipedia":"en:Ford Motor Company",name:"Ford",shop:"car"},matchScore:2,suggestion:true},"shop/car/Honda":{name:"Honda",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q9584"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"},removeTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Hyundai":{name:"Hyundai",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q55931"},addTags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"},removeTags:{brand:"Hyundai","brand:wikidata":"Q55931","brand:wikipedia":"en:Hyundai Motor Company",name:"Hyundai",shop:"car"},matchScore:2,suggestion:true},"shop/car/Isuzu":{name:"Isuzu",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29803"},addTags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"},removeTags:{brand:"Isuzu","brand:wikidata":"Q29803","brand:wikipedia":"en:Isuzu Motors",name:"Isuzu",shop:"car"},matchScore:2,suggestion:true},"shop/car/Kia":{name:"Kia",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35349"},addTags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"},removeTags:{brand:"Kia","brand:wikidata":"Q35349","brand:wikipedia":"en:Kia Motors",name:"Kia",shop:"car"},matchScore:2,suggestion:true},"shop/car/Land Rover":{name:"Land Rover",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35907"},addTags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"},removeTags:{brand:"Land Rover","brand:wikidata":"Q35907","brand:wikipedia":"en:Land Rover",name:"Land Rover",shop:"car"},matchScore:2,suggestion:true},"shop/car/Lexus":{name:"Lexus",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35919"},addTags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"},removeTags:{brand:"Lexus","brand:wikidata":"Q35919","brand:wikipedia":"en:Lexus",name:"Lexus",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mazda":{name:"Mazda",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q35996"},addTags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"},removeTags:{brand:"Mazda","brand:wikidata":"Q35996","brand:wikipedia":"en:Mazda",name:"Mazda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mercedes-Benz":{name:"Mercedes-Benz",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q36008"},addTags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"},removeTags:{brand:"Mercedes-Benz","brand:wikidata":"Q36008","brand:wikipedia":"en:Mercedes-Benz",name:"Mercedes-Benz",shop:"car"},matchScore:2,suggestion:true},"shop/car/Mitsubishi":{name:"Mitsubishi",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q36033"},addTags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"},removeTags:{brand:"Mitsubishi","brand:wikidata":"Q36033","brand:wikipedia":"en:Mitsubishi Motors",name:"Mitsubishi",shop:"car"},matchScore:2,suggestion:true},"shop/car/Netz":{name:"Netz",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q11325416"},addTags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"},removeTags:{brand:"Netz","brand:wikidata":"Q11325416","brand:wikipedia":"ja:ネッツ店",name:"Netz",shop:"car"},matchScore:2,suggestion:true},"shop/car/Nissan":{name:"Nissan",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q20165"},addTags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"},removeTags:{brand:"Nissan","brand:wikidata":"Q20165","brand:wikipedia":"ja:日産自動車",name:"Nissan",shop:"car"},matchScore:2,suggestion:true},"shop/car/Opel":{name:"Opel",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q40966"},addTags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"},removeTags:{brand:"Opel","brand:wikidata":"Q40966","brand:wikipedia":"en:Opel",name:"Opel",shop:"car"},matchScore:2,suggestion:true},"shop/car/Peugeot":{name:"Peugeot",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q6742"},addTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"},removeTags:{brand:"Peugeot","brand:wikidata":"Q6742","brand:wikipedia":"en:Peugeot",name:"Peugeot",shop:"car"},matchScore:2,suggestion:true},"shop/car/Porsche":{name:"Porsche",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q40993"},addTags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"},removeTags:{brand:"Porsche","brand:wikidata":"Q40993","brand:wikipedia":"en:Porsche",name:"Porsche",shop:"car"},matchScore:2,suggestion:true},"shop/car/Renault":{name:"Renault",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q6686"},addTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"},removeTags:{brand:"Renault","brand:wikidata":"Q6686","brand:wikipedia":"en:Renault",name:"Renault",shop:"car"},matchScore:2,suggestion:true},"shop/car/Seat":{name:"Seat",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q188217"},addTags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"},removeTags:{brand:"Seat","brand:wikidata":"Q188217","brand:wikipedia":"en:SEAT",name:"Seat",shop:"car"},matchScore:2,suggestion:true},"shop/car/Skoda":{name:"Skoda",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q29637"},addTags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"},removeTags:{brand:"Skoda","brand:wikidata":"Q29637","brand:wikipedia":"en:Škoda Auto",name:"Skoda",shop:"car"},matchScore:2,suggestion:true},"shop/car/Subaru":{name:"Subaru",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q172741"},addTags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"},removeTags:{brand:"Subaru","brand:wikidata":"Q172741","brand:wikipedia":"en:Subaru",name:"Subaru",shop:"car"},matchScore:2,suggestion:true},"shop/car/Suzuki":{name:"Suzuki",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q181642"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"},removeTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"car"},matchScore:2,suggestion:true},"shop/car/Tesla":{name:"Tesla",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q478214"},addTags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"},removeTags:{brand:"Tesla","brand:wikidata":"Q478214","brand:wikipedia":"en:Tesla, Inc.",name:"Tesla",shop:"car"},matchScore:2,suggestion:true},"shop/car/Toyota":{name:"Toyota",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q53268"},addTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"},removeTags:{brand:"Toyota","brand:wikidata":"Q53268","brand:wikipedia":"en:Toyota",name:"Toyota",shop:"car"},matchScore:2,suggestion:true},"shop/car/Volkswagen":{name:"Volkswagen",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q246"},addTags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"},removeTags:{brand:"Volkswagen","brand:wikidata":"Q246","brand:wikipedia":"en:Volkswagen",name:"Volkswagen",shop:"car"},matchScore:2,suggestion:true},"shop/car/Volvo":{name:"Volvo",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q215293"},addTags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"},removeTags:{brand:"Volvo","brand:wikidata":"Q215293","brand:wikipedia":"en:Volvo Cars",name:"Volvo",shop:"car"},matchScore:2,suggestion:true},"shop/car/ホンダ":{name:"ホンダ",icon:"maki-car",fields:["name","brand","operator","address","building_area","second_hand","service/vehicle","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"car","brand:wikidata":"Q9584"},addTags:{brand:"ホンダ","brand:en":"Honda","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda",shop:"car"},removeTags:{brand:"ホンダ","brand:en":"Honda","brand:wikidata":"Q9584","brand:wikipedia":"ja:本田技研工業",name:"ホンダ","name:en":"Honda",shop:"car"},matchScore:2,suggestion:true},"shop/catalogue/Argos":{name:"Argos",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"catalogue","brand:wikidata":"Q4789707"},addTags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"},removeTags:{brand:"Argos","brand:wikidata":"Q4789707","brand:wikipedia":"en:Argos (retailer)",name:"Argos",shop:"catalogue"},matchScore:2,suggestion:true},"shop/charity/Age UK":{name:"Age UK",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4691850"},addTags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"},removeTags:{brand:"Age UK","brand:wikidata":"Q4691850","brand:wikipedia":"en:Age UK",name:"Age UK",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Barnardo's":{name:"Barnardo's",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q2884670"},addTags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"},removeTags:{brand:"Barnardo's","brand:wikidata":"Q2884670","brand:wikipedia":"en:Barnardo's",name:"Barnardo's",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/British Heart Foundation":{name:"British Heart Foundation",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4970039"},addTags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"},removeTags:{brand:"British Heart Foundation","brand:wikidata":"Q4970039","brand:wikipedia":"en:British Heart Foundation",name:"British Heart Foundation",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/British Red Cross":{name:"British Red Cross",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q4970966"},addTags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"},removeTags:{brand:"British Red Cross","brand:wikidata":"Q4970966","brand:wikipedia":"en:British Red Cross",name:"British Red Cross",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Cancer Research UK":{name:"Cancer Research UK",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q326079"},addTags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"},removeTags:{brand:"Cancer Research UK","brand:wikidata":"Q326079","brand:wikipedia":"en:Cancer Research UK",name:"Cancer Research UK",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Goodwill":{name:"Goodwill",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q5583655"},addTags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"},removeTags:{brand:"Goodwill","brand:wikidata":"Q5583655","brand:wikipedia":"en:Goodwill Industries",name:"Goodwill",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Mind":{name:"Mind",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q3314763"},addTags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"},removeTags:{brand:"Mind","brand:wikidata":"Q3314763","brand:wikipedia":"en:Mind (charity)",name:"Mind",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Myrorna":{name:"Myrorna",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q10592609"},addTags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"},removeTags:{brand:"Myrorna","brand:wikidata":"Q10592609","brand:wikipedia":"sv:Myrorna",name:"Myrorna",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Oxfam":{name:"Oxfam",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q267941"},addTags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"},removeTags:{brand:"Oxfam","brand:wikidata":"Q267941","brand:wikipedia":"en:Oxfam",name:"Oxfam",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/RSPCA":{name:"RSPCA",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q584819"},addTags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"},removeTags:{brand:"RSPCA","brand:wikidata":"Q584819","brand:wikipedia":"en:Royal Society for the Prevention of Cruelty to Animals",name:"RSPCA",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Salvation Army":{name:"Salvation Army",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q188307"},addTags:{brand:"Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"Salvation Army",shop:"charity"},removeTags:{brand:"Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"Salvation Army",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Scope":{name:"Scope",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q7434435"},addTags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"},removeTags:{brand:"Scope","brand:wikidata":"Q7434435","brand:wikipedia":"en:Scope (charity)",name:"Scope",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/Sue Ryder":{name:"Sue Ryder",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q7634271"},addTags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"},removeTags:{brand:"Sue Ryder","brand:wikidata":"Q7634271","brand:wikipedia":"en:Sue Ryder (charity)",name:"Sue Ryder",shop:"charity"},matchScore:2,suggestion:true},"shop/charity/The Salvation Army":{name:"The Salvation Army",icon:"maki-shop",fields:["name","operator","address","building_area","second_hand","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"charity","brand:wikidata":"Q188307"},addTags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"},removeTags:{brand:"The Salvation Army","brand:wikidata":"Q188307","brand:wikipedia":"en:The Salvation Army",name:"The Salvation Army",shop:"charity"},matchScore:2,suggestion:true},"shop/chemist/Bipa":{name:"Bipa",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q864933"},addTags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"},removeTags:{brand:"Bipa","brand:wikidata":"Q864933","brand:wikipedia":"de:Bipa",name:"Bipa",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Budnikowsky":{name:"Budnikowsky",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q1001516"},addTags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"},removeTags:{brand:"Budnikowsky","brand:wikidata":"Q1001516","brand:wikipedia":"de:Budnikowsky",name:"Budnikowsky",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Drogeria Natura":{name:"Drogeria Natura",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q9212032"},addTags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"},removeTags:{brand:"Drogeria Natura","brand:wikidata":"Q9212032","brand:wikipedia":"pl:Drogerie Natura",name:"Drogeria Natura",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Kruidvat":{name:"Kruidvat",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q2226366"},addTags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"},removeTags:{brand:"Kruidvat","brand:wikidata":"Q2226366","brand:wikipedia":"en:Kruidvat",name:"Kruidvat",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Matas":{name:"Matas",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q6786143"},addTags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"},removeTags:{brand:"Matas","brand:wikidata":"Q6786143","brand:wikipedia":"en:Matas (drug store)",name:"Matas",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/Rossmann":{name:"Rossmann",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q316004"},addTags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"},removeTags:{brand:"Rossmann","brand:wikidata":"Q316004","brand:wikipedia":"de:Dirk Rossmann GmbH",name:"Rossmann",shop:"chemist"},matchScore:2,suggestion:true},"shop/chemist/dm":{name:"dm",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chemist","brand:wikidata":"Q266572"},addTags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"},removeTags:{brand:"dm","brand:wikidata":"Q266572","brand:wikipedia":"en:Dm-drogerie markt",name:"dm",shop:"chemist"},matchScore:2,suggestion:true},"shop/chocolate/Cacau Show":{name:"Cacau Show",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chocolate","brand:wikidata":"Q9671713"},addTags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau show",name:"Cacau Show",shop:"chocolate"},removeTags:{brand:"Cacau Show","brand:wikidata":"Q9671713","brand:wikipedia":"en:Cacau show",name:"Cacau Show",shop:"chocolate"},matchScore:2,suggestion:true},"shop/chocolate/Leonidas":{name:"Leonidas",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"chocolate","brand:wikidata":"Q80335"},addTags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"},removeTags:{brand:"Leonidas","brand:wikidata":"Q80335","brand:wikipedia":"en:Leonidas (chocolate maker)",name:"Leonidas",shop:"chocolate"},matchScore:2,suggestion:true},"shop/clothes/Abercrombie & Fitch":{name:"Abercrombie & Fitch",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q319344"},addTags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",name:"Abercrombie & Fitch",shop:"clothes"},removeTags:{brand:"Abercrombie & Fitch","brand:wikidata":"Q319344","brand:wikipedia":"en:Abercrombie & Fitch",name:"Abercrombie & Fitch",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Accessorize":{name:"Accessorize",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3069980"},addTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"},removeTags:{brand:"Accessorize","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Accessorize",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ackermans":{name:"Ackermans",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4674255"},addTags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"},removeTags:{brand:"Ackermans","brand:wikidata":"Q4674255","brand:wikipedia":"en:Ackermans",name:"Ackermans",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Aeropostale":{name:"Aeropostale",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q794565"},addTags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",name:"Aeropostale",shop:"clothes"},removeTags:{brand:"Aeropostale","brand:wikidata":"Q794565","brand:wikipedia":"en:Aéropostale (clothing)",name:"Aeropostale",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/American Apparel":{name:"American Apparel",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q463378"},addTags:{brand:"American Apparel","brand:wikidata":"Q463378","brand:wikipedia":"en:American Apparel",name:"American Apparel",shop:"clothes"},removeTags:{brand:"American Apparel","brand:wikidata":"Q463378","brand:wikipedia":"en:American Apparel",name:"American Apparel",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/American Eagle Outfitters":{name:"American Eagle Outfitters",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2842931"},addTags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",name:"American Eagle Outfitters",shop:"clothes"},removeTags:{brand:"American Eagle Outfitters","brand:wikidata":"Q2842931","brand:wikipedia":"en:American Eagle Outfitters",name:"American Eagle Outfitters",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Anthropologie":{name:"Anthropologie",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4773903"},addTags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",name:"Anthropologie",shop:"clothes"},removeTags:{brand:"Anthropologie","brand:wikidata":"Q4773903","brand:wikipedia":"en:Anthropologie",name:"Anthropologie",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ardene":{name:"Ardene",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2860764"},addTags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"},removeTags:{brand:"Ardene","brand:wikidata":"Q2860764","brand:wikipedia":"en:Ardene",name:"Ardene",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Banana Republic":{name:"Banana Republic",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q806085"},addTags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",name:"Banana Republic",shop:"clothes"},removeTags:{brand:"Banana Republic","brand:wikidata":"Q806085","brand:wikipedia":"en:Banana Republic",name:"Banana Republic",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Bershka":{name:"Bershka",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q827258"},addTags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"},removeTags:{brand:"Bershka","brand:wikidata":"Q827258","brand:wikipedia":"en:Bershka",name:"Bershka",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Brooks Brothers":{name:"Brooks Brothers",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q929722"},addTags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"},removeTags:{brand:"Brooks Brothers","brand:wikidata":"Q929722","brand:wikipedia":"en:Brooks Brothers",name:"Brooks Brothers",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burberry":{name:"Burberry",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q390107"},addTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",name:"Burberry",shop:"clothes"},removeTags:{brand:"Burberry","brand:wikidata":"Q390107","brand:wikipedia":"en:Burberry",name:"Burberry",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burlington Coat Factory":{name:"Burlington Coat Factory",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4999220"},addTags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"},removeTags:{brand:"Burlington Coat Factory","brand:wikidata":"Q4999220","brand:wikipedia":"en:Burlington (department store)",name:"Burlington Coat Factory",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Burton":{name:"Burton",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5000795"},addTags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"},removeTags:{brand:"Burton","brand:wikidata":"Q5000795","brand:wikipedia":"en:Burton (retailer)",name:"Burton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/C&A":{name:"C&A",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q701338"},addTags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"},removeTags:{brand:"C&A","brand:wikidata":"Q701338","brand:wikipedia":"en:C&A",name:"C&A",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Calvin Klein":{name:"Calvin Klein",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1068628"},addTags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein",name:"Calvin Klein",shop:"clothes"},removeTags:{brand:"Calvin Klein","brand:wikidata":"Q1068628","brand:wikipedia":"en:Calvin Klein",name:"Calvin Klein",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Calzedonia":{name:"Calzedonia",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1027874"},addTags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"},removeTags:{brand:"Calzedonia","brand:wikidata":"Q1027874","brand:wikipedia":"en:Calzedonia",name:"Calzedonia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Camaïeu":{name:"Camaïeu",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2934647"},addTags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"},removeTags:{brand:"Camaïeu","brand:wikidata":"Q2934647","brand:wikipedia":"en:Camaïeu (company)",name:"Camaïeu",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Camp David":{name:"Camp David",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q50540636"},addTags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"},removeTags:{brand:"Camp David","brand:wikidata":"Q50540636","brand:wikipedia":"en:Camp David (fashion)",name:"Camp David",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Carter's":{name:"Carter's",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5047083"},addTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"},removeTags:{brand:"Carter's","brand:wikidata":"Q5047083","brand:wikipedia":"en:Carter's",name:"Carter's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Celio":{name:"Celio",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2672003"},addTags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"},removeTags:{brand:"Celio","brand:wikidata":"Q2672003","brand:wikipedia":"en:Celio (retailer)",name:"Celio",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Charles Vögele":{name:"Charles Vögele",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1066326"},addTags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes"},removeTags:{brand:"Charles Vögele","brand:wikidata":"Q1066326","brand:wikipedia":"de:Charles Vögele Holding",name:"Charles Vögele",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Charlotte Russe":{name:"Charlotte Russe",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5086126"},addTags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"},removeTags:{brand:"Charlotte Russe","brand:wikidata":"Q5086126","brand:wikipedia":"en:Charlotte Russe (clothing retailer)",name:"Charlotte Russe",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Chico's":{name:"Chico's",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5096393"},addTags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"},removeTags:{brand:"Chico's","brand:wikidata":"Q5096393","brand:wikipedia":"en:Chico's (clothing retailer)",name:"Chico's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Christopher & Banks":{name:"Christopher & Banks",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5111816"},addTags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"},removeTags:{brand:"Christopher & Banks","brand:wikidata":"Q5111816","brand:wikipedia":"en:Christopher & Banks",name:"Christopher & Banks",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Columbia":{name:"Columbia",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1112588"},addTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",shop:"clothes"},removeTags:{brand:"Columbia","brand:wikidata":"Q1112588","brand:wikipedia":"en:Columbia Sportswear",name:"Columbia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Cubus":{name:"Cubus",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3439593"},addTags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"},removeTags:{brand:"Cubus","brand:wikidata":"Q3439593","brand:wikipedia":"no:Cubus",name:"Cubus",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/David's Bridal":{name:"David's Bridal",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5230388"},addTags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",name:"David's Bridal",shop:"clothes"},removeTags:{brand:"David's Bridal","brand:wikidata":"Q5230388","brand:wikipedia":"en:David's Bridal",name:"David's Bridal",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Desigual":{name:"Desigual",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q83750"},addTags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"},removeTags:{brand:"Desigual","brand:wikidata":"Q83750","brand:wikipedia":"en:Desigual",name:"Desigual",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Diesel":{name:"Diesel",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q158285"},addTags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"},removeTags:{brand:"Diesel","brand:wikidata":"Q158285","brand:wikipedia":"en:Diesel (brand)",name:"Diesel",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dorothy Perkins":{name:"Dorothy Perkins",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5298588"},addTags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"},removeTags:{brand:"Dorothy Perkins","brand:wikidata":"Q5298588","brand:wikipedia":"en:Dorothy Perkins",name:"Dorothy Perkins",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dress Barn":{name:"Dress Barn",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5307031"},addTags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"},removeTags:{brand:"Dress Barn","brand:wikidata":"Q5307031","brand:wikipedia":"en:Ascena Retail Group",name:"Dress Barn",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Dressmann":{name:"Dressmann",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3357081"},addTags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"},removeTags:{brand:"Dressmann","brand:wikidata":"Q3357081","brand:wikipedia":"en:Dressmann",name:"Dressmann",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Eddie Bauer":{name:"Eddie Bauer",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q842174"},addTags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"},removeTags:{brand:"Eddie Bauer","brand:wikidata":"Q842174","brand:wikipedia":"en:Eddie Bauer",name:"Eddie Bauer",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Engbers":{name:"Engbers",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1290088"},addTags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"},removeTags:{brand:"Engbers","brand:wikidata":"Q1290088","brand:wikipedia":"de:Engbers",name:"Engbers",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ernsting's family":{name:"Ernsting's family",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1361016"},addTags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"},removeTags:{brand:"Ernsting's family","brand:wikidata":"Q1361016","brand:wikipedia":"de:Ernsting’s family",name:"Ernsting's family",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Esprit":{name:"Esprit",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q532746"},addTags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"},removeTags:{brand:"Esprit","brand:wikidata":"Q532746","brand:wikipedia":"en:Esprit Holdings",name:"Esprit",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Etam":{name:"Etam",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3059202"},addTags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"},removeTags:{brand:"Etam","brand:wikidata":"Q3059202","brand:wikipedia":"en:Etam Développement",name:"Etam",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Fat Face":{name:"Fat Face",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q5437186"},addTags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"},removeTags:{brand:"Fat Face","brand:wikidata":"Q5437186","brand:wikipedia":"en:Fat Face",name:"Fat Face",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Forever 21":{name:"Forever 21",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1060537"},addTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"},removeTags:{brand:"Forever 21","brand:wikidata":"Q1060537","brand:wikipedia":"en:Forever 21",name:"Forever 21",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gant":{name:"Gant",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1493667"},addTags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"},removeTags:{brand:"Gant","brand:wikidata":"Q1493667","brand:wikipedia":"en:Gant (retailer)",name:"Gant",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gap":{name:"Gap",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q420822"},addTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"},removeTags:{brand:"Gap","brand:wikidata":"Q420822","brand:wikipedia":"en:Gap Inc.",name:"Gap",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gerry Weber":{name:"Gerry Weber",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q873447"},addTags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"},removeTags:{brand:"Gerry Weber","brand:wikidata":"Q873447","brand:wikipedia":"en:Gerry Weber",name:"Gerry Weber",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gina Laura":{name:"Gina Laura",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2700576"},addTags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"},removeTags:{brand:"Gina Laura","brand:wikidata":"Q2700576","brand:wikipedia":"de:Gina Laura",name:"Gina Laura",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gucci":{name:"Gucci",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q178516"},addTags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"},removeTags:{brand:"Gucci","brand:wikidata":"Q178516","brand:wikipedia":"en:Gucci",name:"Gucci",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Guess":{name:"Guess",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2470307"},addTags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"},removeTags:{brand:"Guess","brand:wikidata":"Q2470307","brand:wikipedia":"en:Guess (clothing)",name:"Guess",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Gymboree":{name:"Gymboree",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q4039771"},addTags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"},removeTags:{brand:"Gymboree","brand:wikidata":"Q4039771","brand:wikipedia":"en:Gymboree",name:"Gymboree",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/H&M":{name:"H&M",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q188326"},addTags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"},removeTags:{brand:"H&M","brand:wikidata":"Q188326","brand:wikipedia":"en:H&M",name:"H&M",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hallhuber":{name:"Hallhuber",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1571714"},addTags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"},removeTags:{brand:"Hallhuber","brand:wikidata":"Q1571714","brand:wikipedia":"de:Hallhuber (Bekleidungshaus)",name:"Hallhuber",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hollister":{name:"Hollister",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1257477"},addTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",shop:"clothes"},removeTags:{brand:"Hollister","brand:wikidata":"Q1257477","brand:wikipedia":"en:Hollister Co.",name:"Hollister",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hot Topic":{name:"Hot Topic",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q9294032"},addTags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"},removeTags:{brand:"Hot Topic","brand:wikidata":"Q9294032","brand:wikipedia":"en:Hot Topic",name:"Hot Topic",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hugo Boss":{name:"Hugo Boss",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q491627"},addTags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes"},removeTags:{brand:"Hugo Boss","brand:wikidata":"Q491627","brand:wikipedia":"en:Hugo Boss",name:"Hugo Boss",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Hunkemöller":{name:"Hunkemöller",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2604175"},addTags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"},removeTags:{brand:"Hunkemöller","brand:wikidata":"Q2604175","brand:wikipedia":"en:Hunkemöller",name:"Hunkemöller",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Intimissimi":{name:"Intimissimi",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q305404"},addTags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"},removeTags:{brand:"Intimissimi","brand:wikidata":"Q305404","brand:wikipedia":"en:Intimissimi",clothes:"underwear",name:"Intimissimi",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Jack & Jones":{name:"Jack & Jones",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6077665"},addTags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"},removeTags:{brand:"Jack & Jones","brand:wikidata":"Q6077665","brand:wikipedia":"en:Jack & Jones",name:"Jack & Jones",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Joules":{name:"Joules",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q25351738"},addTags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"},removeTags:{brand:"Joules","brand:wikidata":"Q25351738","brand:wikipedia":"en:Joules (clothing)",name:"Joules",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/KiK":{name:"KiK",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q883965"},addTags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"},removeTags:{brand:"KiK","brand:wikidata":"Q883965","brand:wikipedia":"en:KiK",name:"KiK",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/La Senza":{name:"La Senza",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3212802"},addTags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"},removeTags:{brand:"La Senza","brand:wikidata":"Q3212802","brand:wikipedia":"en:La Senza",name:"La Senza",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lacoste":{name:"Lacoste",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q309031"},addTags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"},removeTags:{brand:"Lacoste","brand:wikidata":"Q309031","brand:wikipedia":"en:Lacoste",name:"Lacoste",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lane Bryant":{name:"Lane Bryant",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6485350"},addTags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",name:"Lane Bryant",shop:"clothes"},removeTags:{brand:"Lane Bryant","brand:wikidata":"Q6485350","brand:wikipedia":"en:Lane Bryant",name:"Lane Bryant",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Levi's":{name:"Levi's",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q127962"},addTags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",name:"Levi's",shop:"clothes"},removeTags:{brand:"Levi's","brand:wikidata":"Q127962","brand:wikipedia":"en:Levi Strauss & Co.",name:"Levi's",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Lindex":{name:"Lindex",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1786717"},addTags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"},removeTags:{brand:"Lindex","brand:wikidata":"Q1786717","brand:wikipedia":"en:Lindex",name:"Lindex",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Louis Vuitton":{name:"Louis Vuitton",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q191485"},addTags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"},removeTags:{brand:"Louis Vuitton","brand:wikidata":"Q191485","brand:wikipedia":"en:Louis Vuitton",name:"Louis Vuitton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/M&Co":{name:"M&Co",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6711808"},addTags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"},removeTags:{brand:"M&Co","brand:wikidata":"Q6711808","brand:wikipedia":"en:M&Co.",name:"M&Co",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mango":{name:"Mango",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q136503"},addTags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"},removeTags:{brand:"Mango","brand:wikidata":"Q136503","brand:wikipedia":"en:Mango (retailer)",name:"Mango",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Marc O'Polo":{name:"Marc O'Polo",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1892752"},addTags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"},removeTags:{brand:"Marc O'Polo","brand:wikidata":"Q1892752","brand:wikipedia":"en:Marc O'Polo",name:"Marc O'Polo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Massimo Dutti":{name:"Massimo Dutti",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q788231"},addTags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"},removeTags:{brand:"Massimo Dutti","brand:wikidata":"Q788231","brand:wikipedia":"en:Massimo Dutti",name:"Massimo Dutti",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Matalan":{name:"Matalan",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q12061509"},addTags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"},removeTags:{brand:"Matalan","brand:wikidata":"Q12061509","brand:wikipedia":"en:Matalan",name:"Matalan",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Maurices":{name:"Maurices",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6793571"},addTags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"},removeTags:{brand:"Maurices","brand:wikidata":"Q6793571","brand:wikipedia":"en:Maurices",name:"Maurices",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Max Mara":{name:"Max Mara",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1151774"},addTags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"},removeTags:{brand:"Max Mara","brand:wikidata":"Q1151774","brand:wikipedia":"en:Max Mara",name:"Max Mara",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Men's Wearhouse":{name:"Men's Wearhouse",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q57405513"},addTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",name:"Men's Wearhouse",shop:"clothes"},removeTags:{brand:"Men's Wearhouse","brand:wikidata":"Q57405513",name:"Men's Wearhouse",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Mexx":{name:"Mexx",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1837290"},addTags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"},removeTags:{brand:"Mexx","brand:wikidata":"Q1837290","brand:wikipedia":"en:Mexx",name:"Mexx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Michael Kors":{name:"Michael Kors",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q19572998"},addTags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Michael Kors (brand)",name:"Michael Kors",shop:"clothes"},removeTags:{brand:"Michael Kors","brand:wikidata":"Q19572998","brand:wikipedia":"en:Michael Kors (brand)",name:"Michael Kors",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Monsoon":{name:"Monsoon",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3069980"},addTags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"},removeTags:{brand:"Monsoon","brand:wikidata":"Q3069980","brand:wikipedia":"en:Monsoon Accessorize",name:"Monsoon",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/NKD":{name:"NKD",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q927272"},addTags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"},removeTags:{brand:"NKD","brand:wikidata":"Q927272","brand:wikipedia":"de:NKD",name:"NKD",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/New Look":{name:"New Look",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q12063852"},addTags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"},removeTags:{brand:"New Look","brand:wikidata":"Q12063852","brand:wikipedia":"en:New Look (company)",name:"New Look",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/New Yorker":{name:"New Yorker",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q706421"},addTags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:NewYorker",name:"New Yorker",shop:"clothes"},removeTags:{brand:"New Yorker","brand:wikidata":"Q706421","brand:wikipedia":"en:NewYorker",name:"New Yorker",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Next":{name:"Next",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q246655"},addTags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"},removeTags:{brand:"Next","brand:wikidata":"Q246655","brand:wikipedia":"en:Next plc",name:"Next",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Nike":{name:"Nike",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q483915"},addTags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"},removeTags:{brand:"Nike","brand:wikidata":"Q483915","brand:wikipedia":"en:Nike, Inc.",name:"Nike",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Nordstrom Rack":{name:"Nordstrom Rack",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q21463374"},addTags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"},removeTags:{brand:"Nordstrom Rack","brand:wikidata":"Q21463374","brand:wikipedia":"en:Nordstrom Rack",name:"Nordstrom Rack",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/OVS":{name:"OVS",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2042514"},addTags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"},removeTags:{brand:"OVS","brand:wikidata":"Q2042514","brand:wikipedia":"en:OVS (company)",name:"OVS",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Old Navy":{name:"Old Navy",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2735242"},addTags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"},removeTags:{brand:"Old Navy","brand:wikidata":"Q2735242","brand:wikipedia":"en:Old Navy",name:"Old Navy",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Outfit":{name:"Outfit",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7112061"},addTags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"},removeTags:{brand:"Outfit","brand:wikidata":"Q7112061","brand:wikipedia":"en:Outfit (retailer)",name:"Outfit",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Oysho":{name:"Oysho",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3327046"},addTags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"},removeTags:{brand:"Oysho","brand:wikidata":"Q3327046","brand:wikipedia":"en:Oysho",name:"Oysho",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Peacocks":{name:"Peacocks",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7157762"},addTags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"},removeTags:{brand:"Peacocks","brand:wikidata":"Q7157762","brand:wikipedia":"en:Peacocks (clothing)",name:"Peacocks",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Peek & Cloppenburg":{name:"Peek & Cloppenburg",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2066959"},addTags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"},removeTags:{brand:"Peek & Cloppenburg","brand:wikidata":"Q2066959","brand:wikipedia":"en:Peek & Cloppenburg",name:"Peek & Cloppenburg",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pep":{name:"Pep",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7166182"},addTags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"},removeTags:{brand:"Pep","brand:wikidata":"Q7166182","brand:wikipedia":"en:Pep (store)",name:"Pep",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pepco":{name:"Pepco",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q11815580"},addTags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"},removeTags:{brand:"Pepco","brand:wikidata":"Q11815580","brand:wikipedia":"pl:Pepco",name:"Pepco",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Petit Bateau":{name:"Petit Bateau",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3377090"},addTags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"},removeTags:{brand:"Petit Bateau","brand:wikidata":"Q3377090","brand:wikipedia":"en:Petit Bateau",name:"Petit Bateau",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Phase Eight":{name:"Phase Eight",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q17020730"},addTags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"},removeTags:{brand:"Phase Eight","brand:wikidata":"Q17020730","brand:wikipedia":"en:Phase Eight",name:"Phase Eight",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pimkie":{name:"Pimkie",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1758066"},addTags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"},removeTags:{brand:"Pimkie","brand:wikidata":"Q1758066","brand:wikipedia":"en:Pimkie",name:"Pimkie",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Primark":{name:"Primark",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q137023"},addTags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"},removeTags:{brand:"Primark","brand:wikidata":"Q137023","brand:wikipedia":"en:Primark",name:"Primark",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Promod":{name:"Promod",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3407429"},addTags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"},removeTags:{brand:"Promod","brand:wikidata":"Q3407429","brand:wikipedia":"en:Promod",name:"Promod",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Pull & Bear":{name:"Pull & Bear",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q691029"},addTags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"},removeTags:{brand:"Pull & Bear","brand:wikidata":"Q691029","brand:wikipedia":"en:Pull&Bear",name:"Pull & Bear",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Reitmans":{name:"Reitmans",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7310506"},addTags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"},removeTags:{brand:"Reitmans","brand:wikidata":"Q7310506","brand:wikipedia":"en:Reitmans",name:"Reitmans",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Reserved":{name:"Reserved",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q21809354"},addTags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved (retail)",name:"Reserved",shop:"clothes"},removeTags:{brand:"Reserved","brand:wikidata":"Q21809354","brand:wikipedia":"en:Reserved (retail)",name:"Reserved",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/River Island":{name:"River Island",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2670328"},addTags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"},removeTags:{brand:"River Island","brand:wikidata":"Q2670328","brand:wikipedia":"en:River Island",name:"River Island",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ross":{name:"Ross",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3442791"},addTags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",shop:"clothes"},removeTags:{brand:"Ross","brand:wikidata":"Q3442791","brand:wikipedia":"en:Ross Stores",name:"Ross",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Stradivarius":{name:"Stradivarius",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3322945"},addTags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"},removeTags:{brand:"Stradivarius","brand:wikidata":"Q3322945","brand:wikipedia":"en:Stradivarius (clothing brand)",name:"Stradivarius",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Suburbia":{name:"Suburbia",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q6134992"},addTags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"},removeTags:{brand:"Suburbia","brand:wikidata":"Q6134992","brand:wikipedia":"en:Suburbia (department store)",name:"Suburbia",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Superdry":{name:"Superdry",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1684445"},addTags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"},removeTags:{brand:"Superdry","brand:wikidata":"Q1684445","brand:wikipedia":"en:Superdry",name:"Superdry",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/TJ Maxx":{name:"TJ Maxx",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q10860683"},addTags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"},removeTags:{brand:"TJ Maxx","brand:wikidata":"Q10860683","brand:wikipedia":"en:TJ Maxx",name:"TJ Maxx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/TK Maxx":{name:"TK Maxx",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q23823668"},addTags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"},removeTags:{brand:"TK Maxx","brand:wikidata":"Q23823668","brand:wikipedia":"en:TK Maxx",name:"TK Maxx",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Takko":{name:"Takko",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1371302"},addTags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"},removeTags:{brand:"Takko","brand:wikidata":"Q1371302","brand:wikipedia":"de:Takko",name:"Takko",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Talbots":{name:"Talbots",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7679064"},addTags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"},removeTags:{brand:"Talbots","brand:wikidata":"Q7679064","brand:wikipedia":"en:Talbots",name:"Talbots",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tally Weijl":{name:"Tally Weijl",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q689695"},addTags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"},removeTags:{brand:"Tally Weijl","brand:wikidata":"Q689695","brand:wikipedia":"en:Tally Weijl",name:"Tally Weijl",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/The Children's Place":{name:"The Children's Place",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3520257"},addTags:{brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"},removeTags:{brand:"The Children's Place","brand:wikidata":"Q3520257","brand:wikipedia":"en:The Children's Place",name:"The Children's Place",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/The North Face":{name:"The North Face",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q152784"},addTags:{brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"},removeTags:{brand:"The North Face","brand:wikidata":"Q152784","brand:wikipedia":"en:The North Face",name:"The North Face",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Timberland":{name:"Timberland",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1539185"},addTags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"},removeTags:{brand:"Timberland","brand:wikidata":"Q1539185","brand:wikipedia":"en:The Timberland Company",name:"Timberland",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tom Tailor":{name:"Tom Tailor",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q571206"},addTags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"},removeTags:{brand:"Tom Tailor","brand:wikidata":"Q571206","brand:wikipedia":"en:Tom Tailor",name:"Tom Tailor",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Tommy Hilfiger":{name:"Tommy Hilfiger",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q634881"},addTags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"},removeTags:{brand:"Tommy Hilfiger","brand:wikidata":"Q634881","brand:wikipedia":"en:Tommy Hilfiger (company)",name:"Tommy Hilfiger",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Topshop":{name:"Topshop",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1893576"},addTags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"},removeTags:{brand:"Topshop","brand:wikidata":"Q1893576","brand:wikipedia":"en:Topshop",name:"Topshop",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Torrid":{name:"Torrid",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7827120"},addTags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"},removeTags:{brand:"Torrid","brand:wikidata":"Q7827120","brand:wikipedia":"en:Torrid (clothing retailer)",name:"Torrid",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Truworths":{name:"Truworths",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q24233998"},addTags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"},removeTags:{brand:"Truworths","brand:wikidata":"Q24233998","brand:wikipedia":"en:Truworths",name:"Truworths",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Ulla Popken":{name:"Ulla Popken",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q2475146"},addTags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"},removeTags:{brand:"Ulla Popken","brand:wikidata":"Q2475146","brand:wikipedia":"en:Ulla Popken",name:"Ulla Popken",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Uniqlo":{name:"Uniqlo",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q26070"},addTags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"},removeTags:{brand:"Uniqlo","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"Uniqlo",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/United Colors of Benetton":{name:"United Colors of Benetton",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q817139"},addTags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes"},removeTags:{brand:"United Colors of Benetton","brand:wikidata":"Q817139","brand:wikipedia":"en:Benetton Group",name:"United Colors of Benetton",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Urban Outfitters":{name:"Urban Outfitters",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q3552193"},addTags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"},removeTags:{brand:"Urban Outfitters","brand:wikidata":"Q3552193","brand:wikipedia":"en:Urban Outfitters",name:"Urban Outfitters",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Victoria's Secret":{name:"Victoria's Secret",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q332477"},addTags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",name:"Victoria's Secret",shop:"clothes"},removeTags:{brand:"Victoria's Secret","brand:wikidata":"Q332477","brand:wikipedia":"en:Victoria's Secret",name:"Victoria's Secret",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/WE":{name:"WE",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q1987861"},addTags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"},removeTags:{brand:"WE","brand:wikidata":"Q1987861","brand:wikipedia":"en:WE (clothing)",name:"WE",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/White House Black Market":{name:"White House Black Market",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7994858"},addTags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"},removeTags:{brand:"White House Black Market","brand:wikidata":"Q7994858","brand:wikipedia":"en:White House Black Market",name:"White House Black Market",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/White Stuff":{name:"White Stuff",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7995442"},addTags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"},removeTags:{brand:"White Stuff","brand:wikidata":"Q7995442","brand:wikipedia":"en:White Stuff Clothing",name:"White Stuff",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Wibra":{name:"Wibra",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q943405"},addTags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"},removeTags:{brand:"Wibra","brand:wikidata":"Q943405","brand:wikipedia":"en:Wibra",name:"Wibra",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Winners":{name:"Winners",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q845257"},addTags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"},removeTags:{brand:"Winners","brand:wikidata":"Q845257","brand:wikipedia":"en:Winners",name:"Winners",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Woolworths":{name:"Woolworths",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q8033997"},addTags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths (South Africa)",name:"Woolworths",shop:"clothes"},removeTags:{brand:"Woolworths","brand:wikidata":"Q8033997","brand:wikipedia":"en:Woolworths (South Africa)",name:"Woolworths",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zara":{name:"Zara",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q147662"},addTags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"},removeTags:{brand:"Zara","brand:wikidata":"Q147662","brand:wikipedia":"en:Zara (retailer)",name:"Zara",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zeeman":{name:"Zeeman",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q184399"},addTags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"},removeTags:{brand:"Zeeman","brand:wikidata":"Q184399","brand:wikipedia":"en:Zeeman (store)",name:"Zeeman",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/Zumiez":{name:"Zumiez",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q8075252"},addTags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"},removeTags:{brand:"Zumiez","brand:wikidata":"Q8075252","brand:wikipedia":"en:Zumiez",name:"Zumiez",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/rue21":{name:"rue21",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q7377762"},addTags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:rue21",name:"rue21",shop:"clothes"},removeTags:{brand:"rue21","brand:wikidata":"Q7377762","brand:wikipedia":"en:rue21",name:"rue21",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/s.Oliver":{name:"s.Oliver",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q265056"},addTags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"},removeTags:{brand:"s.Oliver","brand:wikidata":"Q265056","brand:wikipedia":"en:S.Oliver",name:"s.Oliver",shop:"clothes"},matchScore:2,suggestion:true},"shop/clothes/ユニクロ":{name:"ユニクロ",icon:"maki-clothing-store",fields:["name","clothes","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"clothes","brand:wikidata":"Q26070"},addTags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO",shop:"clothes"},removeTags:{brand:"ユニクロ","brand:en":"UNIQLO","brand:wikidata":"Q26070","brand:wikipedia":"en:Uniqlo",name:"ユニクロ","name:en":"UNIQLO",shop:"clothes"},matchScore:2,suggestion:true},"shop/coffee/Nespresso":{name:"Nespresso",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"coffee","brand:wikidata":"Q301301"},addTags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"},removeTags:{brand:"Nespresso","brand:wikidata":"Q301301","brand:wikipedia":"en:Nespresso",name:"Nespresso",shop:"coffee"},matchScore:2,suggestion:true},"shop/coffee/Tchibo":{name:"Tchibo",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"coffee","brand:wikidata":"Q564213"},addTags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"},removeTags:{brand:"Tchibo","brand:wikidata":"Q564213","brand:wikipedia":"de:Tchibo",name:"Tchibo",shop:"coffee"},matchScore:2,suggestion:true},"shop/computer/PC World":{name:"PC World",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"computer","brand:wikidata":"Q7118727"},addTags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"},removeTags:{brand:"PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"PC World",shop:"computer"},matchScore:2,suggestion:true},"shop/confectionery/Adyar Ananda Bhavan":{name:"Adyar Ananda Bhavan",icon:"maki-confectionary",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q15178238"},addTags:{shop:"confectionery",brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan"},removeTags:{shop:"confectionery",brand:"Adyar Ananda Bhavan","brand:wikidata":"Q15178238","brand:wikipedia":"en:Adyar Ananda Bhavan",name:"Adyar Ananda Bhavan"},matchScore:2,suggestion:true},"shop/confectionery/Thorntons":{name:"Thorntons",icon:"maki-confectionary",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"confectionery","brand:wikidata":"Q683102"},addTags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"},removeTags:{brand:"Thorntons","brand:wikidata":"Q683102","brand:wikipedia":"en:Thorntons",name:"Thorntons",shop:"confectionery"},matchScore:2,suggestion:true},"shop/convenience/8 à Huit":{name:"8 à Huit",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2818601"},addTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"en:8 à Huit",name:"8 à Huit",shop:"convenience"},removeTags:{brand:"8 à Huit","brand:wikidata":"Q2818601","brand:wikipedia":"en:8 à Huit",name:"8 à Huit",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ABC":{name:"ABC",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q4650251"},addTags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"},removeTags:{brand:"ABC","brand:wikidata":"Q4650251","brand:wikipedia":"en:ABC Stores (Hawaii)",name:"ABC",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/BP Shop":{name:"BP Shop",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q152057"},addTags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"},removeTags:{brand:"BP Shop","brand:wikidata":"Q152057","brand:wikipedia":"en:BP",name:"BP Shop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/COOP Jednota":{name:"COOP Jednota",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q41629254"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"},removeTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Co-op":{name:"Co-op",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5440676"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"},removeTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/FamilyMart":{name:"FamilyMart",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"},removeTags:{brand:"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Hasty Market":{name:"Hasty Market",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q58022603"},addTags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"},removeTags:{brand:"Hasty Market","brand:wikidata":"Q58022603",name:"Hasty Market",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Intermarché Contact":{name:"Intermarché Contact",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché Contact",name:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",shop:"convenience"},removeTags:{brand:"Intermarché Contact",name:"Intermarché Contact","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Kwik Trip":{name:"Kwik Trip",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q6450420"},addTags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"},removeTags:{brand:"Kwik Trip","brand:wikidata":"Q6450420","brand:wikipedia":"en:Kwik Trip",name:"Kwik Trip",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Lawson":{name:"Lawson",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1557223"},addTags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"},removeTags:{brand:"Lawson","brand:wikidata":"Q1557223","brand:wikipedia":"en:Lawson (store)",name:"Lawson",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Marathon":{name:"Marathon",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q458363"},addTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},removeTags:{brand:"Marathon","brand:wikidata":"Q458363","brand:wikipedia":"en:Marathon Petroleum",name:"Marathon",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Małpka Express":{name:"Małpka Express",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q18431946"},addTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"en:Małpka Express",name:"Małpka Express",shop:"convenience"},removeTags:{brand:"Małpka Express","brand:wikidata":"Q18431946","brand:wikipedia":"en:Małpka Express",name:"Małpka Express",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/McColl's":{name:"McColl's",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16997477"},addTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},removeTags:{brand:"McColl's","brand:wikidata":"Q16997477","brand:wikipedia":"en:McColl's",name:"McColl's",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Ministop":{name:"Ministop",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1038929"},addTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},removeTags:{brand:"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"en:Ministop",name:"Ministop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Mobil Mart":{name:"Mobil Mart",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3088656"},addTags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"},removeTags:{brand:"Mobil Mart","brand:wikidata":"Q3088656","brand:wikipedia":"en:Mobil",name:"Mobil Mart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/On the Run":{name:"On the Run",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q16931259"},addTags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"},removeTags:{brand:"On the Run","brand:wikidata":"Q16931259","brand:wikipedia":"en:On the Run (convenience store)",name:"On the Run",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Oxxo":{name:"Oxxo",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1342538"},addTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"},removeTags:{brand:"Oxxo","brand:wikidata":"Q1342538","brand:wikipedia":"es:Oxxo",name:"Oxxo",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Plaid Pantry":{name:"Plaid Pantry",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7200591"},addTags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"},removeTags:{brand:"Plaid Pantry","brand:wikidata":"Q7200591","brand:wikipedia":"en:Plaid Pantry",name:"Plaid Pantry",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Sheetz":{name:"Sheetz",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7492551"},addTags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"},removeTags:{brand:"Sheetz","brand:wikidata":"Q7492551","brand:wikipedia":"en:Sheetz",name:"Sheetz",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Shell Select":{name:"Shell Select",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q154950"},addTags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"},removeTags:{brand:"Shell Select","brand:wikidata":"Q154950","brand:wikipedia":"en:Royal Dutch Shell",name:"Shell Select",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Speedway":{name:"Speedway",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7575683"},addTags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"},removeTags:{brand:"Speedway","brand:wikidata":"Q7575683","brand:wikipedia":"en:Speedway LLC",name:"Speedway",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/The Co-operative Food":{name:"The Co-operative Food",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3277439"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"},removeTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Tiger Mart":{name:"Tiger Mart",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q57643977"},addTags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"},removeTags:{brand:"Tiger Mart","brand:wikidata":"Q57643977",name:"Tiger Mart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/United Dairy Farmers":{name:"United Dairy Farmers",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7887677"},addTags:{brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience"},removeTags:{brand:"United Dairy Farmers","brand:wikidata":"Q7887677","brand:wikipedia":"en:United Dairy Farmers",name:"United Dairy Farmers",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Utile":{name:"Utile",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2529029"},addTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},removeTags:{brand:"Utile","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Utile",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Wawa":{name:"Wawa",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5936320"},addTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},removeTags:{brand:"Wawa","brand:wikidata":"Q5936320","brand:wikipedia":"en:Wawa (company)",name:"Wawa",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Woolworths Petrol":{name:"Woolworths Petrol",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5023980"},addTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},removeTags:{brand:"Caltex","brand:wikidata":"Q5023980","brand:wikipedia":"en:Caltex Woolworths",name:"Woolworths Petrol",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/abc":{name:"abc",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11683985"},addTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:abc (sieć handlowa)",name:"abc",shop:"convenience"},removeTags:{brand:"abc","brand:wikidata":"Q11683985","brand:wikipedia":"pl:abc (sieć handlowa)",name:"abc",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ampm":{name:"ampm",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q306960"},addTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},removeTags:{brand:"ampm","brand:wikidata":"Q306960","brand:wikipedia":"en:Ampm",name:"ampm",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Żabka":{name:"Żabka",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q2589061"},addTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"en:Żabka (convenience store)",name:"Żabka",shop:"convenience"},removeTags:{brand:"Żabka","brand:wikidata":"Q2589061","brand:wikipedia":"en:Żabka (convenience store)",name:"Żabka",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Копейка":{name:"Копейка",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1783878"},addTags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"},removeTags:{brand:"Копейка","brand:en":"Kopeyka","brand:wikidata":"Q1783878","brand:wikipedia":"en:Kopeyka (supermarket)",name:"Копейка","name:en":"Kopeyka",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/Магнит":{name:"Магнит",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q940518"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"},removeTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/サークルK":{name:"サークルK",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q3268010"},addTags:{brand:"サークルK","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K",shop:"convenience"},removeTags:{brand:"サークルK","brand:en":"Circle K","brand:wikidata":"Q3268010","brand:wikipedia":"en:Circle K",name:"サークルK","name:en":"Circle K",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セイコーマート":{name:"セイコーマート",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11314123"},addTags:{brand:"セイコーマート","brand:en":"Seicomart","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart",shop:"convenience"},removeTags:{brand:"セイコーマート","brand:en":"Seicomart","brand:wikidata":"Q11314123","brand:wikipedia":"ja:セイコーマート",name:"セイコーマート","name:en":"Seicomart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セブン-イレブン":{name:"セブン-イレブン",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q259340"},addTags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven",shop:"convenience"},removeTags:{brand:"セブン-イレブン","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"セブン-イレブン","name:en":"7-Eleven",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/セーブオン":{name:"セーブオン",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11314868"},addTags:{brand:"セーブオン","brand:en":"Save On","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On",shop:"convenience"},removeTags:{brand:"セーブオン","brand:en":"Save On","brand:wikidata":"Q11314868","brand:wikipedia":"ja:セーブオン",name:"セーブオン","name:en":"Save On",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/デイリーヤマザキ":{name:"デイリーヤマザキ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q5209392"},addTags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki",shop:"convenience"},removeTags:{brand:"デイリーヤマザキ","brand:en":"Daily Yamazaki","brand:wikidata":"Q5209392","brand:wikipedia":"en:Daily Yamazaki",name:"デイリーヤマザキ","name:en":"Daily Yamazaki",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ファミリーマート":{name:"ファミリーマート",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart",shop:"convenience"},removeTags:{brand:"ファミリーマート","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"ファミリーマート","name:en":"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ポプラ":{name:"ポプラ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q7229380"},addTags:{brand:"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar",shop:"convenience"},removeTags:{brand:"ポプラ","brand:wikidata":"Q7229380","brand:wikipedia":"ja:ポプラ (コンビニエンスストア)",name:"ポプラ","name:en":"Poplar",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ミニストップ":{name:"ミニストップ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1038929"},addTags:{brand:"ミニストップ","brand:en":"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop",shop:"convenience"},removeTags:{brand:"ミニストップ","brand:en":"Ministop","brand:wikidata":"Q1038929","brand:wikipedia":"ja:ミニストップ",name:"ミニストップ","name:en":"Ministop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ヤマザキショップ":{name:"ヤマザキショップ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11345131"},addTags:{brand:"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop",shop:"convenience"},removeTags:{brand:"ヤマザキショップ","brand:wikidata":"Q11345131","brand:wikipedia":"ja:ヤマザキショップ",name:"ヤマザキショップ","name:en":"Yamazaki Shop",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ローソン":{name:"ローソン",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1557223"},addTags:{brand:"ローソン","brand:en":"LAWSON","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson",shop:"convenience"},removeTags:{brand:"ローソン","brand:en":"LAWSON","brand:wikidata":"Q1557223","brand:wikipedia":"ja:ローソン",name:"ローソン","name:en":"Lawson",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/ローソンストア100":{name:"ローソンストア100",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q11350960"},addTags:{brand:"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100",shop:"convenience"},removeTags:{brand:"ローソンストア100","brand:wikidata":"Q11350960","brand:wikipedia":"ja:ローソンストア100",name:"ローソンストア100",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/全家":{name:"全家",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q1191685"},addTags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"},removeTags:{brand:"全家","brand:en":"FamilyMart","brand:wikidata":"Q1191685","brand:wikipedia":"en:FamilyMart",name:"全家","name:en":"FamilyMart",shop:"convenience"},matchScore:2,suggestion:true},"shop/convenience/세븐일레븐":{name:"세븐일레븐",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"convenience","brand:wikidata":"Q259340"},addTags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven",shop:"convenience"},removeTags:{brand:"세븐일레븐","brand:en":"7-Eleven","brand:wikidata":"Q259340","brand:wikipedia":"en:7-Eleven",name:"세븐일레븐","name:en":"7-Eleven",shop:"convenience"},matchScore:2,suggestion:true},"shop/cosmetics/Lush":{name:"Lush",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q1585448"},addTags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"},removeTags:{brand:"Lush","brand:wikidata":"Q1585448","brand:wikipedia":"en:Lush (company)",name:"Lush",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Sephora":{name:"Sephora",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q2408041"},addTags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"},removeTags:{brand:"Sephora","brand:wikidata":"Q2408041","brand:wikipedia":"en:Sephora",name:"Sephora",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/The Body Shop":{name:"The Body Shop",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q837851"},addTags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"},removeTags:{brand:"The Body Shop","brand:wikidata":"Q837851","brand:wikipedia":"en:The Body Shop",name:"The Body Shop",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Л'Этуаль":{name:"Л'Этуаль",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q18400706"},addTags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"},removeTags:{brand:"Л'Этуаль","brand:wikidata":"Q18400706","brand:wikipedia":"ru:Л’Этуаль",name:"Л'Этуаль",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/cosmetics/Магнит Косметик":{name:"Магнит Косметик",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"cosmetics","brand:wikidata":"Q940518"},addTags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"},removeTags:{brand:"Магнит Косметик","brand:en":"Magnit Cosmetics","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит Косметик","name:en":"Magnit Cosmetics",shop:"cosmetics"},matchScore:2,suggestion:true},"shop/country_store/Rural King":{name:"Rural King",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"country_store","brand:wikidata":"Q7380525"},addTags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"},removeTags:{brand:"Rural King","brand:wikidata":"Q7380525","brand:wikipedia":"en:Rural King",name:"Rural King",shop:"country_store"},matchScore:2,suggestion:true},"shop/country_store/Tractor Supply Company":{name:"Tractor Supply Company",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"country_store","brand:wikidata":"Q15109925"},addTags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"},removeTags:{brand:"Tractor Supply Company","brand:wikidata":"Q15109925","brand:wikipedia":"en:Tractor Supply Company",name:"Tractor Supply Company",shop:"country_store"},matchScore:2,suggestion:true},"shop/craft/Hobby Lobby":{name:"Hobby Lobby",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q5874938"},addTags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"},removeTags:{brand:"Hobby Lobby","brand:wikidata":"Q5874938","brand:wikipedia":"en:Hobby Lobby",name:"Hobby Lobby",shop:"craft"},matchScore:2,suggestion:true},"shop/craft/Michaels":{name:"Michaels",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"craft","brand:wikidata":"Q6835667"},addTags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"},removeTags:{brand:"Michaels","brand:wikidata":"Q6835667","brand:wikipedia":"en:Michaels",name:"Michaels",shop:"craft"},matchScore:2,suggestion:true},"shop/department_store/Belk":{name:"Belk",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q127428"},addTags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"},removeTags:{brand:"Belk","brand:wikidata":"Q127428","brand:wikipedia":"en:Belk",name:"Belk",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Big Lots":{name:"Big Lots",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4905973"},addTags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"},removeTags:{brand:"Big Lots","brand:wikidata":"Q4905973","brand:wikipedia":"en:Big Lots",name:"Big Lots",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Big W":{name:"Big W",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4906646"},addTags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"},removeTags:{brand:"Big W","brand:wikidata":"Q4906646","brand:wikipedia":"en:Big W",name:"Big W",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Canadian Tire":{name:"Canadian Tire",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1032400"},addTags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"},removeTags:{brand:"Canadian Tire","brand:wikidata":"Q1032400","brand:wikipedia":"en:Canadian Tire",name:"Canadian Tire",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Coppel":{name:"Coppel",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q2497795"},addTags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"},removeTags:{brand:"Coppel","brand:wikidata":"Q2497795","brand:wikipedia":"en:Coppel",name:"Coppel",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Debenhams":{name:"Debenhams",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1181484"},addTags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"},removeTags:{brand:"Debenhams","brand:wikidata":"Q1181484","brand:wikipedia":"en:Debenhams",name:"Debenhams",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Dillard's":{name:"Dillard's",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q844805"},addTags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"},removeTags:{brand:"Dillard's","brand:wikidata":"Q844805","brand:wikipedia":"en:Dillard's",name:"Dillard's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/El Corte Inglés":{name:"El Corte Inglés",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q623133"},addTags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"},removeTags:{brand:"El Corte Inglés","brand:wikidata":"Q623133","brand:wikipedia":"en:El Corte Inglés",name:"El Corte Inglés",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Galeria Kaufhof":{name:"Galeria Kaufhof",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q322598"},addTags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"},removeTags:{brand:"Galeria Kaufhof","brand:wikidata":"Q322598","brand:wikipedia":"en:Galeria Kaufhof",name:"Galeria Kaufhof",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Giant Tiger":{name:"Giant Tiger",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q5558429"},addTags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"},removeTags:{brand:"Giant Tiger","brand:wikidata":"Q5558429","brand:wikipedia":"en:Giant Tiger",name:"Giant Tiger",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/HEMA":{name:"HEMA",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q903805"},addTags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"},removeTags:{brand:"HEMA","brand:wikidata":"Q903805","brand:wikipedia":"en:HEMA (store)",name:"HEMA",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Harvey Norman":{name:"Harvey Norman",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q4040441"},addTags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"},removeTags:{brand:"Harvey Norman","brand:wikidata":"Q4040441","brand:wikipedia":"en:Harvey Norman",name:"Harvey Norman",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/JCPenney":{name:"JCPenney",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q920037"},addTags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"},removeTags:{brand:"JCPenney","brand:wikidata":"Q920037","brand:wikipedia":"en:J. C. Penney",name:"JCPenney",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Karstadt":{name:"Karstadt",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q182910"},addTags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"},removeTags:{brand:"Karstadt","brand:wikidata":"Q182910","brand:wikipedia":"en:Karstadt",name:"Karstadt",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Kmart":{name:"Kmart",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1753080"},addTags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"},removeTags:{brand:"Kmart","brand:wikidata":"Q1753080","brand:wikipedia":"en:Kmart",name:"Kmart",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Kohl's":{name:"Kohl's",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q967265"},addTags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"},removeTags:{brand:"Kohl's","brand:wikidata":"Q967265","brand:wikipedia":"en:Kohl's",name:"Kohl's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Lojas Americanas":{name:"Lojas Americanas",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q3064093"},addTags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"},removeTags:{brand:"Lojas Americanas","brand:wikidata":"Q3064093","brand:wikipedia":"en:Lojas Americanas",name:"Lojas Americanas",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Macy's":{name:"Macy's",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q629269"},addTags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"},removeTags:{brand:"Macy's","brand:wikidata":"Q629269","brand:wikipedia":"en:Macy's",name:"Macy's",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Marks & Spencer":{name:"Marks & Spencer",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q714491"},addTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"},removeTags:{brand:"Marks & Spencer","brand:wikidata":"Q714491","brand:wikipedia":"en:Marks & Spencer",name:"Marks & Spencer",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Marshalls":{name:"Marshalls",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q15903261"},addTags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"},removeTags:{brand:"Marshalls","brand:wikidata":"Q15903261","brand:wikipedia":"en:Marshalls",name:"Marshalls",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Myer":{name:"Myer",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1110323"},addTags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"},removeTags:{brand:"Myer","brand:wikidata":"Q1110323","brand:wikipedia":"en:Myer",name:"Myer",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Nordstrom":{name:"Nordstrom",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q174310"},addTags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"},removeTags:{brand:"Nordstrom","brand:wikidata":"Q174310","brand:wikipedia":"en:Nordstrom",name:"Nordstrom",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Sears":{name:"Sears",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q6499202"},addTags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"},removeTags:{brand:"Sears","brand:wikidata":"Q6499202","brand:wikipedia":"en:Sears",name:"Sears",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Shopko":{name:"Shopko",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q7501155"},addTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},removeTags:{brand:"Shopko","brand:wikidata":"Q7501155","brand:wikipedia":"en:Shopko",name:"Shopko",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Target (Australia)":{name:"Target (Australia)",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q7685854"},addTags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"},removeTags:{brand:"Target","brand:wikidata":"Q7685854","brand:wikipedia":"en:Target Australia",name:"Target",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Target (USA)":{name:"Target (USA)",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q1046951"},addTags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"},removeTags:{brand:"Target","brand:wikidata":"Q1046951","brand:wikipedia":"en:Target Corporation",name:"Target",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/The Warehouse":{name:"The Warehouse",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q3566291"},addTags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"},removeTags:{brand:"The Warehouse","brand:wikidata":"Q3566291","brand:wikipedia":"en:The Warehouse Group",name:"The Warehouse",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Walmart":{name:"Walmart",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"department_store"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Woolworth":{name:"Woolworth",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q183538"},addTags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"},removeTags:{brand:"Woolworth","brand:wikidata":"Q183538","brand:wikipedia":"de:Woolworth Deutschland",name:"Woolworth",shop:"department_store"},matchScore:2,suggestion:true},"shop/department_store/Åhléns":{name:"Åhléns",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"department_store","brand:wikidata":"Q270851"},addTags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"},removeTags:{brand:"Åhléns","brand:wikidata":"Q270851","brand:wikipedia":"sv:Åhléns",name:"Åhléns",shop:"department_store"},matchScore:2,suggestion:true},"shop/doityourself/Ace Hardware":{name:"Ace Hardware",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q4672981"},addTags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"},removeTags:{brand:"Ace Hardware","brand:wikidata":"Q4672981","brand:wikipedia":"en:Ace Hardware",name:"Ace Hardware",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/B&Q":{name:"B&Q",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q707602"},addTags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"},removeTags:{brand:"B&Q","brand:wikidata":"Q707602","brand:wikipedia":"en:B&Q",name:"B&Q",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bauhaus":{name:"Bauhaus",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q672043"},addTags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"},removeTags:{brand:"Bauhaus","brand:wikidata":"Q672043","brand:wikipedia":"en:Bauhaus (company)",name:"Bauhaus",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Biltema":{name:"Biltema",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3355552"},addTags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"},removeTags:{brand:"Biltema","brand:wikidata":"Q3355552","brand:wikipedia":"en:Biltema",name:"Biltema",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Brico":{name:"Brico",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2510786"},addTags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"},removeTags:{brand:"Brico","brand:wikidata":"Q2510786","brand:wikipedia":"en:Brico",name:"Brico",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Brico Dépôt":{name:"Brico Dépôt",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2889702"},addTags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"},removeTags:{brand:"Brico Dépôt","brand:wikidata":"Q2889702","brand:wikipedia":"en:Brico Dépôt",name:"Brico Dépôt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bricomarché":{name:"Bricomarché",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2925147"},addTags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"},removeTags:{brand:"Bricomarché","brand:wikidata":"Q2925147","brand:wikipedia":"en:Bricomarché",name:"Bricomarché",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bricorama":{name:"Bricorama",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2925146"},addTags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"},removeTags:{brand:"Bricorama","brand:wikidata":"Q2925146","brand:wikipedia":"en:Bricorama",name:"Bricorama",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Bunnings Warehouse":{name:"Bunnings Warehouse",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q4997829"},addTags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"},removeTags:{brand:"Bunnings Warehouse","brand:wikidata":"Q4997829","brand:wikipedia":"en:Bunnings Warehouse",name:"Bunnings Warehouse",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Castorama":{name:"Castorama",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q966971"},addTags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"},removeTags:{brand:"Castorama","brand:wikidata":"Q966971","brand:wikipedia":"en:Castorama",name:"Castorama",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Clas Ohlson":{name:"Clas Ohlson",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3356220"},addTags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"},removeTags:{brand:"Clas Ohlson","brand:wikidata":"Q3356220","brand:wikipedia":"en:Clas Ohlson",name:"Clas Ohlson",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Gamma":{name:"Gamma",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2294120"},addTags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"},removeTags:{brand:"Gamma","brand:wikidata":"Q2294120","brand:wikipedia":"en:Gamma (store)",name:"Gamma",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Globus Baumarkt":{name:"Globus Baumarkt",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q457503"},addTags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"},removeTags:{brand:"Globus Baumarkt","brand:wikidata":"Q457503","brand:wikipedia":"de:Globus Holding",name:"Globus Baumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hagebaumarkt":{name:"Hagebaumarkt",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1568279"},addTags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"},removeTags:{brand:"Hagebaumarkt","brand:wikidata":"Q1568279","brand:wikipedia":"de:Hagebau",name:"Hagebaumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hammer":{name:"Hammer",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q52159668"},addTags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"},removeTags:{brand:"Hammer","brand:wikidata":"Q52159668","brand:wikipedia":"de:Hammer (Fachmarktkette)",name:"Hammer",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hellweg":{name:"Hellweg",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1603084"},addTags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"},removeTags:{brand:"Hellweg","brand:wikidata":"Q1603084","brand:wikipedia":"de:Hellweg (Baumarkt)",name:"Hellweg",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Home Depot":{name:"Home Depot",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q864407"},addTags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"},removeTags:{brand:"Home Depot","brand:wikidata":"Q864407","brand:wikipedia":"en:The Home Depot",name:"Home Depot",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Homebase":{name:"Homebase",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q9293447"},addTags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"},removeTags:{brand:"Homebase","brand:wikidata":"Q9293447","brand:wikipedia":"en:Homebase",name:"Homebase",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hornbach":{name:"Hornbach",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q685926"},addTags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"},removeTags:{brand:"Hornbach","brand:wikidata":"Q685926","brand:wikipedia":"en:Hornbach (retailer)",name:"Hornbach",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Hubo":{name:"Hubo",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3142153"},addTags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"},removeTags:{brand:"Hubo","brand:wikidata":"Q3142153","brand:wikipedia":"en:Hubo Belgium",name:"Hubo",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Jewson":{name:"Jewson",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q6190226"},addTags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"},removeTags:{brand:"Jewson","brand:wikidata":"Q6190226","brand:wikipedia":"en:Jewson",name:"Jewson",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Karwei":{name:"Karwei",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2097480"},addTags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"},removeTags:{brand:"Karwei","brand:wikidata":"Q2097480","brand:wikipedia":"en:Karwei",name:"Karwei",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Leroy Merlin":{name:"Leroy Merlin",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q889624"},addTags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"},removeTags:{brand:"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Leroy Merlin",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Lowe's":{name:"Lowe's",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1373493"},addTags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"},removeTags:{brand:"Lowe's","brand:wikidata":"Q1373493","brand:wikipedia":"en:Lowe's",name:"Lowe's",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Menards":{name:"Menards",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q1639897"},addTags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"},removeTags:{brand:"Menards","brand:wikidata":"Q1639897","brand:wikipedia":"en:Menards",name:"Menards",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Mr.Bricolage":{name:"Mr.Bricolage",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3141657"},addTags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"},removeTags:{brand:"Mr.Bricolage","brand:wikidata":"Q3141657","brand:wikipedia":"fr:Mr Bricolage",name:"Mr.Bricolage",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/OBI":{name:"OBI",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q300518"},addTags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"},removeTags:{brand:"OBI","brand:wikidata":"Q300518","brand:wikipedia":"en:Obi (store)",name:"OBI",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Praktiker":{name:"Praktiker",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q680214"},addTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},removeTags:{brand:"Praktiker","brand:wikidata":"Q680214","brand:wikipedia":"en:Praktiker",name:"Praktiker",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Rona":{name:"Rona",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q3415283"},addTags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"},removeTags:{brand:"Rona","brand:wikidata":"Q3415283","brand:wikipedia":"en:Rona, Inc.",name:"Rona",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Screwfix":{name:"Screwfix",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q7439115"},addTags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"},removeTags:{brand:"Screwfix","brand:wikidata":"Q7439115","brand:wikipedia":"en:Screwfix",name:"Screwfix",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Toom Baumarkt":{name:"Toom Baumarkt",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2442970"},addTags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"},removeTags:{brand:"Toom Baumarkt","brand:wikidata":"Q2442970","brand:wikipedia":"de:Toom Baumarkt",name:"Toom Baumarkt",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Travis Perkins":{name:"Travis Perkins",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q2450664"},addTags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"},removeTags:{brand:"Travis Perkins","brand:wikidata":"Q2450664","brand:wikipedia":"en:Travis Perkins",name:"Travis Perkins",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Wickes":{name:"Wickes",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q7998350"},addTags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"},removeTags:{brand:"Wickes","brand:wikidata":"Q7998350","brand:wikipedia":"en:Wickes",name:"Wickes",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/Леруа Мерлен":{name:"Леруа Мерлен",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q889624"},addTags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"},removeTags:{brand:"Леруа Мерлен","brand:en":"Leroy Merlin","brand:wikidata":"Q889624","brand:wikipedia":"en:Leroy Merlin",name:"Леруа Мерлен","name:en":"Leroy Merlin",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/コメリ":{name:"コメリ",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q11302690"},addTags:{brand:"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri",shop:"doityourself"},removeTags:{brand:"コメリ","brand:wikidata":"Q11302690","brand:wikipedia":"ja:コメリ",name:"コメリ","name:en":"Komeri",shop:"doityourself"},matchScore:2,suggestion:true},"shop/doityourself/コーナン":{name:"コーナン",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"doityourself","brand:wikidata":"Q11303403"},addTags:{brand:"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan",shop:"doityourself"},removeTags:{brand:"コーナン","brand:wikidata":"Q11303403","brand:wikipedia":"ja:コーナン",name:"コーナン","name:en":"Kohnan",shop:"doityourself"},matchScore:2,suggestion:true},"shop/electronics/Apple Store":{name:"Apple Store",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q421253"},addTags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"},removeTags:{brand:"Apple Store","brand:wikidata":"Q421253","brand:wikipedia":"en:Apple Store",name:"Apple Store",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Batteries Plus Bulbs":{name:"Batteries Plus Bulbs",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q17005157"},addTags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157",name:"Batteries Plus Bulbs",shop:"electronics"},removeTags:{brand:"Batteries Plus Bulbs","brand:wikidata":"Q17005157",name:"Batteries Plus Bulbs",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Best Buy":{name:"Best Buy",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q533415"},addTags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"},removeTags:{brand:"Best Buy","brand:wikidata":"Q533415","brand:wikipedia":"en:Best Buy",name:"Best Buy",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Boulanger":{name:"Boulanger",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2921695"},addTags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"},removeTags:{brand:"Boulanger","brand:wikidata":"Q2921695","brand:wikipedia":"fr:Boulanger (entreprise)",name:"Boulanger",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Currys":{name:"Currys",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3246464"},addTags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"},removeTags:{brand:"Currys","brand:wikidata":"Q3246464","brand:wikipedia":"en:Currys",name:"Currys",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Currys PC World":{name:"Currys PC World",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q7118727"},addTags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"},removeTags:{brand:"Currys PC World","brand:wikidata":"Q7118727","brand:wikipedia":"en:PC World (retailer)",name:"Currys PC World",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Darty":{name:"Darty",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3117381"},addTags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"},removeTags:{brand:"Darty","brand:wikidata":"Q3117381","brand:wikipedia":"en:Groupe Fnac Darty",name:"Darty",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Elgiganten":{name:"Elgiganten",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q17050121"},addTags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"},removeTags:{brand:"Elgiganten","brand:wikidata":"Q17050121","brand:wikipedia":"en:Elgiganten",name:"Elgiganten",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Euronics":{name:"Euronics",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q184860"},addTags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"},removeTags:{brand:"Euronics","brand:wikidata":"Q184860","brand:wikipedia":"en:Euronics",name:"Euronics",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Expert":{name:"Expert",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q680990"},addTags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"},removeTags:{brand:"Expert","brand:wikidata":"Q680990","brand:wikipedia":"en:Expert (company)",name:"Expert",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Hartlauer":{name:"Hartlauer",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1587223"},addTags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"},removeTags:{brand:"Hartlauer","brand:wikidata":"Q1587223","brand:wikipedia":"de:Hartlauer",name:"Hartlauer",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Interdiscount":{name:"Interdiscount",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1665980"},addTags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"},removeTags:{brand:"Interdiscount","brand:wikidata":"Q1665980","brand:wikipedia":"de:Interdiscount",name:"Interdiscount",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Kjell & Company":{name:"Kjell & Company",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6419332"},addTags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"},removeTags:{brand:"Kjell & Company","brand:wikidata":"Q6419332","brand:wikipedia":"en:Kjell & Company",name:"Kjell & Company",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Komputronik":{name:"Komputronik",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11742085"},addTags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"},removeTags:{brand:"Komputronik","brand:wikidata":"Q11742085","brand:wikipedia":"pl:Komputronik",name:"Komputronik",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Maplin":{name:"Maplin",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6754124"},addTags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"},removeTags:{brand:"Maplin","brand:wikidata":"Q6754124","brand:wikipedia":"en:Maplin (retailer)",name:"Maplin",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Media Markt":{name:"Media Markt",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2381223"},addTags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"},removeTags:{brand:"Media Markt","brand:wikidata":"Q2381223","brand:wikipedia":"en:Media Markt",name:"Media Markt",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Musimundo":{name:"Musimundo",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6034719"},addTags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"},removeTags:{brand:"Musimundo","brand:wikidata":"Q6034719","brand:wikipedia":"es:Musimundo",name:"Musimundo",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Neonet":{name:"Neonet",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11790622"},addTags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"},removeTags:{brand:"Neonet","brand:wikidata":"Q11790622","brand:wikipedia":"pl:Neonet",name:"Neonet",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/RTV Euro AGD":{name:"RTV Euro AGD",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q7277895"},addTags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"en:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"},removeTags:{brand:"RTV Euro AGD","brand:wikidata":"Q7277895","brand:wikipedia":"en:RTV Euro AGD",name:"RTV Euro AGD",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Radio Shack":{name:"Radio Shack",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1195490"},addTags:{brand:"Radio Shack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"Radio Shack",shop:"electronics"},removeTags:{brand:"Radio Shack","brand:wikidata":"Q1195490","brand:wikipedia":"en:RadioShack",name:"Radio Shack",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Samsung":{name:"Samsung",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q20718"},addTags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"},removeTags:{brand:"Samsung","brand:wikidata":"Q20718","brand:wikipedia":"en:Samsung Electronics",name:"Samsung",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Saturn":{name:"Saturn",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q2543504"},addTags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"},removeTags:{brand:"Saturn","brand:wikidata":"Q2543504","brand:wikipedia":"en:Saturn (retailer)",name:"Saturn",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Sony":{name:"Sony",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q41187"},addTags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"},removeTags:{brand:"Sony","brand:wikidata":"Q41187","brand:wikipedia":"en:Sony",name:"Sony",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Teknikmagasinet":{name:"Teknikmagasinet",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q3357520"},addTags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"},removeTags:{brand:"Teknikmagasinet","brand:wikidata":"Q3357520","brand:wikipedia":"en:Teknikmagasinet",name:"Teknikmagasinet",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Unieuro":{name:"Unieuro",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q4004687"},addTags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"},removeTags:{brand:"Unieuro","brand:wikidata":"Q4004687","brand:wikipedia":"en:Unieuro",name:"Unieuro",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/Worten":{name:"Worten",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q10394039"},addTags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"},removeTags:{brand:"Worten","brand:wikidata":"Q10394039","brand:wikipedia":"pt:Worten",name:"Worten",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/М.Видео":{name:"М.Видео",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q6558800"},addTags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"},removeTags:{brand:"М.Видео","brand:en":"M.video","brand:wikidata":"Q6558800","brand:wikipedia":"en:M.video",name:"М.Видео","name:en":"M.video",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/コジマ":{name:"コジマ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11302052"},addTags:{brand:"コジマ","brand:en":"Kojima","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima",shop:"electronics"},removeTags:{brand:"コジマ","brand:en":"Kojima","brand:wikidata":"Q11302052","brand:wikipedia":"ja:コジマ",name:"コジマ","name:en":"Kojima",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/ヤマダ電機":{name:"ヤマダ電機",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q1096390"},addTags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki",shop:"electronics"},removeTags:{brand:"ヤマダ電機","brand:en":"Yamada Denki","brand:wikidata":"Q1096390","brand:wikipedia":"en:Yamada Denki",name:"ヤマダ電機","name:en":"Yamada Denki",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/全國電子":{name:"全國電子",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q10891540"},addTags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"},removeTags:{brand:"全國電子","brand:en":"E-life Mall","brand:wikidata":"Q10891540","brand:wikipedia":"zh:全國電子",name:"全國電子","name:en":"E-life Mall",shop:"electronics"},matchScore:2,suggestion:true},"shop/electronics/燦坤3C":{name:"燦坤3C",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"electronics","brand:wikidata":"Q11569285"},addTags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"},removeTags:{brand:"燦坤3C","brand:en":"Tsannkuen 3C","brand:wikidata":"Q11569285","brand:wikipedia":"zh:燦坤",name:"燦坤3C","name:en":"Tsannkuen 3C",shop:"electronics"},matchScore:2,suggestion:true},"shop/erotic/Orion":{name:"Orion",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"erotic","brand:wikidata":"Q1609577"},addTags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"},removeTags:{brand:"Orion","brand:wikidata":"Q1609577","brand:wikipedia":"de:Orion (Erotik)",name:"Orion",shop:"erotic"},matchScore:2,suggestion:true},"shop/fabric/Mondial Tissus":{name:"Mondial Tissus",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"fabric","brand:wikidata":"Q17635288"},addTags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"},removeTags:{brand:"Mondial Tissus","brand:wikidata":"Q17635288","brand:wikipedia":"fr:Mondial Tissus",name:"Mondial Tissus",shop:"fabric"},matchScore:2,suggestion:true},"shop/florist/Blume 2000":{name:"Blume 2000",icon:"maki-florist",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q886166"},addTags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"},removeTags:{brand:"Blume 2000","brand:wikidata":"Q886166","brand:wikipedia":"de:Blume 2000",name:"Blume 2000",shop:"florist"},matchScore:2,suggestion:true},"shop/florist/Blumen Risse":{name:"Blumen Risse",icon:"maki-florist",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q886177"},addTags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"},removeTags:{brand:"Blumen Risse","brand:wikidata":"Q886177","brand:wikipedia":"de:Blumen Risse",name:"Blumen Risse",shop:"florist"},matchScore:2,suggestion:true},"shop/florist/Interflora":{name:"Interflora",icon:"maki-florist",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"florist","brand:wikidata":"Q692179"},addTags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"},removeTags:{brand:"Interflora","brand:wikidata":"Q692179","brand:wikipedia":"en:Interflora",name:"Interflora",shop:"florist"},matchScore:2,suggestion:true},"shop/funeral_directors/The Co-operative Funeralcare":{name:"The Co-operative Funeralcare",icon:"maki-cemetery",fields:["name","operator","address","building_area","religion","denomination"],geometry:["point","area"],tags:{shop:"funeral_directors","brand:wikidata":"Q7726521"},addTags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"},removeTags:{brand:"The Co-operative Funeralcare","brand:wikidata":"Q7726521","brand:wikipedia":"en:Co-op Funeralcare",name:"The Co-operative Funeralcare",shop:"funeral_directors"},matchScore:2,suggestion:true},"shop/furniture/Black Red White":{name:"Black Red White",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q4921546"},addTags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"},removeTags:{brand:"Black Red White","brand:wikidata":"Q4921546","brand:wikipedia":"en:Black Red White",name:"Black Red White",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Bodzio":{name:"Bodzio",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q20034845"},addTags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"},removeTags:{brand:"Bodzio","brand:wikidata":"Q20034845","brand:wikipedia":"pl:Fabryka Mebli Bodzio",name:"Bodzio",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/But":{name:"But",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q18720442"},addTags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"},removeTags:{brand:"But","brand:wikidata":"Q18720442","brand:wikipedia":"en:BUT (retailer)",name:"But",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Conforama":{name:"Conforama",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q541134"},addTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},removeTags:{brand:"Conforama","brand:wikidata":"Q541134","brand:wikipedia":"en:Conforama",name:"Conforama",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/DFS":{name:"DFS",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5204927"},addTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},removeTags:{brand:"DFS","brand:wikidata":"Q5204927","brand:wikipedia":"en:DFS Furniture",name:"DFS",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Dänisches Bettenlager":{name:"Dänisches Bettenlager",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q138913"},addTags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"},removeTags:{brand:"Dänisches Bettenlager","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"Dänisches Bettenlager",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Ethan Allen":{name:"Ethan Allen",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5402870"},addTags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"},removeTags:{brand:"Ethan Allen","brand:wikidata":"Q5402870","brand:wikipedia":"en:Ethan Allen (furniture company)",name:"Ethan Allen",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Harveys":{name:"Harveys",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q5677754"},addTags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"},removeTags:{brand:"Harveys","brand:wikidata":"Q5677754","brand:wikipedia":"en:Harveys Furniture",name:"Harveys",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/IKEA":{name:"IKEA",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q54078"},addTags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"},removeTags:{brand:"IKEA","brand:wikidata":"Q54078","brand:wikipedia":"en:IKEA",name:"IKEA",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/JYSK":{name:"JYSK",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q138913"},addTags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"},removeTags:{brand:"JYSK","brand:wikidata":"Q138913","brand:wikipedia":"en:Jysk (store)",name:"JYSK",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/Rent-A-Center":{name:"Rent-A-Center",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7313497"},addTags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"},removeTags:{brand:"Rent-A-Center","brand:wikidata":"Q7313497","brand:wikipedia":"en:Rent-A-Center",name:"Rent-A-Center",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/The Brick":{name:"The Brick",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q7720000"},addTags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"},removeTags:{brand:"The Brick","brand:wikidata":"Q7720000","brand:wikipedia":"en:The Brick",name:"The Brick",shop:"furniture"},matchScore:2,suggestion:true},"shop/furniture/ニトリ":{name:"ニトリ",icon:"fas-couch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"furniture","brand:wikidata":"Q10801453"},addTags:{brand:"ニトリ","brand:en":"Nitori","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori",shop:"furniture"},removeTags:{brand:"ニトリ","brand:en":"Nitori","brand:wikidata":"Q10801453","brand:wikipedia":"en:Nitori",name:"ニトリ","name:en":"Nitori",shop:"furniture"},matchScore:2,suggestion:true},"shop/garden_centre/Gamm Vert":{name:"Gamm Vert",icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q3095006"},addTags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"},removeTags:{brand:"Gamm Vert","brand:wikidata":"Q3095006","brand:wikipedia":"fr:Gamm Vert",name:"Gamm Vert",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/garden_centre/Jardiland":{name:"Jardiland",icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q3162276"},addTags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"},removeTags:{brand:"Jardiland","brand:wikidata":"Q3162276","brand:wikipedia":"fr:Jardiland",name:"Jardiland",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/garden_centre/Point Vert":{name:"Point Vert",icon:"maki-garden-center",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"garden_centre","brand:wikidata":"Q16661975"},addTags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"},removeTags:{brand:"Point Vert","brand:wikidata":"Q16661975","brand:wikipedia":"fr:Magasin vert",name:"Point Vert",shop:"garden_centre"},matchScore:2,suggestion:true},"shop/gift/Card Factory":{name:"Card Factory",icon:"maki-gift",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q5038192"},addTags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"},removeTags:{brand:"Card Factory","brand:wikidata":"Q5038192","brand:wikipedia":"en:Card Factory",name:"Card Factory",shop:"gift"},matchScore:2,suggestion:true},"shop/gift/Hallmark":{name:"Hallmark",icon:"maki-gift",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q1521910"},addTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},removeTags:{brand:"Hallmark","brand:wikidata":"Q1521910","brand:wikipedia":"en:Hallmark Cards",name:"Hallmark",shop:"gift"},matchScore:2,suggestion:true},"shop/gift/Nanu-Nana":{name:"Nanu-Nana",icon:"maki-gift",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"gift","brand:wikidata":"Q1720245"},addTags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"},removeTags:{brand:"Nanu-Nana","brand:wikidata":"Q1720245","brand:wikipedia":"de:Nanu-Nana",name:"Nanu-Nana",shop:"gift"},matchScore:2,suggestion:true},"shop/hairdresser_supply/Sally Beauty Supply":{name:"Sally Beauty Supply",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser_supply","brand:wikidata":"Q7405065"},addTags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"},removeTags:{brand:"Sally Beauty Supply","brand:wikidata":"Q7405065","brand:wikipedia":"en:Sally Beauty Holdings",name:"Sally Beauty Supply",shop:"hairdresser_supply"},matchScore:2,suggestion:true},"shop/hairdresser/Fantastic Sams":{name:"Fantastic Sams",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5434222"},addTags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"},removeTags:{brand:"Fantastic Sams","brand:wikidata":"Q5434222","brand:wikipedia":"en:Fantastic Sams",name:"Fantastic Sams",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/First Choice Haircutters":{name:"First Choice Haircutters",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5452622"},addTags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"},removeTags:{brand:"First Choice Haircutters","brand:wikidata":"Q5452622","brand:wikipedia":"en:First Choice Haircutters",name:"First Choice Haircutters",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Great Clips":{name:"Great Clips",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5598967"},addTags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"},removeTags:{brand:"Great Clips","brand:wikidata":"Q5598967","brand:wikipedia":"en:Great Clips",name:"Great Clips",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hair Cuttery":{name:"Hair Cuttery",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q5639484"},addTags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"},removeTags:{brand:"Hair Cuttery","brand:wikidata":"Q5639484","brand:wikipedia":"en:Hair Cuttery",name:"Hair Cuttery",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hair Express":{name:"Hair Express",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q57550814"},addTags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"},removeTags:{brand:"Hair Express","brand:wikidata":"Q57550814",name:"Hair Express",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Hairkiller":{name:"Hairkiller",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q58305998"},addTags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"},removeTags:{brand:"Hairkiller","brand:wikidata":"Q58305998",name:"Hairkiller",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Klier":{name:"Klier",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q1465159"},addTags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"},removeTags:{brand:"Klier","brand:wikidata":"Q1465159","brand:wikipedia":"de:Frisör Klier",name:"Klier",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Supercuts":{name:"Supercuts",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q7643239"},addTags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"},removeTags:{brand:"Supercuts","brand:wikidata":"Q7643239","brand:wikipedia":"en:Supercuts",name:"Supercuts",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hairdresser/Toni & Guy":{name:"Toni & Guy",icon:"maki-hairdresser",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hairdresser","brand:wikidata":"Q324784"},addTags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"},removeTags:{brand:"Toni & Guy","brand:wikidata":"Q324784","brand:wikipedia":"en:Toni & Guy",name:"Toni & Guy",shop:"hairdresser"},matchScore:2,suggestion:true},"shop/hardware/Harbor Freight Tools":{name:"Harbor Freight Tools",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hardware","brand:wikidata":"Q5654601"},addTags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"},removeTags:{brand:"Harbor Freight Tools","brand:wikidata":"Q5654601","brand:wikipedia":"en:Harbor Freight Tools",name:"Harbor Freight Tools",shop:"hardware"},matchScore:2,suggestion:true},"shop/hardware/True Value":{name:"True Value",icon:"temaki-tools",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hardware","brand:wikidata":"Q7847545"},addTags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"},removeTags:{brand:"True Value","brand:wikidata":"Q7847545","brand:wikipedia":"en:True Value",name:"True Value",shop:"hardware"},matchScore:2,suggestion:true},"shop/health_food/Holland & Barrett":{name:"Holland & Barrett",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"health_food","brand:wikidata":"Q5880870"},addTags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"},removeTags:{brand:"Holland & Barrett","brand:wikidata":"Q5880870","brand:wikipedia":"en:Holland & Barrett",name:"Holland & Barrett",shop:"health_food"},matchScore:2,suggestion:true},"shop/hearing_aids/Amplifon":{name:"Amplifon",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q477222"},addTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},removeTags:{brand:"Amplifon","brand:wikidata":"Q477222","brand:wikipedia":"en:Amplifon",name:"Amplifon",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Geers":{name:"Geers",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q1497707"},addTags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"},removeTags:{brand:"Geers","brand:wikidata":"Q1497707","brand:wikipedia":"de:Geers Hörakustik",name:"Geers",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hearing_aids/Kind Hörgeräte":{name:"Kind Hörgeräte",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hearing_aids","brand:wikidata":"Q43598590"},addTags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"},removeTags:{brand:"Kind Hörgeräte","brand:wikidata":"Q43598590","brand:wikipedia":"de:Kind Hörgeräte",name:"Kind Hörgeräte",shop:"hearing_aids"},matchScore:2,suggestion:true},"shop/hifi/Bang & Olufsen":{name:"Bang & Olufsen",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"hifi","brand:wikidata":"Q790020"},addTags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"},removeTags:{brand:"Bang & Olufsen","brand:wikidata":"Q790020","brand:wikipedia":"en:Bang & Olufsen",name:"Bang & Olufsen",shop:"hifi"},matchScore:2,suggestion:true},"shop/houseware/Bed Bath & Beyond":{name:"Bed Bath & Beyond",icon:"fas-blender",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q813782"},addTags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"},removeTags:{brand:"Bed Bath & Beyond","brand:wikidata":"Q813782","brand:wikipedia":"en:Bed Bath & Beyond",name:"Bed Bath & Beyond",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Blokker":{name:"Blokker",icon:"fas-blender",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q884934"},addTags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"},removeTags:{brand:"Blokker","brand:wikidata":"Q884934","brand:wikipedia":"en:Blokker Holding",name:"Blokker",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/Cervera":{name:"Cervera",icon:"fas-blender",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q10447179"},addTags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"},removeTags:{brand:"Cervera","brand:wikidata":"Q10447179","brand:wikipedia":"sv:Cervera (företag)",name:"Cervera",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/HomeGoods":{name:"HomeGoods",icon:"fas-blender",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q5887941"},addTags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"},removeTags:{brand:"HomeGoods","brand:wikidata":"Q5887941","brand:wikipedia":"en:HomeGoods",name:"HomeGoods",shop:"houseware"},matchScore:2,suggestion:true},"shop/houseware/WMF":{name:"WMF",icon:"fas-blender",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"houseware","brand:wikidata":"Q451423"},addTags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"},removeTags:{brand:"WMF","brand:wikidata":"Q451423","brand:wikipedia":"en:WMF Group",name:"WMF",shop:"houseware"},matchScore:2,suggestion:true},"shop/interior_decoration/Depot":{name:"Depot",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q1191740"},addTags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"},removeTags:{brand:"Depot","brand:wikidata":"Q1191740","brand:wikipedia":"de:Gries Deco Holding",name:"Depot",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/interior_decoration/Hemtex":{name:"Hemtex",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q10521868"},addTags:{brand:"Hemtex",name:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",shop:"interior_decoration"},removeTags:{brand:"Hemtex",name:"Hemtex","brand:wikidata":"Q10521868","brand:wikipedia":"sv:Hemtex",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/interior_decoration/Pier 1 Imports":{name:"Pier 1 Imports",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"interior_decoration","brand:wikidata":"Q7191691"},addTags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"},removeTags:{brand:"Pier 1 Imports","brand:wikidata":"Q7191691","brand:wikipedia":"en:Pier 1 Imports",name:"Pier 1 Imports",shop:"interior_decoration"},matchScore:2,suggestion:true},"shop/jewelry/Apart":{name:"Apart",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q11686561"},addTags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"},removeTags:{brand:"Apart","brand:wikidata":"Q11686561","brand:wikipedia":"pl:Apart",name:"Apart",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Bijou Brigitte":{name:"Bijou Brigitte",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q599545"},addTags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"},removeTags:{brand:"Bijou Brigitte","brand:wikidata":"Q599545","brand:wikipedia":"de:Bijou Brigitte",name:"Bijou Brigitte",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Cartier":{name:"Cartier",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q538587"},addTags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"},removeTags:{brand:"Cartier","brand:wikidata":"Q538587","brand:wikipedia":"en:Cartier (jeweler)",name:"Cartier",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Ernest Jones":{name:"Ernest Jones",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q5393358"},addTags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"},removeTags:{brand:"Ernest Jones","brand:wikidata":"Q5393358","brand:wikipedia":"en:Ernest Jones (retailer)",name:"Ernest Jones",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Guldfynd":{name:"Guldfynd",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q49099223"},addTags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"},removeTags:{brand:"Guldfynd","brand:wikidata":"Q49099223","brand:wikipedia":"sv:Guldfynd",name:"Guldfynd",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/James Avery Jewelry":{name:"James Avery Jewelry",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q6129024"},addTags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"},removeTags:{brand:"James Avery Jewelry","brand:wikidata":"Q6129024","brand:wikipedia":"en:James Avery Artisan Jewelry",name:"James Avery Jewelry",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Kay Jewelers":{name:"Kay Jewelers",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q7611434"},addTags:{brand:"Kay Jewelers","brand:wikidata":"Q7611434","brand:wikipedia":"en:Sterling Jewelers",name:"Kay Jewelers",shop:"jewelry"},removeTags:{brand:"Kay Jewelers","brand:wikidata":"Q7611434","brand:wikipedia":"en:Sterling Jewelers",name:"Kay Jewelers",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Pandora":{name:"Pandora",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q2241604"},addTags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"},removeTags:{brand:"Pandora","brand:wikidata":"Q2241604","brand:wikipedia":"en:Pandora (jewelry)",name:"Pandora",shop:"jewelry"},matchScore:2,suggestion:true},"shop/jewelry/Swarovski":{name:"Swarovski",icon:"maki-jewelry-store",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"jewelry","brand:wikidata":"Q611115"},addTags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"},removeTags:{brand:"Swarovski","brand:wikidata":"Q611115","brand:wikipedia":"en:Swarovski",name:"Swarovski",shop:"jewelry"},matchScore:2,suggestion:true},"shop/kiosk/K Kiosk":{name:"K Kiosk",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q665504"},addTags:{brand:"K Kiosk","brand:wikidata":"Q665504","brand:wikipedia":"it:K Kiosk",name:"K Kiosk",shop:"kiosk"},removeTags:{brand:"K Kiosk","brand:wikidata":"Q665504","brand:wikipedia":"it:K Kiosk",name:"K Kiosk",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Kolporter":{name:"Kolporter",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q6427874"},addTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},removeTags:{brand:"Kolporter","brand:wikidata":"Q6427874","brand:wikipedia":"pl:Kolporter (przedsiębiorstwo)",name:"Kolporter",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Narvesen":{name:"Narvesen",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q6514414"},addTags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"},removeTags:{brand:"Narvesen","brand:wikidata":"Q6514414","brand:wikipedia":"en:Narvesen",name:"Narvesen",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Pressbyrån":{name:"Pressbyrån",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q2489072"},addTags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"},removeTags:{brand:"Pressbyrån","brand:wikidata":"Q2489072","brand:wikipedia":"en:Pressbyrån",name:"Pressbyrån",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/R-Kioski":{name:"R-Kioski",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q1571400"},addTags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"},removeTags:{brand:"R-Kioski","brand:wikidata":"Q1571400","brand:wikipedia":"en:R-kioski",name:"R-Kioski",shop:"kiosk"},matchScore:2,suggestion:true},"shop/kiosk/Ruch":{name:"Ruch",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi","levels"],geometry:["point","area"],tags:{shop:"kiosk","brand:wikidata":"Q1260314"},addTags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"},removeTags:{brand:"Ruch","brand:wikidata":"Q1260314","brand:wikipedia":"pl:Ruch (przedsiębiorstwo)",name:"Ruch",shop:"kiosk"},matchScore:2,suggestion:true},"shop/massage/Massage Envy":{name:"Massage Envy",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"massage","brand:wikidata":"Q22922899"},addTags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"},removeTags:{brand:"Massage Envy","brand:wikidata":"Q22922899","brand:wikipedia":"en:Massage Envy",name:"Massage Envy",shop:"massage"},matchScore:2,suggestion:true},"shop/mobile_phone/AT&T":{name:"AT&T",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q298594"},addTags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"},removeTags:{brand:"AT&T","brand:wikidata":"Q298594","brand:wikipedia":"en:AT&T Mobility",name:"AT&T",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Bell":{name:"Bell",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2894594"},addTags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"},removeTags:{brand:"Bell","brand:wikidata":"Q2894594","brand:wikipedia":"en:Bell Mobility",name:"Bell",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Boost Mobile":{name:"Boost Mobile",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q4943790"},addTags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"},removeTags:{brand:"Boost Mobile","brand:wikidata":"Q4943790","brand:wikipedia":"en:Boost Mobile",name:"Boost Mobile",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Carphone Warehouse":{name:"Carphone Warehouse",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q118046"},addTags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"},removeTags:{brand:"Carphone Warehouse","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Carphone Warehouse",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Cricket Wireless":{name:"Cricket Wireless",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5184987"},addTags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"},removeTags:{brand:"Cricket Wireless","brand:wikidata":"Q5184987","brand:wikipedia":"en:Cricket Wireless",name:"Cricket Wireless",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Digicel":{name:"Digicel",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2117506"},addTags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"},removeTags:{brand:"Digicel","brand:wikidata":"Q2117506","brand:wikipedia":"en:Digicel",name:"Digicel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/EE":{name:"EE",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5322942"},addTags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"},removeTags:{brand:"EE","brand:wikidata":"Q5322942","brand:wikipedia":"en:EE Limited",name:"EE",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Entel":{name:"Entel",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q5323742"},addTags:{brand:"Entel","brand:wikidata":"Q5323742","brand:wikipedia":"en:ENTel",name:"Entel",shop:"mobile_phone"},removeTags:{brand:"Entel","brand:wikidata":"Q5323742","brand:wikipedia":"en:ENTel",name:"Entel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/MetroPCS":{name:"MetroPCS",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1925685"},addTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},removeTags:{brand:"MetroPCS","brand:wikidata":"Q1925685","brand:wikipedia":"en:Metro by T-Mobile",name:"MetroPCS",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Mobilcom Debitel":{name:"Mobilcom Debitel",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q344744"},addTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},removeTags:{brand:"Mobilcom Debitel","brand:wikidata":"Q344744","brand:wikipedia":"en:Debitel",name:"Mobilcom Debitel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/O2":{name:"O2",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7072246"},addTags:{brand:"O2","brand:wikidata":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",name:"O2",shop:"mobile_phone"},removeTags:{brand:"O2","brand:wikidata":"Q7072246","brand:wikipedia":"en:O2 (Ireland)",name:"O2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Phone House":{name:"Phone House",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q118046"},addTags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"},removeTags:{brand:"Phone House","brand:wikidata":"Q118046","brand:wikipedia":"en:Carphone Warehouse",name:"Phone House",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Play":{name:"Play",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7202998"},addTags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"en:Play (telecommunications)",name:"Play",shop:"mobile_phone"},removeTags:{brand:"Play","brand:wikidata":"Q7202998","brand:wikipedia":"en:Play (telecommunications)",name:"Play",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Plus":{name:"Plus",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7205598"},addTags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"},removeTags:{brand:"Plus","brand:wikidata":"Q7205598","brand:wikipedia":"pl:Plus (sieć telefonii komórkowej)",name:"Plus",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Rogers":{name:"Rogers",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q3439663"},addTags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"},removeTags:{brand:"Rogers","brand:wikidata":"Q3439663","brand:wikipedia":"en:Rogers Wireless",name:"Rogers",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/SFR":{name:"SFR",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q218765"},addTags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"},removeTags:{brand:"SFR","brand:wikidata":"Q218765","brand:wikipedia":"en:SFR",name:"SFR",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Sprint":{name:"Sprint",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q301965"},addTags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"},removeTags:{brand:"Sprint","brand:wikidata":"Q301965","brand:wikipedia":"en:Sprint Corporation",name:"Sprint",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/T-Mobile":{name:"T-Mobile",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q327634"},addTags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"},removeTags:{brand:"T-Mobile","brand:wikidata":"Q327634","brand:wikipedia":"en:T-Mobile",name:"T-Mobile",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/TIM":{name:"TIM",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q144617"},addTags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"},removeTags:{brand:"TIM","brand:wikidata":"Q144617","brand:wikipedia":"en:Telecom Italia",name:"TIM",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telcel":{name:"Telcel",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q3517255"},addTags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"},removeTags:{brand:"Telcel","brand:wikidata":"Q3517255","brand:wikipedia":"en:Telcel",name:"Telcel",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Tele2":{name:"Tele2",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q309865"},addTags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"},removeTags:{brand:"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Tele2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telekom":{name:"Telekom",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q9396"},addTags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"},removeTags:{brand:"Telekom","brand:wikidata":"Q9396","brand:wikipedia":"en:Deutsche Telekom",name:"Telekom",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telenor":{name:"Telenor",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q845632"},addTags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"},removeTags:{brand:"Telenor","brand:wikidata":"Q845632","brand:wikipedia":"en:Telenor",name:"Telenor",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Telus":{name:"Telus",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q165858"},addTags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"},removeTags:{brand:"Telus","brand:wikidata":"Q165858","brand:wikipedia":"en:Telus",name:"Telus",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Turkcell":{name:"Turkcell",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q283852"},addTags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"},removeTags:{brand:"Turkcell","brand:wikidata":"Q283852","brand:wikipedia":"en:Turkcell",name:"Turkcell",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Télécentre":{name:"Télécentre",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q180034"},addTags:{brand:"Télécentre","brand:wikidata":"Q180034","brand:wikipedia":"en:Telecentre",name:"Télécentre",shop:"mobile_phone"},removeTags:{brand:"Télécentre","brand:wikidata":"Q180034","brand:wikipedia":"en:Telecentre",name:"Télécentre",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Verizon Wireless":{name:"Verizon Wireless",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q919641"},addTags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"},removeTags:{brand:"Verizon Wireless","brand:wikidata":"Q919641","brand:wikipedia":"en:Verizon Wireless",name:"Verizon Wireless",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Vodafone":{name:"Vodafone",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q122141"},addTags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"},removeTags:{brand:"Vodafone","brand:wikidata":"Q122141","brand:wikipedia":"en:Vodafone",name:"Vodafone",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/WIFI_ETECSA":{name:"WIFI_ETECSA",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q490323"},addTags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"},removeTags:{brand:"WIFI_ETECSA","brand:wikidata":"Q490323","brand:wikipedia":"es:Empresa de Telecomunicaciones de Cuba",name:"WIFI_ETECSA",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Yoigo":{name:"Yoigo",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2630989"},addTags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"},removeTags:{brand:"Yoigo","brand:wikidata":"Q2630989","brand:wikipedia":"en:Yoigo",name:"Yoigo",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/auショップ":{name:"auショップ",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q11190521"},addTags:{brand:"au","brand:wikidata":"Q11190521","brand:wikipedia":"ja:au (通信)",name:"auショップ",shop:"mobile_phone"},removeTags:{brand:"au","brand:wikidata":"Q11190521","brand:wikipedia":"ja:au (通信)",name:"auショップ",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Билайн":{name:"Билайн",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q402880"},addTags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"},removeTags:{brand:"Билайн","brand:en":"Beeline","brand:wikidata":"Q402880","brand:wikipedia":"en:Beeline (brand)",name:"Билайн","name:en":"Beeline",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Евросеть":{name:"Евросеть",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q65310"},addTags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"},removeTags:{brand:"Евросеть","brand:en":"Euroset","brand:wikidata":"Q65310","brand:wikipedia":"en:Euroset",name:"Евросеть","name:en":"Euroset",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Київстар":{name:"Київстар",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q2288463"},addTags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"},removeTags:{brand:"Київстар","brand:en":"Kyivstar","brand:wikidata":"Q2288463","brand:wikipedia":"en:Kyivstar",name:"Київстар","name:en":"Kyivstar",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/МТС":{name:"МТС",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1368919"},addTags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"},removeTags:{brand:"МТС","brand:en":"MTS","brand:wikidata":"Q1368919","brand:wikipedia":"en:MTS (network provider)",name:"МТС","name:en":"MTS",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Мегафон":{name:"Мегафон",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q1720713"},addTags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"},removeTags:{brand:"Мегафон","brand:en":"MegaFon","brand:wikidata":"Q1720713","brand:wikipedia":"en:MegaFon",name:"Мегафон","name:en":"MegaFon",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Связной":{name:"Связной",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q65371"},addTags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"},removeTags:{brand:"Связной","brand:en":"Svyaznoy","brand:wikidata":"Q65371","brand:wikipedia":"en:Svyaznoy",name:"Связной","name:en":"Svyaznoy",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/Теле2":{name:"Теле2",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q309865"},addTags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"},removeTags:{brand:"Теле2","brand:en":"Tele2","brand:wikidata":"Q309865","brand:wikipedia":"en:Tele2",name:"Теле2","name:en":"Tele2",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンク":{name:"ソフトバンク",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q7553832"},addTags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom",shop:"mobile_phone"},removeTags:{brand:"ソフトバンク","brand:en":"SoftBank Telecom","brand:wikidata":"Q7553832","brand:wikipedia":"en:SoftBank Telecom",name:"ソフトバンク","name:en":"SoftBank Telecom",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/mobile_phone/ソフトバンクショップ":{name:"ソフトバンクショップ",icon:"maki-mobile-phone",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"mobile_phone","brand:wikidata":"Q11315281"},addTags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop",shop:"mobile_phone"},removeTags:{brand:"ソフトバンクショップ","brand:en":"SoftBankShop","brand:wikidata":"Q11315281","brand:wikipedia":"ja:ソフトバンクショップ",name:"ソフトバンクショップ","name:en":"SoftBankShop",shop:"mobile_phone"},matchScore:2,suggestion:true},"shop/money_lender/Money Mart":{name:"Money Mart",icon:"maki-bank",fields:["name","operator","address","building_area","opening_hours","currency_multi"],geometry:["point","area"],tags:{shop:"money_lender","brand:wikidata":"Q6899166"},addTags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"},removeTags:{brand:"Money Mart","brand:wikidata":"Q6899166","brand:wikipedia":"en:Money Mart",name:"Money Mart",shop:"money_lender"},matchScore:2,suggestion:true},"shop/motorcycle/Harley Davidson":{name:"Harley Davidson",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q192814"},addTags:{brand:"Harley Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley Davidson",shop:"motorcycle"},removeTags:{brand:"Harley Davidson","brand:wikidata":"Q192814","brand:wikipedia":"en:Harley-Davidson",name:"Harley Davidson",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Honda":{name:"Honda",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q9584"},addTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"},removeTags:{brand:"Honda","brand:wikidata":"Q9584","brand:wikipedia":"en:Honda",name:"Honda",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Kawasaki":{name:"Kawasaki",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q6379855"},addTags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"},removeTags:{brand:"Kawasaki","brand:wikidata":"Q6379855","brand:wikipedia":"en:Kawasaki motorcycles",name:"Kawasaki",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Motortrade":{name:"Motortrade",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q48803162"},addTags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"},removeTags:{brand:"Motortrade","brand:wikidata":"Q48803162","brand:wikipedia":"en:Motortrade",name:"Motortrade",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Suzuki":{name:"Suzuki",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q181642"},addTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"},removeTags:{brand:"Suzuki","brand:wikidata":"Q181642","brand:wikipedia":"en:Suzuki",name:"Suzuki",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/motorcycle/Yamaha":{name:"Yamaha",icon:"fas-motorcycle",fields:["name","brand","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"motorcycle","brand:wikidata":"Q158888"},addTags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"},removeTags:{brand:"Yamaha","brand:wikidata":"Q158888","brand:wikipedia":"en:Yamaha Motor Company",name:"Yamaha",shop:"motorcycle"},matchScore:2,suggestion:true},"shop/musical_instrument/Guitar Center":{name:"Guitar Center",icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"musical_instrument","brand:wikidata":"Q3622794"},addTags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"},removeTags:{brand:"Guitar Center","brand:wikidata":"Q3622794","brand:wikipedia":"en:Guitar Center",name:"Guitar Center",shop:"musical_instrument"},matchScore:2,suggestion:true},"shop/music/HMV":{name:"HMV",icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"music","brand:wikidata":"Q10854572"},addTags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"},removeTags:{brand:"HMV","brand:wikidata":"Q10854572","brand:wikipedia":"en:HMV",name:"HMV",shop:"music"},matchScore:2,suggestion:true},"shop/music/TSUTAYA":{name:"TSUTAYA",icon:"maki-music",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"music","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"music"},matchScore:2,suggestion:true},"shop/newsagent/読売新聞":{name:"読売新聞",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"newsagent","brand:wikidata":"Q645218"},addTags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"},removeTags:{brand:"読売新聞","brand:en":"Yomiuri Shimbun","brand:wikidata":"Q645218","brand:wikipedia":"en:Yomiuri Shimbun",name:"読売新聞","name:en":"Yomiuri Shimbun",shop:"newsagent"},matchScore:2,suggestion:true},"shop/nutrition_supplements/GNC":{name:"GNC",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"nutrition_supplements","brand:wikidata":"Q4808595"},addTags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"},removeTags:{brand:"GNC","brand:wikidata":"Q4808595","brand:wikipedia":"en:GNC (store)",name:"GNC",shop:"nutrition_supplements"},matchScore:2,suggestion:true},"shop/optician/Alain Afflelou":{name:"Alain Afflelou",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2829511"},addTags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"},removeTags:{brand:"Alain Afflelou","brand:wikidata":"Q2829511","brand:wikipedia":"fr:Alain Afflelou (entreprise)",name:"Alain Afflelou",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Apollo":{name:"Apollo",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q618940"},addTags:{brand:"Apollo","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo",shop:"optician"},removeTags:{brand:"Apollo","brand:wikidata":"Q618940","brand:wikipedia":"de:Apollo-Optik",name:"Apollo",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Atol":{name:"Atol",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2869542"},addTags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"},removeTags:{brand:"Atol","brand:wikidata":"Q2869542","brand:wikipedia":"fr:Atol (opticien)",name:"Atol",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Boots Opticians":{name:"Boots Opticians",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q4944037"},addTags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician"},removeTags:{brand:"Boots Opticians","brand:wikidata":"Q4944037","brand:wikipedia":"en:Boots Opticians",name:"Boots Opticians",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Fielmann":{name:"Fielmann",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q457822"},addTags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"},removeTags:{brand:"Fielmann","brand:wikidata":"Q457822","brand:wikipedia":"en:Fielmann",name:"Fielmann",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Hakim Optical":{name:"Hakim Optical",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q28232761"},addTags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"},removeTags:{brand:"Hakim Optical","brand:wikidata":"Q28232761","brand:wikipedia":"en:Hakim Optical",name:"Hakim Optical",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/LensCrafters":{name:"LensCrafters",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q6523209"},addTags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"},removeTags:{brand:"LensCrafters","brand:wikidata":"Q6523209","brand:wikipedia":"en:LensCrafters",name:"LensCrafters",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Les Opticiens Mutualistes":{name:"Les Opticiens Mutualistes",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q18414551"},addTags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"},removeTags:{brand:"Les Opticiens Mutualistes","brand:wikidata":"Q18414551","brand:wikipedia":"fr:Les Opticiens Mutualistes",name:"Les Opticiens Mutualistes",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Optic 2000":{name:"Optic 2000",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q3354445"},addTags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"},removeTags:{brand:"Optic 2000","brand:wikidata":"Q3354445","brand:wikipedia":"fr:Optic 2000",name:"Optic 2000",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Pearle":{name:"Pearle",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2231148"},addTags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"},removeTags:{brand:"Pearle","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Pearle Vision":{name:"Pearle Vision",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2231148"},addTags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician"},removeTags:{brand:"Pearle Vision","brand:wikidata":"Q2231148","brand:wikipedia":"en:Pearle Vision",name:"Pearle Vision",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Specsavers":{name:"Specsavers",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q2000610"},addTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},removeTags:{brand:"Specsavers","brand:wikidata":"Q2000610","brand:wikipedia":"en:Specsavers",name:"Specsavers",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Sunglass Hut":{name:"Sunglass Hut",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q136311"},addTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},removeTags:{brand:"Sunglass Hut","brand:wikidata":"Q136311","brand:wikipedia":"en:Sunglass Hut",name:"Sunglass Hut",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Synoptik":{name:"Synoptik",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q10687541"},addTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},removeTags:{brand:"Synoptik","brand:wikidata":"Q10687541","brand:wikipedia":"sv:Synoptik",name:"Synoptik",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Synsam":{name:"Synsam",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q12004589"},addTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},removeTags:{brand:"Synsam","brand:wikidata":"Q12004589","brand:wikipedia":"sv:Synsam",name:"Synsam",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Vision Express":{name:"Vision Express",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q7936150"},addTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},removeTags:{brand:"Vision Express","brand:wikidata":"Q7936150","brand:wikipedia":"en:Vision Express",name:"Vision Express",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/Visionworks":{name:"Visionworks",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q5422607"},addTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},removeTags:{brand:"Visionworks","brand:wikidata":"Q5422607","brand:wikipedia":"en:Visionworks",name:"Visionworks",shop:"optician"},matchScore:2,suggestion:true},"shop/optician/メガネスーパー":{name:"メガネスーパー",icon:"maki-optician",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"optician","brand:wikidata":"Q11343504"},addTags:{brand:"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー",shop:"optician"},removeTags:{brand:"メガネスーパー","brand:wikidata":"Q11343504","brand:wikipedia":"ja:メガネスーパー",name:"メガネスーパー",shop:"optician"},matchScore:2,suggestion:true},"shop/outdoor/Jack Wolfskin":{name:"Jack Wolfskin",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q536133"},addTags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"},removeTags:{brand:"Jack Wolfskin","brand:wikidata":"Q536133","brand:wikipedia":"en:Jack Wolfskin",name:"Jack Wolfskin",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/Mountain Warehouse":{name:"Mountain Warehouse",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q6925414"},addTags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"},removeTags:{brand:"Mountain Warehouse","brand:wikidata":"Q6925414","brand:wikipedia":"en:Mountain Warehouse",name:"Mountain Warehouse",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/REI":{name:"REI",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q3414933"},addTags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"},removeTags:{brand:"REI","brand:wikidata":"Q3414933","brand:wikipedia":"en:Recreational Equipment, Inc.",name:"REI",shop:"outdoor"},matchScore:2,suggestion:true},"shop/outdoor/Trespass":{name:"Trespass",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"outdoor","brand:wikidata":"Q17035733"},addTags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"},removeTags:{brand:"Trespass","brand:wikidata":"Q17035733","brand:wikipedia":"en:Trespass (clothing)",name:"Trespass",shop:"outdoor"},matchScore:2,suggestion:true},"shop/paint/Benjamin Moore":{name:"Benjamin Moore",icon:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q4889038"},addTags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"},removeTags:{brand:"Benjamin Moore","brand:wikidata":"Q4889038","brand:wikipedia":"en:Benjamin Moore & Co.",name:"Benjamin Moore",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Comex":{name:"Comex",icon:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q5151654"},addTags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"},removeTags:{brand:"Comex","brand:wikidata":"Q5151654","brand:wikipedia":"en:Comex Group",name:"Comex",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Jotun":{name:"Jotun",icon:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q1778870"},addTags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"},removeTags:{brand:"Jotun","brand:wikidata":"Q1778870","brand:wikipedia":"en:Jotun (company)",name:"Jotun",shop:"paint"},matchScore:2,suggestion:true},"shop/paint/Sherwin Williams":{name:"Sherwin Williams",icon:"fas-paint-roller",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"paint","brand:wikidata":"Q48881"},addTags:{brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin Williams",shop:"paint"},removeTags:{brand:"Sherwin Williams","brand:wikidata":"Q48881","brand:wikipedia":"en:Sherwin-Williams",name:"Sherwin Williams",shop:"paint"},matchScore:2,suggestion:true},"shop/party/Party City":{name:"Party City",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"party","brand:wikidata":"Q7140896"},addTags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"},removeTags:{brand:"Party City","brand:wikidata":"Q7140896","brand:wikipedia":"en:Party City",name:"Party City",shop:"party"},matchScore:2,suggestion:true},"shop/pawnbroker/Cash Converters":{name:"Cash Converters",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pawnbroker","brand:wikidata":"Q5048645"},addTags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"},removeTags:{brand:"Cash Converters","brand:wikidata":"Q5048645","brand:wikipedia":"en:Cash Converters",name:"Cash Converters",shop:"pawnbroker"},matchScore:2,suggestion:true},"shop/pawnbroker/Cebuana Lhuillier":{name:"Cebuana Lhuillier",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pawnbroker","brand:wikidata":"Q17064661"},addTags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"},removeTags:{brand:"Cebuana Lhuillier","brand:wikidata":"Q17064661","brand:wikipedia":"en:Cebuana Lhuillier",name:"Cebuana Lhuillier",shop:"pawnbroker"},matchScore:2,suggestion:true},"shop/perfumery/Douglas":{name:"Douglas",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q2052213"},addTags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"},removeTags:{brand:"Douglas","brand:wikidata":"Q2052213","brand:wikipedia":"de:Parfümerie Douglas",name:"Douglas",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/ICI PARIS XL":{name:"ICI PARIS XL",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q769749"},addTags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"},removeTags:{brand:"ICI PARIS XL","brand:wikidata":"Q769749","brand:wikipedia":"en:ICI Paris XL",name:"ICI PARIS XL",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/Marionnaud":{name:"Marionnaud",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q1129073"},addTags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud Parfumeries",name:"Marionnaud",shop:"perfumery"},removeTags:{brand:"Marionnaud","brand:wikidata":"Q1129073","brand:wikipedia":"fr:Marionnaud Parfumeries",name:"Marionnaud",shop:"perfumery"},matchScore:2,suggestion:true},"shop/perfumery/O Boticário":{name:"O Boticário",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"perfumery","brand:wikidata":"Q7073219"},addTags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"},removeTags:{brand:"O Boticário","brand:wikidata":"Q7073219","brand:wikipedia":"en:O Boticário",name:"O Boticário",shop:"perfumery"},matchScore:2,suggestion:true},"shop/pet/Das Futterhaus":{name:"Das Futterhaus",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q1167914"},addTags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"},removeTags:{brand:"Das Futterhaus","brand:wikidata":"Q1167914","brand:wikipedia":"de:Das Futterhaus",name:"Das Futterhaus",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Fressnapf":{name:"Fressnapf",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q875796"},addTags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"},removeTags:{brand:"Fressnapf","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Fressnapf",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Global Pet Foods":{name:"Global Pet Foods",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q57985699"},addTags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"},removeTags:{brand:"Global Pet Foods","brand:wikidata":"Q57985699",name:"Global Pet Foods",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Maxi Zoo":{name:"Maxi Zoo",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q875796"},addTags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"},removeTags:{brand:"Maxi Zoo","brand:wikidata":"Q875796","brand:wikipedia":"en:Fressnapf",name:"Maxi Zoo",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pet Supplies Plus":{name:"Pet Supplies Plus",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7171563"},addTags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"},removeTags:{brand:"Pet Supplies Plus","brand:wikidata":"Q7171563","brand:wikipedia":"en:Pet Supplies Plus",name:"Pet Supplies Plus",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pet Valu":{name:"Pet Valu",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q58009635"},addTags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"},removeTags:{brand:"Pet Valu","brand:wikidata":"Q58009635",name:"Pet Valu",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/PetSmart":{name:"PetSmart",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q3307147"},addTags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"},removeTags:{brand:"PetSmart","brand:wikidata":"Q3307147","brand:wikipedia":"en:PetSmart",name:"PetSmart",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Petco":{name:"Petco",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7171798"},addTags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"},removeTags:{brand:"Petco","brand:wikidata":"Q7171798","brand:wikipedia":"en:Petco",name:"Petco",shop:"pet"},matchScore:2,suggestion:true},"shop/pet/Pets at Home":{name:"Pets at Home",icon:"maki-dog-park",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"pet","brand:wikidata":"Q7179258"},addTags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"},removeTags:{brand:"Pets at Home","brand:wikidata":"Q7179258","brand:wikipedia":"en:Pets at Home",name:"Pets at Home",shop:"pet"},matchScore:2,suggestion:true},"shop/photo/Kodak Express":{name:"Kodak Express",icon:"maki-attraction",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"photo","brand:wikidata":"Q6425126"},addTags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"},removeTags:{brand:"Kodak Express","brand:wikidata":"Q6425126","brand:wikipedia":"en:Kodak Express",name:"Kodak Express",shop:"photo"},matchScore:2,suggestion:true},"shop/shoes/Aldo":{name:"Aldo",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2832297"},addTags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"},removeTags:{brand:"Aldo","brand:wikidata":"Q2832297","brand:wikipedia":"en:Aldo Group",name:"Aldo",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/André":{name:"André",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2847114"},addTags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"},removeTags:{brand:"André","brand:wikidata":"Q2847114","brand:wikipedia":"fr:André (chaussure)",name:"André",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Bata":{name:"Bata",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q688082"},addTags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"},removeTags:{brand:"Bata","brand:wikidata":"Q688082","brand:wikipedia":"en:Bata (company)",name:"Bata",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Besson Chaussures":{name:"Besson Chaussures",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2899930"},addTags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"},removeTags:{brand:"Besson Chaussures","brand:wikidata":"Q2899930","brand:wikipedia":"fr:Besson Chaussures",name:"Besson Chaussures",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Birkenstock":{name:"Birkenstock",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q648458"},addTags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"},removeTags:{brand:"Birkenstock","brand:wikidata":"Q648458","brand:wikipedia":"en:Birkenstock",name:"Birkenstock",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Brantano":{name:"Brantano",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q4957616"},addTags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"},removeTags:{brand:"Brantano","brand:wikidata":"Q4957616","brand:wikipedia":"en:Brantano Footwear",name:"Brantano",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/CCC":{name:"CCC",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q11788344"},addTags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"},removeTags:{brand:"CCC","brand:wikidata":"Q11788344","brand:wikipedia":"de:CCC (Unternehmen)",name:"CCC",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Camper":{name:"Camper",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1030922"},addTags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"},removeTags:{brand:"Camper","brand:wikidata":"Q1030922","brand:wikipedia":"en:Camper (company)",name:"Camper",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Clarks":{name:"Clarks",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1095857"},addTags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"},removeTags:{brand:"Clarks","brand:wikidata":"Q1095857","brand:wikipedia":"en:C. & J. Clark",name:"Clarks",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Converse":{name:"Converse",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q319515"},addTags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"},removeTags:{brand:"Converse","brand:wikidata":"Q319515","brand:wikipedia":"en:Converse (shoe company)",name:"Converse",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Crocs":{name:"Crocs",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q926699"},addTags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"},removeTags:{brand:"Crocs","brand:wikidata":"Q926699","brand:wikipedia":"en:Crocs",name:"Crocs",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/DSW":{name:"DSW",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q5206207"},addTags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:DSW, Inc.",name:"DSW",shop:"shoes"},removeTags:{brand:"DSW","brand:wikidata":"Q5206207","brand:wikipedia":"en:DSW, Inc.",name:"DSW",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Deichmann":{name:"Deichmann",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q664543"},addTags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"},removeTags:{brand:"Deichmann","brand:wikidata":"Q664543","brand:wikipedia":"en:Deichmann SE",name:"Deichmann",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Din sko":{name:"Din sko",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q10472869"},addTags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"},removeTags:{brand:"Din sko","brand:wikidata":"Q10472869","brand:wikipedia":"sv:Din sko",name:"Din sko",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Ecco":{name:"Ecco",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1280255"},addTags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"},removeTags:{brand:"Ecco","brand:wikidata":"Q1280255","brand:wikipedia":"en:ECCO",name:"Ecco",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Famous Footwear":{name:"Famous Footwear",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q5433457"},addTags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"},removeTags:{brand:"Famous Footwear","brand:wikidata":"Q5433457","brand:wikipedia":"en:Famous Footwear",name:"Famous Footwear",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Foot Locker":{name:"Foot Locker",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q63335"},addTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"},removeTags:{brand:"Foot Locker","brand:wikidata":"Q63335","brand:wikipedia":"en:Foot Locker",name:"Foot Locker",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Geox":{name:"Geox",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q588001"},addTags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"},removeTags:{brand:"Geox","brand:wikidata":"Q588001","brand:wikipedia":"en:Geox",name:"Geox",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Humanic":{name:"Humanic",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1636668"},addTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},removeTags:{brand:"Humanic","brand:wikidata":"Q1636668","brand:wikipedia":"en:Humanic",name:"Humanic",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Journeys":{name:"Journeys",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q5532704"},addTags:{brand:"Journeys","brand:wikidata":"Q5532704","brand:wikipedia":"en:Genesco",name:"Journeys",shop:"shoes"},removeTags:{brand:"Journeys","brand:wikidata":"Q5532704","brand:wikipedia":"en:Genesco",name:"Journeys",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Mephisto":{name:"Mephisto",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q822975"},addTags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"},removeTags:{brand:"Mephisto","brand:wikidata":"Q822975","brand:wikipedia":"fr:Mephisto (chaussure)",name:"Mephisto",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/New Balance":{name:"New Balance",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q742988"},addTags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"},removeTags:{brand:"New Balance","brand:wikidata":"Q742988","brand:wikipedia":"en:New Balance",name:"New Balance",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Payless ShoeSource":{name:"Payless ShoeSource",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7156755"},addTags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"},removeTags:{brand:"Payless ShoeSource","brand:wikidata":"Q7156755","brand:wikipedia":"en:Payless ShoeSource",name:"Payless ShoeSource",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Quick Schuh":{name:"Quick Schuh",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2123069"},addTags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"},removeTags:{brand:"Quick Schuh","brand:wikidata":"Q2123069","brand:wikipedia":"de:Quick Schuh",name:"Quick Schuh",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Rack Room Shoes":{name:"Rack Room Shoes",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q17109937"},addTags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"},removeTags:{brand:"Rack Room Shoes","brand:wikidata":"Q17109937","brand:wikipedia":"en:Rack Room Shoes",name:"Rack Room Shoes",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Reno":{name:"Reno",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2144204"},addTags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"},removeTags:{brand:"Reno","brand:wikidata":"Q2144204","brand:wikipedia":"de:Reno (Schuhhandel)",name:"Reno",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Rieker":{name:"Rieker",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2152193"},addTags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"},removeTags:{brand:"Rieker","brand:wikidata":"Q2152193","brand:wikipedia":"en:Rieker Shoes",name:"Rieker",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Salamander":{name:"Salamander",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q878354"},addTags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"},removeTags:{brand:"Salamander","brand:wikidata":"Q878354","brand:wikipedia":"de:Salamander (Schuhe)",name:"Salamander",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Scapino":{name:"Scapino",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2298792"},addTags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"},removeTags:{brand:"Scapino","brand:wikidata":"Q2298792","brand:wikipedia":"nl:Scapino (winkelketen)",name:"Scapino",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Schuh":{name:"Schuh",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7432952"},addTags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"},removeTags:{brand:"Schuh","brand:wikidata":"Q7432952","brand:wikipedia":"en:Schuh",name:"Schuh",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Shoe Carnival":{name:"Shoe Carnival",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7500007"},addTags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"},removeTags:{brand:"Shoe Carnival","brand:wikidata":"Q7500007","brand:wikipedia":"en:Shoe Carnival",name:"Shoe Carnival",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Shoe Zone":{name:"Shoe Zone",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q7500016"},addTags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"},removeTags:{brand:"Shoe Zone","brand:wikidata":"Q7500016","brand:wikipedia":"en:Shoe Zone",name:"Shoe Zone",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Siemes Schuhcenter":{name:"Siemes Schuhcenter",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2800720"},addTags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"},removeTags:{brand:"Siemes Schuhcenter","brand:wikidata":"Q2800720","brand:wikipedia":"de:Siemes (Unternehmen)",name:"Siemes Schuhcenter",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Skechers":{name:"Skechers",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q2945643"},addTags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"},removeTags:{brand:"Skechers","brand:wikidata":"Q2945643","brand:wikipedia":"en:Skechers",name:"Skechers",shop:"shoes"},matchScore:2,suggestion:true},"shop/shoes/Vans":{name:"Vans",icon:"maki-shoe",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"shoes","brand:wikidata":"Q1135366"},addTags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"},removeTags:{brand:"Vans","brand:wikidata":"Q1135366","brand:wikipedia":"en:Vans",name:"Vans",shop:"shoes"},matchScore:2,suggestion:true},"shop/sports/Adidas":{name:"Adidas",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q3895"},addTags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"},removeTags:{brand:"Adidas","brand:wikidata":"Q3895","brand:wikipedia":"en:Adidas",name:"Adidas",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Aktiesport":{name:"Aktiesport",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q57546889"},addTags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"},removeTags:{brand:"Aktiesport","brand:wikidata":"Q57546889",name:"Aktiesport",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Big 5 Sporting Goods":{name:"Big 5 Sporting Goods",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q4904902"},addTags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"},removeTags:{brand:"Big 5 Sporting Goods","brand:wikidata":"Q4904902","brand:wikipedia":"en:Big 5 Sporting Goods",name:"Big 5 Sporting Goods",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Decathlon":{name:"Decathlon",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q509349"},addTags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"},removeTags:{brand:"Decathlon","brand:wikidata":"Q509349","brand:wikipedia":"en:Decathlon Group",name:"Decathlon",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Dick's Sporting Goods":{name:"Dick's Sporting Goods",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q5272601"},addTags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"},removeTags:{brand:"Dick's Sporting Goods","brand:wikidata":"Q5272601","brand:wikipedia":"en:Dick's Sporting Goods",name:"Dick's Sporting Goods",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Hervis":{name:"Hervis",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q1614816"},addTags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"},removeTags:{brand:"Hervis","brand:wikidata":"Q1614816","brand:wikipedia":"de:Hervis",name:"Hervis",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Hibbett Sports":{name:"Hibbett Sports",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q5750671"},addTags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"},removeTags:{brand:"Hibbett Sports","brand:wikidata":"Q5750671","brand:wikipedia":"en:Hibbett Sports",name:"Hibbett Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Intersport":{name:"Intersport",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q666888"},addTags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"},removeTags:{brand:"Intersport","brand:wikidata":"Q666888","brand:wikipedia":"en:Intersport",name:"Intersport",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/JD Sports":{name:"JD Sports",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q6108019"},addTags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"},removeTags:{brand:"JD Sports","brand:wikidata":"Q6108019","brand:wikipedia":"en:JD Sports",name:"JD Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Play It Again Sports":{name:"Play It Again Sports",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q7203029"},addTags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"},removeTags:{brand:"Play It Again Sports","brand:wikidata":"Q7203029","brand:wikipedia":"en:Play It Again Sports",name:"Play It Again Sports",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sport 2000":{name:"Sport 2000",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q262394"},addTags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"},removeTags:{brand:"Sport 2000","brand:wikidata":"Q262394","brand:wikipedia":"de:Sport 2000",name:"Sport 2000",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sportisimo":{name:"Sportisimo",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q54974273"},addTags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"},removeTags:{brand:"Sportisimo","brand:wikidata":"Q54974273",name:"Sportisimo",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sports Authority":{name:"Sports Authority",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q7579688"},addTags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"},removeTags:{brand:"Sports Authority","brand:wikidata":"Q7579688","brand:wikipedia":"en:Sports Authority",name:"Sports Authority",shop:"sports"},matchScore:2,suggestion:true},"shop/sports/Sports Direct":{name:"Sports Direct",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"sports","brand:wikidata":"Q2913554"},addTags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"},removeTags:{brand:"Sports Direct","brand:wikidata":"Q2913554","brand:wikipedia":"en:Sports Direct",name:"Sports Direct",shop:"sports"},matchScore:2,suggestion:true},"shop/stationery/McPaper":{name:"McPaper",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q1915329"},addTags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"},removeTags:{brand:"McPaper","brand:wikidata":"Q1915329","brand:wikipedia":"de:McPaper",name:"McPaper",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Office Depot":{name:"Office Depot",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q1337797"},addTags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"},removeTags:{brand:"Office Depot","brand:wikidata":"Q1337797","brand:wikipedia":"en:Office Depot",name:"Office Depot",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/OfficeMax":{name:"OfficeMax",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7079111"},addTags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"},removeTags:{brand:"OfficeMax","brand:wikidata":"Q7079111","brand:wikipedia":"en:OfficeMax",name:"OfficeMax",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Officeworks":{name:"Officeworks",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7079486"},addTags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"},removeTags:{brand:"Officeworks","brand:wikidata":"Q7079486","brand:wikipedia":"en:Officeworks",name:"Officeworks",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Pagro":{name:"Pagro",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q57550022"},addTags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"},removeTags:{brand:"Pagro","brand:wikidata":"Q57550022",name:"Pagro",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Paperchase":{name:"Paperchase",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7132739"},addTags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"},removeTags:{brand:"Paperchase","brand:wikidata":"Q7132739","brand:wikipedia":"en:Paperchase",name:"Paperchase",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Ryman":{name:"Ryman",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q7385188"},addTags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"},removeTags:{brand:"Ryman","brand:wikidata":"Q7385188","brand:wikipedia":"en:Ryman",name:"Ryman",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Staples":{name:"Staples",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q785943"},addTags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"},removeTags:{brand:"Staples","brand:wikidata":"Q785943","brand:wikipedia":"en:Staples Inc.",name:"Staples",shop:"stationery"},matchScore:2,suggestion:true},"shop/stationery/Комус":{name:"Комус",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"stationery","brand:wikidata":"Q4230314"},addTags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"},removeTags:{brand:"Комус","brand:en":"Komus","brand:wikidata":"Q4230314","brand:wikipedia":"en:Komus (company)",name:"Комус","name:en":"Komus",shop:"stationery"},matchScore:2,suggestion:true},"shop/storage_rental/Public Storage":{name:"Public Storage",icon:"fas-warehouse",fields:["name","operator","address","building","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"storage_rental","brand:wikidata":"Q1156045"},addTags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"},removeTags:{brand:"Public Storage","brand:wikidata":"Q1156045","brand:wikipedia":"en:Public Storage",name:"Public Storage",shop:"storage_rental"},matchScore:2,suggestion:true},"shop/supermarket/A&O":{name:"A&O",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3600279"},addTags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"},removeTags:{brand:"A&O","brand:wikidata":"Q3600279","brand:wikipedia":"it:A&O",name:"A&O",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/A101":{name:"A101",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6034496"},addTags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"},removeTags:{brand:"A101","brand:wikidata":"Q6034496","brand:wikipedia":"tr:A101",name:"A101",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ADEG":{name:"ADEG",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q290211"},addTags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"},removeTags:{brand:"ADEG","brand:wikidata":"Q290211","brand:wikipedia":"de:ADEG Österreich",name:"ADEG",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ahorramás":{name:"Ahorramás",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58221883"},addTags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"},removeTags:{brand:"Ahorramás","brand:wikidata":"Q58221883",name:"Ahorramás",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albert":{name:"Albert",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9144241"},addTags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"},removeTags:{brand:"Albert","brand:wikidata":"Q9144241","brand:wikipedia":"cs:Albert (obchodní řetězec)",name:"Albert",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albert Heijn":{name:"Albert Heijn",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1653985"},addTags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"},removeTags:{brand:"Albert Heijn","brand:wikidata":"Q1653985","brand:wikipedia":"nl:Albert Heijn (supermarkt)",name:"Albert Heijn",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Albertsons":{name:"Albertsons",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4712282"},addTags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"},removeTags:{brand:"Albertsons","brand:wikidata":"Q4712282","brand:wikipedia":"en:Albertsons",name:"Albertsons",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi":{name:"Aldi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q125054"},addTags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"},removeTags:{brand:"Aldi","brand:wikidata":"Q125054","brand:wikipedia":"en:Aldi",name:"Aldi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi Nord":{name:"Aldi Nord",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41171373"},addTags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"},removeTags:{brand:"Aldi Nord","brand:wikidata":"Q41171373","brand:wikipedia":"en:Aldi",name:"Aldi Nord",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Aldi Süd":{name:"Aldi Süd",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41171672"},addTags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"},removeTags:{brand:"Aldi Süd","brand:wikidata":"Q41171672","brand:wikipedia":"en:Aldi",name:"Aldi Süd",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Alimerka":{name:"Alimerka",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16482738"},addTags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"},removeTags:{brand:"Alimerka","brand:wikidata":"Q16482738","brand:wikipedia":"es:Alimerka",name:"Alimerka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Alnatura":{name:"Alnatura",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q876811"},addTags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",shop:"supermarket"},removeTags:{brand:"Alnatura","brand:wikidata":"Q876811","brand:wikipedia":"en:Alnatura",name:"Alnatura",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Atacadão":{name:"Atacadão",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2868739"},addTags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"},removeTags:{brand:"Atacadão","brand:wikidata":"Q2868739","brand:wikipedia":"en:Atacadão",name:"Atacadão",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Auchan":{name:"Auchan",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q758603"},addTags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"},removeTags:{brand:"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"en:Auchan",name:"Auchan",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bi-Lo":{name:"Bi-Lo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4835622"},addTags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",shop:"supermarket"},removeTags:{brand:"Bi-Lo","brand:wikidata":"Q4835622","brand:wikipedia":"en:BI-LO (Australia)",name:"Bi-Lo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Biedronka":{name:"Biedronka",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q857182"},addTags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"en:Biedronka",name:"Biedronka",shop:"supermarket"},removeTags:{brand:"Biedronka","brand:wikidata":"Q857182","brand:wikipedia":"en:Biedronka",name:"Biedronka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Big C":{name:"Big C",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q858665"},addTags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"},removeTags:{brand:"Big C","brand:wikidata":"Q858665","brand:wikipedia":"en:Big C",name:"Big C",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Billa":{name:"Billa",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q537781"},addTags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"},removeTags:{brand:"Billa","brand:wikidata":"Q537781","brand:wikipedia":"en:Billa (supermarket)",name:"Billa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bingo":{name:"Bingo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16842066"},addTags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"},removeTags:{brand:"Bingo","brand:wikidata":"Q16842066","brand:wikipedia":"bs:Bingo (kompanija)",name:"Bingo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Biocoop":{name:"Biocoop",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2904039"},addTags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"},removeTags:{brand:"Biocoop","brand:wikidata":"Q2904039","brand:wikipedia":"fr:Biocoop",name:"Biocoop",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Brookshire Brothers":{name:"Brookshire Brothers",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4975084"},addTags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"},removeTags:{brand:"Brookshire Brothers","brand:wikidata":"Q4975084","brand:wikipedia":"en:Brookshire Brothers",name:"Brookshire Brothers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Budgens":{name:"Budgens",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4985016"},addTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"},removeTags:{brand:"Budgens","brand:wikidata":"Q4985016","brand:wikipedia":"en:Budgens",name:"Budgens",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bulk Barn":{name:"Bulk Barn",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4996466"},addTags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"},removeTags:{brand:"Bulk Barn","brand:wikidata":"Q4996466",name:"Bulk Barn",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Bunnpris":{name:"Bunnpris",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1774634"},addTags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"},removeTags:{brand:"Bunnpris","brand:wikidata":"Q1774634","brand:wikipedia":"en:Bunnpris",name:"Bunnpris",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/COOP Jednota":{name:"COOP Jednota",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q41629254"},addTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"},removeTags:{brand:"COOP Jednota","brand:wikidata":"Q41629254","brand:wikipedia":"sk:COOP Jednota Slovensko",name:"COOP Jednota",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Caprabo":{name:"Caprabo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1980781"},addTags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"},removeTags:{brand:"Caprabo","brand:wikidata":"Q1980781","brand:wikipedia":"en:Caprabo",name:"Caprabo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cargills Food City":{name:"Cargills Food City",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58353955"},addTags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",shop:"supermarket"},removeTags:{brand:"Cargills Food City","brand:wikidata":"Q58353955",name:"Cargills Food City","operator:wikidata":"Q5039260","operator:wikipedia":"en:Cargills (Ceylon)",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour":{name:"Carrefour",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q217599"},addTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour","brand:wikidata":"Q217599","brand:wikipedia":"fr:Carrefour (enseigne)",name:"Carrefour",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour City":{name:"Carrefour City",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940187"},addTags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour City","brand:wikidata":"Q2940187","brand:wikipedia":"fr:Carrefour City",name:"Carrefour City",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Contact":{name:"Carrefour Contact",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940188"},addTags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Contact","brand:wikidata":"Q2940188","brand:wikipedia":"fr:Carrefour Contact",name:"Carrefour Contact",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Express":{name:"Carrefour Express",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2940190"},addTags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Express","brand:wikidata":"Q2940190","brand:wikipedia":"fr:Carrefour Express",name:"Carrefour Express",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carrefour Market":{name:"Carrefour Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2689639"},addTags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},removeTags:{brand:"Carrefour Market","brand:wikidata":"Q2689639","brand:wikipedia":"fr:Carrefour Market",name:"Carrefour Market",operator:"Groupe Carrefour","operator:wikidata":"Q3117359","operator:wikipedia":"fr:Groupe Carrefour",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Carulla":{name:"Carulla",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5047480"},addTags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"},removeTags:{brand:"Carulla","brand:wikidata":"Q5047480","brand:wikipedia":"en:Carulla",name:"Carulla",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Checkers":{name:"Checkers",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5089126"},addTags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"},removeTags:{brand:"Checkers","brand:wikidata":"Q5089126","brand:wikipedia":"en:Checkers (supermarket chain)",name:"Checkers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Chedraui":{name:"Chedraui",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2961952"},addTags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"},removeTags:{brand:"Chedraui","brand:wikidata":"Q2961952","brand:wikipedia":"en:Chedraui",name:"Chedraui",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/City Market":{name:"City Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5123299"},addTags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"},removeTags:{brand:"City Market","brand:wikidata":"Q5123299","brand:wikipedia":"en:City Market (US grocery store chain)",name:"City Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Co-op":{name:"Co-op",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5440676"},addTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"},removeTags:{brand:"Federated Co-operatives","brand:wikidata":"Q5440676","brand:wikipedia":"en:Federated Co-operatives",name:"Co-op",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Colruyt":{name:"Colruyt",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2363991"},addTags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"},removeTags:{brand:"Colruyt","brand:wikidata":"Q2363991","brand:wikipedia":"en:Colruyt (supermarket)",name:"Colruyt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Combi":{name:"Combi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1113618"},addTags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"},removeTags:{brand:"Combi","brand:wikidata":"Q1113618","brand:wikipedia":"de:Combi (Einkaufsmarkt)",name:"Combi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Comercial Mexicana":{name:"Comercial Mexicana",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2985173"},addTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},removeTags:{brand:"Comercial Mexicana","brand:wikidata":"Q2985173","brand:wikipedia":"en:Comercial Mexicana",name:"Comercial Mexicana",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Conad":{name:"Conad",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q639075"},addTags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"},removeTags:{brand:"Conad","brand:wikidata":"Q639075","brand:wikipedia":"it:Conad",name:"Conad",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Conad City":{name:"Conad City",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57543102"},addTags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"},removeTags:{brand:"Conad City","brand:wikidata":"Q57543102",name:"Conad City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Condis":{name:"Condis",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57417581"},addTags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"},removeTags:{brand:"Condis","brand:wikidata":"Q57417581",name:"Condis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Consum":{name:"Consum",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q8350308"},addTags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"},removeTags:{brand:"Consum","brand:wikidata":"Q8350308","brand:wikipedia":"es:Consum",name:"Consum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Continente":{name:"Continente",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2995683"},addTags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"},removeTags:{brand:"Continente","brand:wikidata":"Q2995683","brand:wikipedia":"en:Continente (Supermarket)",name:"Continente",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Coop Prix":{name:"Coop Prix",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5167705"},addTags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"},removeTags:{brand:"Coop Prix","brand:wikidata":"Q5167705","brand:wikipedia":"no:Coop Prix",name:"Coop Prix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cora":{name:"Cora",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q686643"},addTags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"},removeTags:{brand:"Cora","brand:wikidata":"Q686643","brand:wikipedia":"en:Cora (hypermarket)",name:"Cora",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Costcutter":{name:"Costcutter",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5175072"},addTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"},removeTags:{brand:"Costcutter","brand:wikidata":"Q5175072","brand:wikipedia":"en:Costcutter",name:"Costcutter",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Coto":{name:"Coto",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5175411"},addTags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"},removeTags:{brand:"Coto","brand:wikidata":"Q5175411","brand:wikipedia":"es:Coto (supermercado)",name:"Coto",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Countdown":{name:"Countdown",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5176845"},addTags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"},removeTags:{brand:"Countdown","brand:wikidata":"Q5176845","brand:wikipedia":"en:Countdown (supermarket)",name:"Countdown",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Cub Foods":{name:"Cub Foods",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5191916"},addTags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"},removeTags:{brand:"Cub Foods","brand:wikidata":"Q5191916","brand:wikipedia":"en:Cub Foods",name:"Cub Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/D1":{name:"D1",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q43403418"},addTags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"},removeTags:{brand:"D1","brand:wikidata":"Q43403418","brand:wikipedia":"es:Tiendas D1",name:"D1",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dagli'Brugsen":{name:"Dagli'Brugsen",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12307017"},addTags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"},removeTags:{brand:"Dagli'Brugsen","brand:wikidata":"Q12307017","brand:wikipedia":"en:Dagli'Brugsen",name:"Dagli'Brugsen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Deen":{name:"Deen",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q13571727"},addTags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"},removeTags:{brand:"Deen","brand:wikidata":"Q13571727","brand:wikipedia":"nl:Deen (supermarkt)",name:"Deen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Delhaize":{name:"Delhaize",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1184173"},addTags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"},removeTags:{brand:"Delhaize","brand:wikidata":"Q1184173","brand:wikipedia":"fr:Delhaize",name:"Delhaize",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Delikatesy Centrum":{name:"Delikatesy Centrum",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11693824"},addTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"},removeTags:{brand:"Delikatesy Centrum","brand:wikidata":"Q11693824","brand:wikipedia":"pl:Delikatesy Centrum",name:"Delikatesy Centrum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Denner":{name:"Denner",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q379911"},addTags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarkets)",name:"Denner",shop:"supermarket"},removeTags:{brand:"Denner","brand:wikidata":"Q379911","brand:wikipedia":"en:Denner (supermarkets)",name:"Denner",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dia":{name:"Dia",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia",shop:"supermarket"},removeTags:{brand:"Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dia Market":{name:"Dia Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia Market",shop:"supermarket"},removeTags:{brand:"Dia Market","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Dia Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dino":{name:"Dino",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11694239"},addTags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"},removeTags:{brand:"Dino","brand:wikidata":"Q11694239","brand:wikipedia":"pl:Dino Polska",name:"Dino",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dirk van den Broek":{name:"Dirk van den Broek",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17502722"},addTags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"},removeTags:{brand:"Dirk van den Broek","brand:wikidata":"Q17502722","brand:wikipedia":"en:Dirk (supermarket)",name:"Dirk van den Broek",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Dunnes Stores":{name:"Dunnes Stores",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1266203"},addTags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"},removeTags:{brand:"Dunnes Stores","brand:wikidata":"Q1266203","brand:wikipedia":"en:Dunnes Stores",name:"Dunnes Stores",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/E. Leclerc":{name:"E. Leclerc",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1273376"},addTags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"},removeTags:{brand:"E. Leclerc","brand:wikidata":"Q1273376","brand:wikipedia":"en:E.Leclerc",name:"E. Leclerc",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/EMTÉ":{name:"EMTÉ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3119122"},addTags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"},removeTags:{brand:"EMTÉ","brand:wikidata":"Q3119122","brand:wikipedia":"en:EMTÉ",name:"EMTÉ",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Edeka":{name:"Edeka",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q701755"},addTags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"},removeTags:{brand:"Edeka","brand:wikidata":"Q701755","brand:wikipedia":"en:Edeka",name:"Edeka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eko":{name:"Eko",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9251859"},addTags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"},removeTags:{brand:"Eko","brand:wikidata":"Q9251859","brand:wikipedia":"pl:Eko Holding",name:"Eko",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ekono":{name:"Ekono",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2842729"},addTags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"},removeTags:{brand:"Ekono","brand:wikidata":"Q2842729","brand:wikipedia":"es:Ekono",name:"Ekono",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eroski":{name:"Eroski",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1361349"},addTags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"},removeTags:{brand:"Eroski","brand:wikidata":"Q1361349","brand:wikipedia":"en:Eroski",name:"Eroski",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Esselunga":{name:"Esselunga",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1059636"},addTags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"},removeTags:{brand:"Esselunga","brand:wikidata":"Q1059636","brand:wikipedia":"en:Esselunga",name:"Esselunga",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/EuroSpin":{name:"EuroSpin",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1374674"},addTags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:EuroSpin",name:"EuroSpin",shop:"supermarket"},removeTags:{brand:"EuroSpin","brand:wikidata":"Q1374674","brand:wikipedia":"it:EuroSpin",name:"EuroSpin",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Eurospar":{name:"Eurospar",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12309283"},addTags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"},removeTags:{brand:"Eurospar","brand:wikidata":"Q12309283","brand:wikipedia":"da:Eurospar",name:"Eurospar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Extra":{name:"Extra",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11964085"},addTags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"},removeTags:{brand:"Extra","brand:wikidata":"Q11964085","brand:wikipedia":"no:Extra (Coop)",name:"Extra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Famila":{name:"Famila",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1395108"},addTags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"},removeTags:{brand:"Famila","brand:wikidata":"Q1395108","brand:wikipedia":"de:Famila",name:"Famila",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Fareway":{name:"Fareway",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5434998"},addTags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"},removeTags:{brand:"Fareway","brand:wikidata":"Q5434998","brand:wikipedia":"en:Fareway",name:"Fareway",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Farmfoods":{name:"Farmfoods",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5435841"},addTags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"},removeTags:{brand:"Farmfoods","brand:wikidata":"Q5435841","brand:wikipedia":"en:Farmfoods",name:"Farmfoods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Feneberg":{name:"Feneberg",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5345378"},addTags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"},removeTags:{brand:"Feneberg","brand:wikidata":"Q5345378","brand:wikipedia":"de:Feneberg Lebensmittel",name:"Feneberg",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food 4 Less":{name:"Food 4 Less",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465282"},addTags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"},removeTags:{brand:"Food 4 Less","brand:wikidata":"Q5465282","brand:wikipedia":"en:Food 4 Less",name:"Food 4 Less",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food Basics":{name:"Food Basics",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465300"},addTags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"},removeTags:{brand:"Food Basics","brand:wikidata":"Q5465300","brand:wikipedia":"en:Food Basics",name:"Food Basics",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food City":{name:"Food City",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465306"},addTags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",name:"Food City",shop:"supermarket"},removeTags:{brand:"Food City","brand:wikidata":"Q5465306","brand:wikipedia":"en:Food City (Canada)",name:"Food City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Food Lion":{name:"Food Lion",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1435950"},addTags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"},removeTags:{brand:"Food Lion","brand:wikidata":"Q1435950","brand:wikipedia":"en:Food Lion",name:"Food Lion",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Foodworks":{name:"Foodworks",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5465579"},addTags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"},removeTags:{brand:"Foodworks","brand:wikidata":"Q5465579","brand:wikipedia":"en:Foodworks",name:"Foodworks",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Fred Meyer":{name:"Fred Meyer",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5495932"},addTags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"},removeTags:{brand:"Fred Meyer","brand:wikidata":"Q5495932","brand:wikipedia":"en:Fred Meyer",name:"Fred Meyer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/FreshCo":{name:"FreshCo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5502915"},addTags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"},removeTags:{brand:"FreshCo","brand:wikidata":"Q5502915","brand:wikipedia":"en:FreshCo",name:"FreshCo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Froiz":{name:"Froiz",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17070775"},addTags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"},removeTags:{brand:"Froiz","brand:wikidata":"Q17070775","brand:wikipedia":"en:Froiz",name:"Froiz",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Føtex":{name:"Føtex",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1480395"},addTags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"},removeTags:{brand:"Føtex","brand:wikidata":"Q1480395","brand:wikipedia":"en:Føtex",name:"Føtex",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/G20":{name:"G20",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3504731"},addTags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"},removeTags:{brand:"G20","brand:wikidata":"Q3504731","brand:wikipedia":"fr:Supermarchés G20",name:"G20",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Giant Eagle":{name:"Giant Eagle",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1522721"},addTags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"},removeTags:{brand:"Giant Eagle","brand:wikidata":"Q1522721","brand:wikipedia":"en:Giant Eagle",name:"Giant Eagle",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Globus":{name:"Globus",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q457503"},addTags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"},removeTags:{brand:"Globus","brand:wikidata":"Q457503","brand:wikipedia":"en:Globus (hypermarket)",name:"Globus",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Grand Frais":{name:"Grand Frais",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3114675"},addTags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"},removeTags:{brand:"Grand Frais","brand:wikidata":"Q3114675","brand:wikipedia":"fr:Grand Frais",name:"Grand Frais",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Grocery Outlet":{name:"Grocery Outlet",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5609934"},addTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",shop:"supermarket"},removeTags:{brand:"Grocery Outlet","brand:wikidata":"Q5609934","brand:wikipedia":"en:Grocery Outlet",name:"Grocery Outlet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Géant Casino":{name:"Géant Casino",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1380537"},addTags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"},removeTags:{brand:"Géant Casino","brand:wikidata":"Q1380537","brand:wikipedia":"en:Géant Casino",name:"Géant Casino",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hannaford":{name:"Hannaford",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5648760"},addTags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"},removeTags:{brand:"Hannaford","brand:wikidata":"Q5648760","brand:wikipedia":"en:Hannaford Brothers Company",name:"Hannaford",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Harris Teeter":{name:"Harris Teeter",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5665067"},addTags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"},removeTags:{brand:"Harris Teeter","brand:wikidata":"Q5665067","brand:wikipedia":"en:Harris Teeter",name:"Harris Teeter",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hemköp":{name:"Hemköp",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10521746"},addTags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"},removeTags:{brand:"Hemköp","brand:wikidata":"Q10521746","brand:wikipedia":"sv:Hemköp",name:"Hemköp",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Heron Foods":{name:"Heron Foods",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5743472"},addTags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"},removeTags:{brand:"Heron Foods","brand:wikidata":"Q5743472","brand:wikipedia":"en:Heron Foods",name:"Heron Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hofer":{name:"Hofer",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q15815751"},addTags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"},removeTags:{brand:"Hofer","brand:wikidata":"Q15815751","brand:wikipedia":"de:Hofer KG",name:"Hofer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hoogvliet":{name:"Hoogvliet",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1642179"},addTags:{brand:"Hoogvliet","brand:wikidata":"Q1642179","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"},removeTags:{brand:"Hoogvliet","brand:wikidata":"Q1642179","brand:wikipedia":"nl:Hoogvliet (supermarkt)",name:"Hoogvliet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hy-Vee":{name:"Hy-Vee",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1639719"},addTags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"},removeTags:{brand:"Hy-Vee","brand:wikidata":"Q1639719","brand:wikipedia":"en:Hy-Vee",name:"Hy-Vee",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Hyper U":{name:"Hyper U",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"},removeTags:{brand:"Hyper U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Hyper U",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA":{name:"ICA",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"},removeTags:{brand:"ICA","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA Kvantum":{name:"ICA Kvantum",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"},removeTags:{brand:"ICA Kvantum","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Kvantum",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ICA Maxi":{name:"ICA Maxi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1663776"},addTags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"},removeTags:{brand:"ICA Maxi","brand:wikidata":"Q1663776","brand:wikipedia":"sv:Ica",name:"ICA Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/IGA":{name:"IGA",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3146662"},addTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},removeTags:{brand:"IGA","brand:wikidata":"Q3146662","brand:wikipedia":"en:IGA (supermarkets)",name:"IGA",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Iceland":{name:"Iceland",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q721810"},addTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"},removeTags:{brand:"Iceland","brand:wikidata":"Q721810","brand:wikipedia":"en:Iceland (supermarket)",name:"Iceland",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ingles":{name:"Ingles",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6032595"},addTags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"},removeTags:{brand:"Ingles","brand:wikidata":"Q6032595","brand:wikipedia":"en:Ingles",name:"Ingles",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Intermarché":{name:"Intermarché",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"},removeTags:{brand:"Intermarché","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Intermarché Super":{name:"Intermarché Super",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3153200"},addTags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"},removeTags:{brand:"Intermarché Super","brand:wikidata":"Q3153200","brand:wikipedia":"fr:Intermarché",name:"Intermarché Super",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Irma":{name:"Irma",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q797150"},addTags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"},removeTags:{brand:"Irma","brand:wikidata":"Q797150","brand:wikipedia":"en:Irma (supermarket)",name:"Irma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Jewel-Osco":{name:"Jewel-Osco",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3178470"},addTags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"},removeTags:{brand:"Jewel-Osco","brand:wikidata":"Q3178470","brand:wikipedia":"en:Jewel (supermarket)",name:"Jewel-Osco",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Jumbo":{name:"Jumbo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2262314"},addTags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"},removeTags:{brand:"Jumbo","brand:wikidata":"Q2262314","brand:wikipedia":"en:Jumbo (supermarket)",name:"Jumbo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kaufland":{name:"Kaufland",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q685967"},addTags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"},removeTags:{brand:"Kaufland","brand:wikidata":"Q685967","brand:wikipedia":"en:Kaufland",name:"Kaufland",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/King Soopers":{name:"King Soopers",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6412065"},addTags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"},removeTags:{brand:"King Soopers","brand:wikidata":"Q6412065","brand:wikipedia":"en:King Soopers",name:"King Soopers",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kiwi":{name:"Kiwi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1613639"},addTags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"},removeTags:{brand:"Kiwi","brand:wikidata":"Q1613639","brand:wikipedia":"en:Kiwi (store)",name:"Kiwi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kroger":{name:"Kroger",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q153417"},addTags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"},removeTags:{brand:"Kroger","brand:wikidata":"Q153417","brand:wikipedia":"en:Kroger",name:"Kroger",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Kvickly":{name:"Kvickly",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7061148"},addTags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"},removeTags:{brand:"Kvickly","brand:wikidata":"Q7061148","brand:wikipedia":"en:Kvickly",name:"Kvickly",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/La Plaza de DIA":{name:"La Plaza de DIA",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58904673"},addTags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados Dia",shop:"supermarket"},removeTags:{brand:"La Plaza de DIA","brand:wikidata":"Q58904673",name:"La Plaza de DIA","operator:wikidata":"Q925132","operator:wikipedia":"es:Supermercados Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/La Vie Claire":{name:"La Vie Claire",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3213589"},addTags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"},removeTags:{brand:"La Vie Claire","brand:wikidata":"Q3213589","brand:wikipedia":"en:La Vie Claire (company)",name:"La Vie Claire",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Leader Price":{name:"Leader Price",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2181426"},addTags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"},removeTags:{brand:"Leader Price","brand:wikidata":"Q2181426","brand:wikipedia":"en:Leader Price",name:"Leader Price",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lider":{name:"Lider",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6711261"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"},removeTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lider Express":{name:"Lider Express",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6711261"},addTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"},removeTags:{brand:"Lider","brand:wikidata":"Q6711261","brand:wikipedia":"es:Líder (supermercado)",name:"Lider Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lidl":{name:"Lidl",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q151954"},addTags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"},removeTags:{brand:"Lidl","brand:wikidata":"Q151954","brand:wikipedia":"en:Lidl",name:"Lidl",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lowe's Market":{name:"Lowe's Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6693107"},addTags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"},removeTags:{brand:"Lowe's Market","brand:wikidata":"Q6693107","brand:wikipedia":"en:Lowe's Market",name:"Lowe's Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lowes Foods":{name:"Lowes Foods",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6693991"},addTags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"},removeTags:{brand:"Lowes Foods","brand:wikidata":"Q6693991","brand:wikipedia":"en:Lowes Foods",name:"Lowes Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Lupa":{name:"Lupa",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58044048"},addTags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"},removeTags:{brand:"Lupa","brand:wikidata":"Q58044048",name:"Lupa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/MD":{name:"MD",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3841263"},addTags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"},removeTags:{brand:"MD","brand:wikidata":"Q3841263","brand:wikipedia":"en:MD Discount",name:"MD",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/MPREIS":{name:"MPREIS",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q873491"},addTags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"},removeTags:{brand:"MPREIS","brand:wikidata":"Q873491","brand:wikipedia":"de:MPreis",name:"MPREIS",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Markant":{name:"Markant",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57523365"},addTags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"},removeTags:{brand:"Markant","brand:wikidata":"Q57523365",name:"Markant",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Market Basket":{name:"Market Basket",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2079198"},addTags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"},removeTags:{brand:"Market Basket","brand:wikidata":"Q2079198","brand:wikipedia":"en:Market Basket (New England)",name:"Market Basket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Marktkauf":{name:"Marktkauf",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1533254"},addTags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"},removeTags:{brand:"Marktkauf","brand:wikidata":"Q1533254","brand:wikipedia":"de:Marktkauf Holding",name:"Marktkauf",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Match":{name:"Match",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q513977"},addTags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"},removeTags:{brand:"Match","brand:wikidata":"Q513977","brand:wikipedia":"en:Match (supermarket)",name:"Match",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi Dia":{name:"Maxi Dia",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q925132"},addTags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Maxi Dia",shop:"supermarket"},removeTags:{brand:"Maxi Dia","brand:wikidata":"Q925132","brand:wikipedia":"es:Supermercados Dia",name:"Maxi Dia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima X":{name:"Maxima X",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"},removeTags:{brand:"Maxima X","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima X",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima XX":{name:"Maxima XX",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"},removeTags:{brand:"Maxima XX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",name:"Maxima XX",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxima XXX":{name:"Maxima XXX",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1881222"},addTags:{brand:"Maxima XXX",name:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",shop:"supermarket"},removeTags:{brand:"Maxima XXX",name:"Maxima XXX","brand:wikidata":"Q1881222","brand:wikipedia":"en:Maxima Group",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi (Canada)":{name:"Maxi (Canada)",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3302441"},addTags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"},removeTags:{brand:"Maxi","brand:wikidata":"Q3302441","brand:wikipedia":"en:Maxi (Canadian supermarket)",name:"Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Maxi (Serbia)":{name:"Maxi (Serbia)",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6795490"},addTags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (supermarkets)",name:"Maxi",shop:"supermarket"},removeTags:{brand:"Maxi","brand:wikidata":"Q6795490","brand:wikipedia":"en:Maxi (supermarkets)",name:"Maxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mega Image":{name:"Mega Image",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6808085"},addTags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"},removeTags:{brand:"Mega Image","brand:wikidata":"Q6808085","brand:wikipedia":"en:Mega Image",name:"Mega Image",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mego":{name:"Mego",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16363314"},addTags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"},removeTags:{brand:"Mego","brand:wikidata":"Q16363314","brand:wikipedia":"lv:Mego",name:"Mego",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Meijer":{name:"Meijer",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1917753"},addTags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"},removeTags:{brand:"Meijer","brand:wikidata":"Q1917753","brand:wikipedia":"en:Meijer",name:"Meijer",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Meny":{name:"Meny",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10581720"},addTags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"},removeTags:{brand:"Meny","brand:wikidata":"Q10581720","brand:wikipedia":"en:Meny",name:"Meny",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mercadona":{name:"Mercadona",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q377705"},addTags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"},removeTags:{brand:"Mercadona","brand:wikidata":"Q377705","brand:wikipedia":"en:Mercadona",name:"Mercadona",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Merkur":{name:"Merkur",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1921857"},addTags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"},removeTags:{brand:"Merkur","brand:wikidata":"Q1921857","brand:wikipedia":"de:Merkur (Österreich)",name:"Merkur",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Migros":{name:"Migros",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q680727"},addTags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"},removeTags:{brand:"Migros","brand:wikidata":"Q680727","brand:wikipedia":"en:Migros",name:"Migros",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Mila":{name:"Mila",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q48844636"},addTags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"},removeTags:{brand:"Mila","brand:wikidata":"Q48844636","brand:wikipedia":"pl:Mila (sieć sklepów)",name:"Mila",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Minipreço":{name:"Minipreço",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3042224"},addTags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"},removeTags:{brand:"Minipreço","brand:wikidata":"Q3042224","brand:wikipedia":"en:Minipreço",name:"Minipreço",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Monoprix":{name:"Monoprix",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3321241"},addTags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"},removeTags:{brand:"Monoprix","brand:wikidata":"Q3321241","brand:wikipedia":"en:Monoprix",name:"Monoprix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Nah & Frisch":{name:"Nah & Frisch",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1963643"},addTags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"},removeTags:{brand:"Nah & Frisch","brand:wikidata":"Q1963643","brand:wikipedia":"de:Nah & Frisch",name:"Nah & Frisch",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Nahkauf":{name:"Nahkauf",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57515238"},addTags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"},removeTags:{brand:"Nahkauf","brand:wikidata":"Q57515238",name:"Nahkauf",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Naturalia":{name:"Naturalia",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3337081"},addTags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"},removeTags:{brand:"Naturalia","brand:wikidata":"Q3337081","brand:wikipedia":"fr:Naturalia",name:"Naturalia",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Netto":{name:"Netto",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q552652"},addTags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"},removeTags:{brand:"Netto","brand:wikidata":"Q552652","brand:wikipedia":"en:Netto (store)",name:"Netto",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Netto Marken-Discount":{name:"Netto Marken-Discount",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q879858"},addTags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"},removeTags:{brand:"Netto Marken-Discount","brand:wikidata":"Q879858","brand:wikipedia":"en:Netto Marken-Discount",name:"Netto Marken-Discount",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/New World":{name:"New World",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7012488"},addTags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"},removeTags:{brand:"New World","brand:wikidata":"Q7012488","brand:wikipedia":"en:New World (supermarket)",name:"New World",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/No Frills":{name:"No Frills",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3342407"},addTags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"},removeTags:{brand:"No Frills","brand:wikidata":"Q3342407","brand:wikipedia":"en:No Frills (grocery store)",name:"No Frills",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Norfa XL":{name:"Norfa XL",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1998983"},addTags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"},removeTags:{brand:"Norfa XL","brand:wikidata":"Q1998983","brand:wikipedia":"lt:Norfa",name:"Norfa XL",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Norma":{name:"Norma",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q450180"},addTags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"},removeTags:{brand:"Norma","brand:wikidata":"Q450180","brand:wikipedia":"de:Norma (Handelskette)",name:"Norma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Okay":{name:"Okay",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2159701"},addTags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"},removeTags:{brand:"Okay","brand:wikidata":"Q2159701","brand:wikipedia":"fr:OKay",name:"Okay",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Olímpica":{name:"Olímpica",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q24749847"},addTags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Olímpica (supermercado)",name:"Olímpica",shop:"supermarket"},removeTags:{brand:"Olímpica","brand:wikidata":"Q24749847","brand:wikipedia":"es:Olímpica (supermercado)",name:"Olímpica",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/PLUS":{name:"PLUS",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1978981"},addTags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"},removeTags:{brand:"PLUS","brand:wikidata":"Q1978981","brand:wikipedia":"nl:PLUS (Nederlandse supermarkt)",name:"PLUS",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/POLOmarket":{name:"POLOmarket",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11821937"},addTags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"en:Polomarket",name:"POLOmarket",shop:"supermarket"},removeTags:{brand:"POLOmarket","brand:wikidata":"Q11821937","brand:wikipedia":"en:Polomarket",name:"POLOmarket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Palí":{name:"Palí",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1064887"},addTags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"},removeTags:{brand:"Palí","brand:wikidata":"Q1064887","brand:wikipedia":"es:Walmart de México y Centroamérica",name:"Palí",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Penny":{name:"Penny",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q284688"},addTags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"},removeTags:{brand:"Penny","brand:wikidata":"Q284688","brand:wikipedia":"en:Penny (supermarket)",name:"Penny",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pick n Pay":{name:"Pick n Pay",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7190735"},addTags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"},removeTags:{brand:"Pick n Pay","brand:wikidata":"Q7190735","brand:wikipedia":"en:Pick n Pay Stores",name:"Pick n Pay",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Piggly Wiggly":{name:"Piggly Wiggly",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3388303"},addTags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"},removeTags:{brand:"Piggly Wiggly","brand:wikidata":"Q3388303","brand:wikipedia":"en:Piggly Wiggly",name:"Piggly Wiggly",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pingo Doce":{name:"Pingo Doce",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1575057"},addTags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"},removeTags:{brand:"Pingo Doce","brand:wikidata":"Q1575057","brand:wikipedia":"en:Pingo Doce",name:"Pingo Doce",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Piotr i Paweł":{name:"Piotr i Paweł",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2096356"},addTags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"en:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"},removeTags:{brand:"Piotr i Paweł","brand:wikidata":"Q2096356","brand:wikipedia":"en:Piotr i Paweł",name:"Piotr i Paweł",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Plaza Vea":{name:"Plaza Vea",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7203672"},addTags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"},removeTags:{brand:"Plaza Vea","brand:wikidata":"Q7203672","brand:wikipedia":"en:Plaza Vea",name:"Plaza Vea",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Plodine":{name:"Plodine",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58040098"},addTags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"},removeTags:{brand:"Plodine","brand:wikidata":"Q58040098",name:"Plodine",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Poiesz":{name:"Poiesz",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2521700"},addTags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"},removeTags:{brand:"Poiesz","brand:wikidata":"Q2521700","brand:wikipedia":"nl:Poiesz Supermarkten",name:"Poiesz",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (Kansas City)":{name:"Price Chopper (Kansas City)",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7242572"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"},removeTags:{brand:"Price Chopper","brand:wikidata":"Q7242572","brand:wikipedia":"en:Price Chopper (supermarket)",name:"Price Chopper",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Price Chopper (New York)":{name:"Price Chopper (New York)",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7242574"},addTags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"},removeTags:{brand:"Price Chopper","brand:wikidata":"Q7242574","brand:wikipedia":"en:Price Chopper Supermarkets",name:"Price Chopper",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Profi":{name:"Profi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q956664"},addTags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"},removeTags:{brand:"Profi","brand:wikidata":"Q956664","brand:wikipedia":"en:Profi",name:"Profi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Provigo":{name:"Provigo",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3408306"},addTags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"},removeTags:{brand:"Provigo","brand:wikidata":"Q3408306","brand:wikipedia":"en:Provigo",name:"Provigo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Proxi":{name:"Proxi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3408522"},addTags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"supermarket"},removeTags:{brand:"Proxi","brand:wikidata":"Q3408522","brand:wikipedia":"fr:Proxi",name:"Proxi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Publix":{name:"Publix",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q672170"},addTags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"},removeTags:{brand:"Publix","brand:wikidata":"Q672170","brand:wikipedia":"en:Publix",name:"Publix",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Punto Simply":{name:"Punto Simply",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3484790"},addTags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"},removeTags:{brand:"Punto Simply","brand:wikidata":"Q3484790","brand:wikipedia":"it:Simply Market",name:"Punto Simply",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Puregold":{name:"Puregold",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7261170"},addTags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"},removeTags:{brand:"Puregold","brand:wikidata":"Q7261170","brand:wikipedia":"en:Puregold",name:"Puregold",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Pão de Açúcar":{name:"Pão de Açúcar",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3411543"},addTags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"},removeTags:{brand:"Pão de Açúcar","brand:wikidata":"Q3411543","brand:wikipedia":"pt:Pão de Açúcar (supermercado brasileiro)",name:"Pão de Açúcar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/QFC":{name:"QFC",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7265425"},addTags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"},removeTags:{brand:"QFC","brand:wikidata":"Q7265425","brand:wikipedia":"en:QFC",name:"QFC",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ralphs":{name:"Ralphs",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3929820"},addTags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"},removeTags:{brand:"Ralphs","brand:wikidata":"Q3929820","brand:wikipedia":"en:Ralphs",name:"Ralphs",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Real":{name:"Real",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q698473"},addTags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"},removeTags:{brand:"Real","brand:wikidata":"Q698473","brand:wikipedia":"en:Real (hypermarket)",name:"Real",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Real Canadian Superstore":{name:"Real Canadian Superstore",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7300856"},addTags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"},removeTags:{brand:"Real Canadian Superstore","brand:wikidata":"Q7300856","brand:wikipedia":"en:Real Canadian Superstore",name:"Real Canadian Superstore",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Reliance Fresh":{name:"Reliance Fresh",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7311014"},addTags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"},removeTags:{brand:"Reliance Fresh","brand:wikidata":"Q7311014","brand:wikipedia":"en:Reliance Fresh",name:"Reliance Fresh",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rema 1000":{name:"Rema 1000",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q28459"},addTags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"},removeTags:{brand:"Rema 1000","brand:wikidata":"Q28459","brand:wikipedia":"en:REMA 1000",name:"Rema 1000",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rewe":{name:"Rewe",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16968817"},addTags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"},removeTags:{brand:"Rewe","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rewe City":{name:"Rewe City",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q16968817"},addTags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"},removeTags:{brand:"Rewe City","brand:wikidata":"Q16968817","brand:wikipedia":"en:REWE",name:"Rewe City",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Rimi":{name:"Rimi",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7334456"},addTags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"},removeTags:{brand:"Rimi","brand:wikidata":"Q7334456","brand:wikipedia":"en:Rimi (Norway)",name:"Rimi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/S-Market":{name:"S-Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11891613"},addTags:{brand:"S-Market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-Market",shop:"supermarket"},removeTags:{brand:"S-Market","brand:wikidata":"Q11891613","brand:wikipedia":"fi:S-market",name:"S-Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Safeway":{name:"Safeway",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1508234"},addTags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"},removeTags:{brand:"Safeway","brand:wikidata":"Q1508234","brand:wikipedia":"en:Safeway Inc.",name:"Safeway",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Santa Isabel":{name:"Santa Isabel",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7419620"},addTags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"},removeTags:{brand:"Santa Isabel","brand:wikidata":"Q7419620","brand:wikipedia":"es:Santa Isabel (supermercado)",name:"Santa Isabel",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Save-A-Lot":{name:"Save-A-Lot",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7427972"},addTags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"},removeTags:{brand:"Save-A-Lot","brand:wikidata":"Q7427972","brand:wikipedia":"en:Save-A-Lot",name:"Save-A-Lot",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Schnucks":{name:"Schnucks",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7431920"},addTags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"},removeTags:{brand:"Schnucks","brand:wikidata":"Q7431920","brand:wikipedia":"en:Schnucks",name:"Schnucks",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Shaw's":{name:"Shaw's",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q578387"},addTags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"},removeTags:{brand:"Shaw's","brand:wikidata":"Q578387","brand:wikipedia":"en:Shaw's and Star Market",name:"Shaw's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ShopRite":{name:"ShopRite",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7501097"},addTags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"},removeTags:{brand:"ShopRite","brand:wikidata":"Q7501097","brand:wikipedia":"en:ShopRite (United States)",name:"ShopRite",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Shoprite":{name:"Shoprite",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1857639"},addTags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:ShopRite (South Africa)",name:"Shoprite",shop:"supermarket"},removeTags:{brand:"Shoprite","brand:wikidata":"Q1857639","brand:wikipedia":"en:ShopRite (South Africa)",name:"Shoprite",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sigma":{name:"Sigma",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3977979"},addTags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"},removeTags:{brand:"Sigma","brand:wikidata":"Q3977979","brand:wikipedia":"it:Supermercati Sigma",name:"Sigma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Simply Market":{name:"Simply Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3484790"},addTags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"},removeTags:{brand:"Simply Market","brand:wikidata":"Q3484790","brand:wikipedia":"en:Simply Market",name:"Simply Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sky":{name:"Sky",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1129779"},addTags:{name:"Sky",brand:"Sky","brand:wikipedia":"de:Coop eG","brand:wikidata":"Q1129779",shop:"supermarket"},removeTags:{name:"Sky",brand:"Sky","brand:wikipedia":"de:Coop eG","brand:wikidata":"Q1129779",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Smith's":{name:"Smith's",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7544856"},addTags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"},removeTags:{brand:"Smith's","brand:wikidata":"Q7544856","brand:wikipedia":"en:Smith's Food and Drug",name:"Smith's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sobeys":{name:"Sobeys",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1143340"},addTags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"},removeTags:{brand:"Sobeys","brand:wikidata":"Q1143340","brand:wikipedia":"en:Sobeys",name:"Sobeys",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Soriana":{name:"Soriana",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q735562"},addTags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"},removeTags:{brand:"Soriana","brand:wikidata":"Q735562","brand:wikipedia":"en:Soriana",name:"Soriana",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Sprouts Farmers Market":{name:"Sprouts Farmers Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7581369"},addTags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"},removeTags:{brand:"Sprouts Farmers Market","brand:wikidata":"Q7581369","brand:wikipedia":"en:Sprouts Farmers Market",name:"Sprouts Farmers Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stater Bros.":{name:"Stater Bros.",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7604016"},addTags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"},removeTags:{brand:"Stater Bros.","brand:wikidata":"Q7604016","brand:wikipedia":"en:Stater Bros.",name:"Stater Bros.",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stokrotka":{name:"Stokrotka",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q9345945"},addTags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"en:Stokrotka",name:"Stokrotka",shop:"supermarket"},removeTags:{brand:"Stokrotka","brand:wikidata":"Q9345945","brand:wikipedia":"en:Stokrotka",name:"Stokrotka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Stop & Shop":{name:"Stop & Shop",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3658429"},addTags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"},removeTags:{brand:"Stop & Shop","brand:wikidata":"Q3658429","brand:wikipedia":"en:Stop & Shop",name:"Stop & Shop",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Suma":{name:"Suma",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58012362"},addTags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"},removeTags:{brand:"Suma","brand:wikidata":"Q58012362",name:"Suma",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Super C":{name:"Super C",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3504127"},addTags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"},removeTags:{brand:"Super C","brand:wikidata":"Q3504127","brand:wikipedia":"en:Super C (supermarket)",name:"Super C",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Super U":{name:"Super U",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"},removeTags:{brand:"Super U","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"Super U",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/SuperBrugsen":{name:"SuperBrugsen",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12337746"},addTags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"},removeTags:{brand:"SuperBrugsen","brand:wikidata":"Q12337746","brand:wikipedia":"en:SuperBrugsen",name:"SuperBrugsen",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/SuperValu":{name:"SuperValu",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7642081"},addTags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)`",name:"SuperValu",shop:"supermarket"},removeTags:{brand:"SuperValu","brand:wikidata":"Q7642081","brand:wikipedia":"en:SuperValu (Ireland)`",name:"SuperValu",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Superama":{name:"Superama",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6135762"},addTags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"},removeTags:{brand:"Superama","brand:wikidata":"Q6135762","brand:wikipedia":"es:Superama",name:"Superama",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Superspar":{name:"Superspar",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q610492"},addTags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"},removeTags:{brand:"Superspar","brand:wikidata":"Q610492","brand:wikipedia":"en:Spar (retailer)",name:"Superspar",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tegut":{name:"Tegut",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1547993"},addTags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"},removeTags:{brand:"Tegut","brand:wikidata":"Q1547993","brand:wikipedia":"en:Tegut",name:"Tegut",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco":{name:"Tesco",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q487494"},addTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"},removeTags:{brand:"Tesco","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Express":{name:"Tesco Express",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q487494"},addTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"},removeTags:{brand:"Tesco Express","brand:wikidata":"Q487494","brand:wikipedia":"en:Tesco",name:"Tesco Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Extra":{name:"Tesco Extra",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q25172225"},addTags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"},removeTags:{brand:"Tesco Extra","brand:wikidata":"Q25172225","brand:wikipedia":"en:Tesco Extra",name:"Tesco Extra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tesco Metro":{name:"Tesco Metro",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57551648"},addTags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"},removeTags:{brand:"Tesco Metro","brand:wikidata":"Q57551648",name:"Tesco Metro",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/The Co-operative Food":{name:"The Co-operative Food",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3277439"},addTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"},removeTags:{brand:"The Co-operative Food","brand:wikidata":"Q3277439","brand:wikipedia":"en:Co-op Food",name:"The Co-operative Food",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/The Fresh Market":{name:"The Fresh Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7735265"},addTags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"},removeTags:{brand:"The Fresh Market","brand:wikidata":"Q7735265","brand:wikipedia":"en:The Fresh Market",name:"The Fresh Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Todis":{name:"Todis",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3992174"},addTags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"},removeTags:{brand:"Todis","brand:wikidata":"Q3992174","brand:wikipedia":"it:Todis",name:"Todis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tommy":{name:"Tommy",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12643718"},addTags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"},removeTags:{brand:"Tommy","brand:wikidata":"Q12643718","brand:wikipedia":"hr:Tommy",name:"Tommy",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tops":{name:"Tops",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7825137"},addTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",shop:"supermarket"},removeTags:{brand:"Tops","brand:wikidata":"Q7825137","brand:wikipedia":"en:Tops Friendly Markets",name:"Tops",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Tottus":{name:"Tottus",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7828510"},addTags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"},removeTags:{brand:"Tottus","brand:wikidata":"Q7828510","brand:wikipedia":"en:Tottus",name:"Tottus",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Trader Joe's":{name:"Trader Joe's",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q688825"},addTags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"},removeTags:{brand:"Trader Joe's","brand:wikidata":"Q688825","brand:wikipedia":"en:Trader Joe's",name:"Trader Joe's",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Treff 3000":{name:"Treff 3000",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q701755"},addTags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"},removeTags:{brand:"Treff 3000","brand:wikidata":"Q701755","brand:wikipedia":"de:Edeka",name:"Treff 3000",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/U Express":{name:"U Express",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2529029"},addTags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"},removeTags:{brand:"U Express","brand:wikidata":"Q2529029","brand:wikipedia":"en:Système U",name:"U Express",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Unimarc":{name:"Unimarc",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6156244"},addTags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"},removeTags:{brand:"Unimarc","brand:wikidata":"Q6156244","brand:wikipedia":"es:Unimarc",name:"Unimarc",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Unimarkt":{name:"Unimarkt",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1169599"},addTags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"},removeTags:{brand:"Unimarkt","brand:wikidata":"Q1169599","brand:wikipedia":"de:Unimarkt",name:"Unimarkt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Vea":{name:"Vea",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5858167"},addTags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"},removeTags:{brand:"Vea","brand:wikidata":"Q5858167","brand:wikipedia":"es:Vea (supermercado)",name:"Vea",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Waitrose":{name:"Waitrose",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q771734"},addTags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose",name:"Waitrose",shop:"supermarket"},removeTags:{brand:"Waitrose","brand:wikidata":"Q771734","brand:wikipedia":"en:Waitrose",name:"Waitrose",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Walmart Neighborhood Market":{name:"Walmart Neighborhood Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Neighborhood Market",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Walmart Supercenter":{name:"Walmart Supercenter",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q483551"},addTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},removeTags:{brand:"Walmart","brand:wikidata":"Q483551","brand:wikipedia":"en:Walmart",name:"Walmart Supercenter",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Wasgau":{name:"Wasgau",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2536857"},addTags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"},removeTags:{brand:"Wasgau","brand:wikidata":"Q2536857","brand:wikipedia":"de:Wasgau (Unternehmen)",name:"Wasgau",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Wegmans":{name:"Wegmans",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11288478"},addTags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"},removeTags:{brand:"Wegmans","brand:wikidata":"Q11288478","brand:wikipedia":"en:Wegmans",name:"Wegmans",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Weis":{name:"Weis",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7980370"},addTags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"},removeTags:{brand:"Weis","brand:wikidata":"Q7980370","brand:wikipedia":"en:Weis Markets",name:"Weis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Whole Foods Market":{name:"Whole Foods Market",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1809448"},addTags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"},removeTags:{brand:"Whole Foods Market","brand:wikidata":"Q1809448","brand:wikipedia":"en:Whole Foods Market",name:"Whole Foods Market",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Willys":{name:"Willys",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q10720214"},addTags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"},removeTags:{brand:"Willys","brand:wikidata":"Q10720214","brand:wikipedia":"sv:Willys",name:"Willys",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/WinCo Foods":{name:"WinCo Foods",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q8023592"},addTags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"},removeTags:{brand:"WinCo Foods","brand:wikidata":"Q8023592","brand:wikipedia":"en:WinCo Foods",name:"WinCo Foods",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Winn Dixie":{name:"Winn Dixie",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1264366"},addTags:{brand:"Winn Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn Dixie",shop:"supermarket"},removeTags:{brand:"Winn Dixie","brand:wikidata":"Q1264366","brand:wikipedia":"en:Winn-Dixie",name:"Winn Dixie",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Woolworths":{name:"Woolworths",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3249145"},addTags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"},removeTags:{brand:"Woolworths","brand:wikidata":"Q3249145","brand:wikipedia":"en:Woolworths Supermarkets",name:"Woolworths",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/denn's Biomarkt":{name:"denn's Biomarkt",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q48883773"},addTags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",shop:"supermarket"},removeTags:{brand:"denn's Biomarkt","brand:wikidata":"Q48883773","brand:wikipedia":"de:Dennree",name:"denn's Biomarkt",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/fakta":{name:"fakta",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3172238"},addTags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"},removeTags:{brand:"fakta","brand:wikidata":"Q3172238","brand:wikipedia":"en:Fakta",name:"fakta",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Şok":{name:"Şok",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q19613992"},addTags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"},removeTags:{brand:"Şok","brand:wikidata":"Q19613992","brand:wikipedia":"tr:Şok (market)",name:"Şok",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ΑΒ Βασιλόπουλος":{name:"ΑΒ Βασιλόπουλος",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4721807"},addTags:{brand:"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},removeTags:{brand:"ΑΒ Βασιλόπουλος","brand:en":"AB Vassilopoulos","brand:wikidata":"Q4721807","brand:wikipedia":"el:Άλφα Βήτα Βασιλόπουλος",name:"ΑΒ Βασιλόπουλος","name:en":"AB Vassilopoulos",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Γαλαξίας":{name:"Γαλαξίας",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q5518063"},addTags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},removeTags:{brand:"Γαλαξίας","brand:en":"Galaxias","brand:wikidata":"Q5518063","brand:wikipedia":"el:Γαλαξίας (σούπερ μάρκετ)",name:"Γαλαξίας","name:en":"Galaxias",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Μασούτης":{name:"Μασούτης",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q6783887"},addTags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:en":"Masoutis",shop:"supermarket"},removeTags:{brand:"Μασούτης","brand:en":"Masoutis","brand:wikidata":"Q6783887","brand:wikipedia":"en:Masoutis",name:"Μασούτης","name:en":"Masoutis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Σκλαβενίτης":{name:"Σκλαβενίτης",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7536037"},addTags:{brand:"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"},removeTags:{brand:"Σκλαβενίτης","brand:en":"Sklavenitis","brand:wikidata":"Q7536037","brand:wikipedia":"el:Σκλαβενίτης",name:"Σκλαβενίτης","name:en":"Sklavenitis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Азбука Вкуса":{name:"Азбука Вкуса",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4058209"},addTags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"},removeTags:{brand:"Азбука Вкуса","brand:en":"Azbuka Vkusa","brand:wikidata":"Q4058209","brand:wikipedia":"en:Azbuka Vkusa",name:"Азбука Вкуса","name:en":"Azbuka Vkusa",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Атак":{name:"Атак",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q2868738"},addTags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"},removeTags:{brand:"Атак","brand:en":"Atac","brand:wikidata":"Q2868738","brand:wikipedia":"ru:Atac",name:"Атак","name:en":"Atac",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Ашан":{name:"Ашан",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q758603"},addTags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"},removeTags:{brand:"Ашан","brand:en":"Auchan","brand:wikidata":"Q758603","brand:wikipedia":"ru:Auchan",name:"Ашан","name:en":"Auchan",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Брусничка":{name:"Брусничка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q21656645"},addTags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"},removeTags:{brand:"Брусничка","brand:en":"Brusnichka","brand:wikidata":"Q21656645","brand:wikipedia":"uk:Брусничка (торгова мережа)",name:"Брусничка","name:en":"Brusnichka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Виктория":{name:"Виктория",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4111046"},addTags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"},removeTags:{brand:"Виктория","brand:wikidata":"Q4111046","brand:wikipedia":"ru:Виктория (сеть магазинов)",name:"Виктория",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Вопак":{name:"Вопак",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q30966107"},addTags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"},removeTags:{brand:"Вопак","brand:en":"Vopak","brand:wikidata":"Q30966107","brand:wikipedia":"uk:Вопак",name:"Вопак","name:en":"Vopak",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Гулливер":{name:"Гулливер",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003470"},addTags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"},removeTags:{brand:"Гулливер","brand:wikidata":"Q58003470",name:"Гулливер",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Дикси":{name:"Дикси",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4161561"},addTags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"},removeTags:{brand:"Дикси","brand:en":"Dixy","brand:wikidata":"Q4161561","brand:wikipedia":"ru:Дикси (сеть магазинов)",name:"Дикси",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Карусель":{name:"Карусель",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4216307"},addTags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"},removeTags:{brand:"Карусель","brand:en":"Karusel","brand:wikidata":"Q4216307","brand:wikipedia":"ru:Карусель (сеть магазинов)",name:"Карусель","name:en":"Karusel",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Лента":{name:"Лента",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4258608"},addTags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"},removeTags:{brand:"Лента","brand:en":"Lenta","brand:wikidata":"Q4258608","brand:wikipedia":"ru:Лента (сеть магазинов)",name:"Лента","name:en":"Lenta",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Магнит":{name:"Магнит",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q940518"},addTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"},removeTags:{brand:"Магнит","brand:en":"Magnit","brand:wikidata":"Q940518","brand:wikipedia":"ru:Магнит (сеть магазинов)",name:"Магнит","name:en":"Magnit",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Мария-Ра":{name:"Мария-Ра",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4281631"},addTags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"},removeTags:{brand:"Мария-Ра","brand:en":"Maria-ra","brand:wikidata":"Q4281631","brand:wikipedia":"ru:Мария-Ра",name:"Мария-Ра","name:en":"Maria-ra",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Монетка":{name:"Монетка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4301704"},addTags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"},removeTags:{brand:"Монетка","brand:en":"Monetka","brand:wikidata":"Q4301704","brand:wikipedia":"ru:Монетка (сеть магазинов)",name:"Монетка","name:en":"Monetka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Народная 7Я семьЯ":{name:"Народная 7Я семьЯ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4032436"},addTags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"},removeTags:{brand:"Народная 7Я семьЯ","brand:en":"People's 7th Family","brand:wikidata":"Q4032436","brand:wikipedia":"ru:Народная 7Я семья",name:"Народная 7Я семьЯ","name:en":"People's 7th Family",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Перекрёсток":{name:"Перекрёсток",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1684639"},addTags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"},removeTags:{brand:"Перекрёсток","brand:en":"Perekryostok","brand:wikidata":"Q1684639","brand:wikipedia":"en:Perekrestok (supermarket chain)",name:"Перекрёсток",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Покупочка":{name:"Покупочка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003270"},addTags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"},removeTags:{brand:"Покупочка","brand:wikidata":"Q58003270",name:"Покупочка",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Полушка":{name:"Полушка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4371080"},addTags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"},removeTags:{brand:"Полушка","brand:en":"Polushka","brand:wikidata":"Q4371080","brand:wikipedia":"ru:Полушка (сеть магазинов)",name:"Полушка","name:en":"Polushka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Пятёрочка":{name:"Пятёрочка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1768969"},addTags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"},removeTags:{brand:"Пятёрочка","brand:en":"Pyaterochka","brand:wikidata":"Q1768969","brand:wikipedia":"ru:Пятёрочка",name:"Пятёрочка","name:en":"Pyaterochka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Радеж":{name:"Радеж",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4387165"},addTags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"},removeTags:{brand:"Радеж","brand:en":"Radezh","brand:wikidata":"Q4387165","brand:wikipedia":"ru:Радеж (торговая сеть)",name:"Радеж","name:en":"Radezh",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Рукавичка":{name:"Рукавичка",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q20092568"},addTags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"},removeTags:{brand:"Рукавичка","brand:en":"Rukavychka","brand:wikidata":"Q20092568","brand:wikipedia":"uk:Рукавичка (торгова мережа)",name:"Рукавичка","name:en":"Rukavychka",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Семишагофф":{name:"Семишагофф",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q58003374"},addTags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"},removeTags:{brand:"Семишагофф","brand:wikidata":"Q58003374",name:"Семишагофф",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Сільпо":{name:"Сільпо",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4419434"},addTags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"},removeTags:{brand:"Сільпо","brand:en":"Silpo","brand:wikidata":"Q4419434","brand:wikipedia":"en:Silpo",name:"Сільпо","name:en":"Silpo",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Фора":{name:"Фора",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12165977"},addTags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"},removeTags:{brand:"Фора","brand:en":"Fora","brand:wikidata":"Q12165977","brand:wikipedia":"uk:Фора (мережа магазинів)",name:"Фора","name:en":"Fora",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Фуршет":{name:"Фуршет",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q4493564"},addTags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"},removeTags:{brand:"Фуршет","brand:en":"Furshet","brand:wikidata":"Q4493564","brand:wikipedia":"uk:Фуршет (мережа супермаркетів)",name:"Фуршет","name:en":"Furshet",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/Эдельвейс":{name:"Эдельвейс",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q57979368"},addTags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"},removeTags:{brand:"Эдельвейс","brand:en":"Edelveis","brand:wikidata":"Q57979368",name:"Эдельвейс","name:en":"Edelveis",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/いなげや":{name:"いなげや",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q17193392"},addTags:{brand:"いなげや","brand:en":"Inageya","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya",shop:"supermarket"},removeTags:{brand:"いなげや","brand:en":"Inageya","brand:wikidata":"Q17193392","brand:wikipedia":"ja:いなげや",name:"いなげや","name:en":"Inageya",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/まいばすけっと":{name:"まいばすけっと",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11278154"},addTags:{brand:"まいばすけっと","brand:en":"My Basket","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket",shop:"supermarket"},removeTags:{brand:"まいばすけっと","brand:en":"My Basket","brand:wikidata":"Q11278154","brand:wikipedia":"ja:まいばすけっと",name:"まいばすけっと","name:en":"My Basket",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/イオン":{name:"イオン",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11285951"},addTags:{brand:"イオン","brand:en":"AEON","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON",shop:"supermarket"},removeTags:{brand:"イオン","brand:en":"AEON","brand:wikidata":"Q11285951","brand:wikipedia":"ja:イオン (店舗ブランド)",name:"イオン","name:en":"AEON",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/イトーヨーカドー":{name:"イトーヨーカドー",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3088746"},addTags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado",shop:"supermarket"},removeTags:{brand:"イトーヨーカドー","brand:en":"Ito-Yokado","brand:wikidata":"Q3088746","brand:wikipedia":"en:Ito-Yokado",name:"イトーヨーカドー","name:en":"Ito-Yokado",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/カスミ":{name:"カスミ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11294160"},addTags:{brand:"カスミ","brand:en":"Kasumi","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi",shop:"supermarket"},removeTags:{brand:"カスミ","brand:en":"Kasumi","brand:wikidata":"Q11294160","brand:wikipedia":"ja:カスミ",name:"カスミ","name:en":"Kasumi",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/バロー":{name:"バロー",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11328346"},addTags:{brand:"バロー","brand:en":"Valor","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor",shop:"supermarket"},removeTags:{brand:"バロー","brand:en":"Valor","brand:wikidata":"Q11328346","brand:wikipedia":"ja:バロー (チェーンストア)",name:"バロー","name:en":"Valor",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/マックスバリュ":{name:"マックスバリュ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q1960109"},addTags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai",shop:"supermarket"},removeTags:{brand:"マックスバリュ","brand:en":"Maxvalu Tokai","brand:wikidata":"Q1960109","brand:wikipedia":"en:MaxValu",name:"マックスバリュ","name:en":"Maxvalu Tokai",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/マルエツ":{name:"マルエツ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11341197"},addTags:{brand:"マルエツ","brand:en":"Maruetsu","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu",shop:"supermarket"},removeTags:{brand:"マルエツ","brand:en":"Maruetsu","brand:wikidata":"Q11341197","brand:wikipedia":"ja:マルエツ",name:"マルエツ","name:en":"Maruetsu",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ヤオコー":{name:"ヤオコー",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11344967"},addTags:{brand:"ヤオコー","brand:en":"Yaoko","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko",shop:"supermarket"},removeTags:{brand:"ヤオコー","brand:en":"Yaoko","brand:wikidata":"Q11344967","brand:wikipedia":"ja:ヤオコー",name:"ヤオコー","name:en":"Yaoko",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ヨークベニマル":{name:"ヨークベニマル",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11346199"},addTags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru",shop:"supermarket"},removeTags:{brand:"ヨークベニマル","brand:en":"York Benimaru","brand:wikidata":"Q11346199","brand:wikipedia":"ja:ヨークベニマル",name:"ヨークベニマル","name:en":"York Benimaru",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/ライフ":{name:"ライフ",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11346476"},addTags:{brand:"ライフ","brand:en":"Life","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life",shop:"supermarket"},removeTags:{brand:"ライフ","brand:en":"Life","brand:wikidata":"Q11346476","brand:wikipedia":"ja:ライフコーポレーション",name:"ライフ","name:en":"Life",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/全聯":{name:"全聯",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7262792"},addTags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"},removeTags:{brand:"全聯","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯","name:en":"Pxmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/全聯福利中心":{name:"全聯福利中心",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q7262792"},addTags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"},removeTags:{brand:"全聯福利中心","brand:en":"Pxmart","brand:wikidata":"Q7262792","brand:wikipedia":"en:PX Mart",name:"全聯福利中心","name:en":"Pxmart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/惠康 Wellcome":{name:"惠康 Wellcome",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"惠康 Wellcome","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"zh:惠康",name:"惠康 Wellcome","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/業務スーパー":{name:"業務スーパー",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q11590183"},addTags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:wikidata":"Q11590183","brand:wikipedia":"ja:業務スーパー",name:"業務スーパー","name:en":"Gyōmu sūpā",shop:"supermarket"},removeTags:{brand:"業務スーパー","brand:en":"Gyōmu sūpā","brand:wikidata":"Q11590183","brand:wikipedia":"ja:業務スーパー",name:"業務スーパー","name:en":"Gyōmu sūpā",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/美廉社":{name:"美廉社",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q15914017"},addTags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"},removeTags:{brand:"美廉社","brand:en":"Simple Mart","brand:wikidata":"Q15914017","brand:wikipedia":"zh:美廉社",name:"美廉社","name:en":"Simple Mart",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/西友":{name:"西友",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q3108542"},addTags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"},removeTags:{brand:"西友","brand:en":"Seiyu Group","brand:wikidata":"Q3108542","brand:wikipedia":"en:Seiyu Group",name:"西友","name:en":"Seiyu Group",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/頂好":{name:"頂好",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"頂好","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/頂好超市":{name:"頂好超市",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q706247"},addTags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"},removeTags:{brand:"頂好超市","brand:en":"Wellcome","brand:wikidata":"Q706247","brand:wikipedia":"en:Wellcome",name:"頂好超市","name:en":"Wellcome",shop:"supermarket"},matchScore:2,suggestion:true},"shop/supermarket/하나로마트":{name:"하나로마트",icon:"maki-grocery",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"supermarket","brand:wikidata":"Q12590611"},addTags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트",shop:"supermarket"},removeTags:{brand:"하나로마트","brand:en":"Hanaro Mart","brand:wikidata":"Q12590611","brand:wikipedia":"ko:농협유통",name:"하나로마트",shop:"supermarket"},matchScore:2,suggestion:true},"shop/ticket/Boutique Grandes Lignes":{name:"Boutique Grandes Lignes",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"ticket","brand:wikidata":"Q13646"},addTags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"},removeTags:{brand:"Boutique Grandes Lignes","brand:wikidata":"Q13646","brand:wikipedia":"fr:Société nationale des chemins de fer français",name:"Boutique Grandes Lignes",shop:"ticket"},matchScore:2,suggestion:true},"shop/ticket/Guichet Transilien":{name:"Guichet Transilien",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"ticket","brand:wikidata":"Q389554"},addTags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"},removeTags:{brand:"Guichet Transilien","brand:wikidata":"Q389554","brand:wikipedia":"fr:Transilien",name:"Guichet Transilien",shop:"ticket"},matchScore:2,suggestion:true},"shop/toys/Dráčik":{name:"Dráčik",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q57653669"},addTags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"},removeTags:{brand:"Dráčik","brand:wikidata":"Q57653669",name:"Dráčik",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Intertoys":{name:"Intertoys",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q1891407"},addTags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"},removeTags:{brand:"Intertoys","brand:wikidata":"Q1891407","brand:wikipedia":"nl:Intertoys",name:"Intertoys",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/JouéClub":{name:"JouéClub",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3187152"},addTags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"},removeTags:{brand:"JouéClub","brand:wikidata":"Q3187152","brand:wikipedia":"fr:JouéClub",name:"JouéClub",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/King Jouet":{name:"King Jouet",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3197009"},addTags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"},removeTags:{brand:"King Jouet","brand:en":"King Toy","brand:wikidata":"Q3197009","brand:wikipedia":"fr:King Jouet",name:"King Jouet","name:en":"King Toy",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/La Grande Récré":{name:"La Grande Récré",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q3209556"},addTags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"},removeTags:{brand:"La Grande Récré","brand:wikidata":"Q3209556","brand:wikipedia":"fr:La Grande Récré (magasin)",name:"La Grande Récré",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Lego":{name:"Lego",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q1063455"},addTags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"},removeTags:{brand:"Lego","brand:wikidata":"Q1063455","brand:wikipedia":"en:The Lego Group",name:"Lego",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Lekia":{name:"Lekia",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q56303274"},addTags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"},removeTags:{brand:"Lekia","brand:wikidata":"Q56303274","brand:wikipedia":"sv:Lekia",name:"Lekia",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Maxi Toys":{name:"Maxi Toys",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q16663879"},addTags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"},removeTags:{brand:"Maxi Toys","brand:wikidata":"Q16663879","brand:wikipedia":"fr:Maxi Toys",name:"Maxi Toys",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/The Entertainer":{name:"The Entertainer",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q7732289"},addTags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"},removeTags:{brand:"The Entertainer","brand:wikidata":"Q7732289","brand:wikipedia":"en:The Entertainer (retailer)",name:"The Entertainer",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Toys R Us":{name:"Toys R Us",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q696334"},addTags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"},removeTags:{brand:"Toys R Us","brand:wikidata":"Q696334","brand:wikipedia":"en:Toys \"R\" Us",name:"Toys R Us",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Детский мир":{name:"Детский мир",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q16643324"},addTags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"},removeTags:{brand:"Детский мир","brand:en":"Detskiy Mir","brand:wikidata":"Q16643324","brand:wikipedia":"en:Detsky Mir",name:"Детский мир","name:en":"Detskiy Mir",shop:"toys"},matchScore:2,suggestion:true},"shop/toys/Кораблик":{name:"Кораблик",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"toys","brand:wikidata":"Q57653416"},addTags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"},removeTags:{brand:"Кораблик","brand:wikidata":"Q57653416",name:"Кораблик",shop:"toys"},matchScore:2,suggestion:true},"shop/travel_agency/Coral Travel":{name:"Coral Travel",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q58011479"},addTags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"},removeTags:{brand:"Coral Travel","brand:wikidata":"Q58011479",name:"Coral Travel",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/D-reizen":{name:"D-reizen",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q2445498"},addTags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"},removeTags:{brand:"D-reizen","brand:wikidata":"Q2445498","brand:wikipedia":"nl:D-reizen",name:"D-reizen",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/DER Reisebüro":{name:"DER Reisebüro",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q56729186"},addTags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"},removeTags:{brand:"DER Reisebüro","brand:wikidata":"Q56729186","brand:wikipedia":"de:Deutsches Reisebüro",name:"DER Reisebüro",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/First Reisebüro":{name:"First Reisebüro",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q573103"},addTags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"},removeTags:{brand:"First Reisebüro","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"First Reisebüro",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Flight Centre":{name:"Flight Centre",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q5459202"},addTags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"},removeTags:{brand:"Flight Centre","brand:wikidata":"Q5459202","brand:wikipedia":"en:Flight Centre",name:"Flight Centre",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Halcón Viajes":{name:"Halcón Viajes",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q57591939"},addTags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"},removeTags:{brand:"Halcón Viajes","brand:wikidata":"Q57591939",name:"Halcón Viajes",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Havas Voyages":{name:"Havas Voyages",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q57628091"},addTags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"},removeTags:{brand:"Havas Voyages","brand:wikidata":"Q57628091",name:"Havas Voyages",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Reiseland":{name:"Reiseland",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q40387610"},addTags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"},removeTags:{brand:"Reiseland","brand:wikidata":"Q40387610","brand:wikipedia":"de:OTTO Reisen",name:"Reiseland",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/TUI":{name:"TUI",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q573103"},addTags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"},removeTags:{brand:"TUI","brand:wikidata":"Q573103","brand:wikipedia":"en:TUI Group",name:"TUI",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/The Co-operative Travel":{name:"The Co-operative Travel",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q7726526"},addTags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"},removeTags:{brand:"The Co-operative Travel","brand:wikidata":"Q7726526","brand:wikipedia":"en:The Co-operative Travel",name:"The Co-operative Travel",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Thomas Cook":{name:"Thomas Cook",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q2141800"},addTags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"},removeTags:{brand:"Thomas Cook","brand:wikidata":"Q2141800","brand:wikipedia":"en:Thomas Cook Group",name:"Thomas Cook",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Thomson":{name:"Thomson",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q7795876"},addTags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",shop:"travel_agency"},removeTags:{brand:"Thomson","brand:wikidata":"Q7795876","brand:wikipedia":"en:TUI UK",name:"Thomson",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/travel_agency/Поехали с нами":{name:"Поехали с нами",icon:"maki-suitcase",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"travel_agency","brand:wikidata":"Q25439141"},addTags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"},removeTags:{brand:"Поехали с нами","brand:wikidata":"Q25439141","brand:wikipedia":"uk:Поїхали з нами",name:"Поехали с нами",shop:"travel_agency"},matchScore:2,suggestion:true},"shop/tyres/Big O Tires":{name:"Big O Tires",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q4906085"},addTags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"},removeTags:{brand:"Big O Tires","brand:wikidata":"Q4906085","brand:wikipedia":"en:Big O Tires",name:"Big O Tires",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Bridgestone":{name:"Bridgestone",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q179433"},addTags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"},removeTags:{brand:"Bridgestone","brand:wikidata":"Q179433","brand:wikipedia":"en:Bridgestone",name:"Bridgestone",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Discount Tire":{name:"Discount Tire",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q5281735"},addTags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"},removeTags:{brand:"Discount Tire","brand:wikidata":"Q5281735","brand:wikipedia":"en:Discount Tire",name:"Discount Tire",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Express Oil Change & Tire Engineers":{name:"Express Oil Change & Tire Engineers",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q39057654"},addTags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"},removeTags:{brand:"Express Oil Change & Tire Engineers","brand:wikidata":"Q39057654","brand:wikipedia":"en:Express Oil Change & Tire Engineers",name:"Express Oil Change & Tire Engineers",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Les Schwab Tire Center":{name:"Les Schwab Tire Center",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q6529977"},addTags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"},removeTags:{brand:"Les Schwab Tire Center","brand:wikidata":"Q6529977","brand:wikipedia":"en:Les Schwab Tire Centers",name:"Les Schwab Tire Center",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Michelin":{name:"Michelin",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q151107"},addTags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"},removeTags:{brand:"Michelin","brand:wikidata":"Q151107","brand:wikipedia":"en:Michelin",name:"Michelin",shop:"tyres"},matchScore:2,suggestion:true},"shop/tyres/Vianor":{name:"Vianor",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"tyres","brand:wikidata":"Q10714920"},addTags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"},removeTags:{brand:"Vianor","brand:wikidata":"Q10714920","brand:wikipedia":"sv:Vianor",name:"Vianor",shop:"tyres"},matchScore:2,suggestion:true},"shop/variety_store/Action":{name:"Action",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q2634111"},addTags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"},removeTags:{brand:"Action","brand:wikidata":"Q2634111","brand:wikipedia":"nl:Action (winkel)",name:"Action",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Big Bazaar":{name:"Big Bazaar",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3631008"},addTags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"variety_store"},removeTags:{brand:"Big Bazaar","brand:wikidata":"Q3631008","brand:wikipedia":"en:Big Bazaar",name:"Big Bazaar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Big Bazar":{name:"Big Bazar",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q15873104"},addTags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"},removeTags:{brand:"Big Bazar","brand:wikidata":"Q15873104","brand:wikipedia":"nl:Big Bazar",name:"Big Bazar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollar General":{name:"Dollar General",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q145168"},addTags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"},removeTags:{brand:"Dollar General","brand:wikidata":"Q145168","brand:wikipedia":"en:Dollar General",name:"Dollar General",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollar Tree":{name:"Dollar Tree",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5289230"},addTags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"},removeTags:{brand:"Dollar Tree","brand:wikidata":"Q5289230","brand:wikipedia":"en:Dollar Tree",name:"Dollar Tree",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Dollarama":{name:"Dollarama",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3033947"},addTags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"},removeTags:{brand:"Dollarama","brand:wikidata":"Q3033947","brand:wikipedia":"en:Dollarama",name:"Dollarama",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Family Dollar":{name:"Family Dollar",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5433101"},addTags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"},removeTags:{brand:"Family Dollar","brand:wikidata":"Q5433101","brand:wikipedia":"en:Family Dollar",name:"Family Dollar",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Five Below":{name:"Five Below",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5455836"},addTags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"},removeTags:{brand:"Five Below","brand:wikidata":"Q5455836","brand:wikipedia":"en:Five Below",name:"Five Below",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Fix Price":{name:"Fix Price",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q4038791"},addTags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"},removeTags:{brand:"Fix Price","brand:wikidata":"Q4038791","brand:wikipedia":"ru:Fix Price (сеть магазинов)",name:"Fix Price",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/GiFi":{name:"GiFi",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3105439"},addTags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"},removeTags:{brand:"GiFi","brand:wikidata":"Q3105439","brand:wikipedia":"fr:Gifi",name:"GiFi",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Home Bargains":{name:"Home Bargains",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q5888229"},addTags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"},removeTags:{brand:"Home Bargains","brand:wikidata":"Q5888229","brand:wikipedia":"en:Home Bargains",name:"Home Bargains",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Mäc-Geiz":{name:"Mäc-Geiz",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1957126"},addTags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"},removeTags:{brand:"Mäc-Geiz","brand:wikidata":"Q1957126","brand:wikipedia":"de:Mäc-Geiz",name:"Mäc-Geiz",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/NOZ":{name:"NOZ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q3345688"},addTags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"},removeTags:{brand:"NOZ","brand:wikidata":"Q3345688","brand:wikipedia":"fr:Noz",name:"NOZ",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundland":{name:"Poundland",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1434528"},addTags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"},removeTags:{brand:"Poundland","brand:wikidata":"Q1434528","brand:wikipedia":"en:Poundland",name:"Poundland",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundstretcher":{name:"Poundstretcher",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q7235675"},addTags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"},removeTags:{brand:"Poundstretcher","brand:wikidata":"Q7235675","brand:wikipedia":"en:Poundstretcher",name:"Poundstretcher",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Poundworld":{name:"Poundworld",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q16967516"},addTags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"},removeTags:{brand:"Poundworld","brand:wikidata":"Q16967516","brand:wikipedia":"en:Poundworld",name:"Poundworld",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/TEDi":{name:"TEDi",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q1364603"},addTags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"},removeTags:{brand:"TEDi","brand:wikidata":"Q1364603","brand:wikipedia":"de:TEDi",name:"TEDi",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/Wilko":{name:"Wilko",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q8002536"},addTags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"},removeTags:{brand:"Wilko","brand:wikidata":"Q8002536","brand:wikipedia":"en:Wilko (retailer)",name:"Wilko",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/キャンドゥ":{name:"キャンドゥ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q11297367"},addTags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO",shop:"variety_store"},removeTags:{brand:"キャンドゥ","brand:en":"CAN DO","brand:wikidata":"Q11297367","brand:wikipedia":"ja:キャンドゥ",name:"キャンドゥ","name:en":"CAN DO",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/セリア":{name:"セリア",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q11314509"},addTags:{brand:"セリア","brand:en":"Seria","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria",shop:"variety_store"},removeTags:{brand:"セリア","brand:en":"Seria","brand:wikidata":"Q11314509","brand:wikipedia":"ja:セリア (100円ショップ)",name:"セリア","name:en":"Seria",shop:"variety_store"},matchScore:2,suggestion:true},"shop/variety_store/ダイソー":{name:"ダイソー",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"variety_store","brand:wikidata":"Q866991"},addTags:{brand:"ダイソー","brand:en":"Daiso","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso",shop:"variety_store"},removeTags:{brand:"ダイソー","brand:en":"Daiso","brand:wikidata":"Q866991","brand:wikipedia":"ja:大創産業",name:"ダイソー","name:en":"Daiso",shop:"variety_store"},matchScore:2,suggestion:true},"shop/video_games/EB Games":{name:"EB Games",icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q4993686"},addTags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"},removeTags:{brand:"EB Games","brand:wikidata":"Q4993686","brand:wikipedia":"en:EB Games",name:"EB Games",shop:"video_games"},matchScore:2,suggestion:true},"shop/video_games/GameStop":{name:"GameStop",icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q202210"},addTags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"},removeTags:{brand:"GameStop","brand:wikidata":"Q202210","brand:wikipedia":"en:GameStop",name:"GameStop",shop:"video_games"},matchScore:2,suggestion:true},"shop/video_games/Micromania":{name:"Micromania",icon:"maki-gaming",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video_games","brand:wikidata":"Q3312221"},addTags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"},removeTags:{brand:"Micromania","brand:wikidata":"Q3312221","brand:wikipedia":"en:Micromania (video game retailer)",name:"Micromania",shop:"video_games"},matchScore:2,suggestion:true},"shop/video/Blockbuster":{name:"Blockbuster",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q884711"},addTags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"},removeTags:{brand:"Blockbuster","brand:wikidata":"Q884711","brand:wikipedia":"en:Blockbuster LLC",name:"Blockbuster",shop:"video"},matchScore:2,suggestion:true},"shop/video/Family Video":{name:"Family Video",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5433297"},addTags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"},removeTags:{brand:"Family Video","brand:wikidata":"Q5433297","brand:wikipedia":"en:Family Video",name:"Family Video",shop:"video"},matchScore:2,suggestion:true},"shop/video/TSUTAYA":{name:"TSUTAYA",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5193457"},addTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"},removeTags:{brand:"TSUTAYA","brand:wikidata":"Q5193457","brand:wikipedia":"ja:カルチュア・コンビニエンス・クラブ",name:"TSUTAYA",shop:"video"},matchScore:2,suggestion:true},"shop/video/ゲオ":{name:"ゲオ",icon:"maki-shop",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"video","brand:wikidata":"Q5533938"},addTags:{brand:"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ",shop:"video"},removeTags:{brand:"GEO","brand:wikidata":"Q5533938","brand:wikipedia":"ja:ゲオ",name:"ゲオ",shop:"video"},matchScore:2,suggestion:true},"shop/watches/Swatch":{name:"Swatch",icon:"maki-watch",fields:["name","operator","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"watches","brand:wikidata":"Q573422"},addTags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"},removeTags:{brand:"Swatch","brand:wikidata":"Q573422","brand:wikipedia":"en:Swatch",name:"Swatch",shop:"watches"},matchScore:2,suggestion:true},"shop/wholesale/Costco":{name:"Costco",icon:"maki-warehouse",fields:["name","operator","wholesale","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q715583"},addTags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale",operator:"Costco"},removeTags:{brand:"Costco","brand:wikidata":"Q715583","brand:wikipedia":"en:Costco",name:"Costco",shop:"wholesale",operator:"Costco"},matchScore:2,suggestion:true},"shop/wholesale/Makro":{name:"Makro",icon:"maki-warehouse",fields:["name","operator","wholesale","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q704606"},addTags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"},removeTags:{brand:"Makro","brand:wikidata":"Q704606","brand:wikipedia":"en:Makro",name:"Makro",shop:"wholesale"},matchScore:2,suggestion:true},"shop/wholesale/Sam's Club":{name:"Sam's Club",icon:"maki-warehouse",fields:["name","operator","wholesale","address","building_area","opening_hours","payment_multi"],geometry:["point","area"],tags:{shop:"wholesale","brand:wikidata":"Q1972120"},addTags:{brand:"Sam's Club","brand:wikipedia":"en:Sam's Club","brand:wikidata":"Q1972120",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"wholesale"},removeTags:{brand:"Sam's Club","brand:wikipedia":"en:Sam's Club","brand:wikidata":"Q1972120",name:"Sam's Club",operator:"Walmart","operator:wikidata":"Q483551","operator:wikipedia":"en:Walmart",shop:"wholesale"},matchScore:2,suggestion:true},"tourism/hotel/B&B Hôtel":{name:"B&B Hôtel",icon:"maki-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","brand:wikidata":"Q794939"},addTags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"},removeTags:{brand:"B&B Hôtel","brand:wikidata":"Q794939","brand:wikipedia":"en:B&B Hotels",name:"B&B Hôtel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Best Western":{name:"Best Western",icon:"maki-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","brand:wikidata":"Q830334"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"},removeTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Best Western Plus":{name:"Best Western Plus",icon:"maki-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","brand:wikidata":"Q830334"},addTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"},removeTags:{brand:"Best Western","brand:wikidata":"Q830334","brand:wikipedia":"en:Best Western",name:"Best Western Plus",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Campanile":{name:"Campanile",icon:"maki-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","brand:wikidata":"Q2412064"},addTags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"},removeTags:{brand:"Campanile","brand:wikidata":"Q2412064","brand:wikipedia":"fr:Campanile (chaîne d'hôtels)",name:"Campanile",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Candlewood Suites":{name:"Candlewood Suites",icon:"maki-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","brand:wikidata":"Q5032010"},addTags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"},removeTags:{brand:"Candlewood Suites","brand:wikidata":"Q5032010","brand:wikipedia":"en:Candlewood Suites",name:"Candlewood Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn":{name:"Comfort Inn",icon:"maki-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","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"},removeTags:{brand:"Comfort Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Inn & Suites":{name:"Comfort Inn & Suites",icon:"maki-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","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"},removeTags:{brand:"Comfort Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Comfort Suites":{name:"Comfort Suites",icon:"maki-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","brand:wikidata":"Q1075788"},addTags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"},removeTags:{brand:"Comfort Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Comfort Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Country Inn & Suites":{name:"Country Inn & Suites",icon:"maki-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","brand:wikidata":"Q5177332"},addTags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"},removeTags:{brand:"Country Inn & Suites","brand:wikidata":"Q5177332","brand:wikipedia":"en:Country Inns & Suites",name:"Country Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Courtyard by Marriott":{name:"Courtyard by Marriott",icon:"maki-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","brand:wikidata":"Q1053170"},addTags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"},removeTags:{brand:"Courtyard by Marriott","brand:wikidata":"Q1053170","brand:wikipedia":"en:Courtyard by Marriott",name:"Courtyard by Marriott",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Crowne Plaza":{name:"Crowne Plaza",icon:"maki-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","brand:wikidata":"Q2746220"},addTags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"},removeTags:{brand:"Crowne Plaza","brand:wikidata":"Q2746220","brand:wikipedia":"en:Crowne Plaza",name:"Crowne Plaza",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Days Inn":{name:"Days Inn",icon:"maki-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","brand:wikidata":"Q1047239"},addTags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",tourism:"hotel"},removeTags:{brand:"Days Inn","brand:wikidata":"Q1047239","brand:wikipedia":"en:Days Inn",name:"Days Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Embassy Suites":{name:"Embassy Suites",icon:"maki-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","brand:wikidata":"Q5369524"},addTags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"},removeTags:{brand:"Embassy Suites","brand:wikidata":"Q5369524","brand:wikipedia":"en:Embassy Suites by Hilton",name:"Embassy Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Extended Stay America":{name:"Extended Stay America",icon:"maki-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","brand:wikidata":"Q5421850"},addTags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"},removeTags:{brand:"Extended Stay America","brand:wikidata":"Q5421850","brand:wikipedia":"en:Extended Stay America",name:"Extended Stay America",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Fairfield Inn":{name:"Fairfield Inn",icon:"maki-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","brand:wikidata":"Q5430314"},addTags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"},removeTags:{brand:"Fairfield Inn","brand:wikidata":"Q5430314","brand:wikipedia":"en:Fairfield Inn by Marriott",name:"Fairfield Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Formule 1":{name:"Formule 1",icon:"maki-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","brand:wikidata":"Q1630895"},addTags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"},removeTags:{brand:"Formule 1","brand:wikidata":"Q1630895","brand:wikipedia":"en:Hotel Formule 1",name:"Formule 1",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hampton Inn":{name:"Hampton Inn",icon:"maki-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","brand:wikidata":"Q5646230"},addTags:{brand:"Hampton Inn","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton Inn",tourism:"hotel"},removeTags:{brand:"Hampton Inn","brand:wikidata":"Q5646230","brand:wikipedia":"en:Hampton by Hilton",name:"Hampton Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hilton":{name:"Hilton",icon:"maki-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","brand:wikidata":"Q598884"},addTags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"},removeTags:{brand:"Hilton","brand:wikidata":"Q598884","brand:wikipedia":"en:Hilton Hotels & Resorts",name:"Hilton",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Hilton Garden Inn":{name:"Hilton Garden Inn",icon:"maki-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","brand:wikidata":"Q1162859"},addTags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"},removeTags:{brand:"Hilton Garden Inn","brand:wikidata":"Q1162859","brand:wikipedia":"en:Hilton Garden Inn",name:"Hilton Garden Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn":{name:"Holiday Inn",icon:"maki-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","brand:wikidata":"Q2717882"},addTags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"},removeTags:{brand:"Holiday Inn","brand:wikidata":"Q2717882","brand:wikipedia":"en:Holiday Inn",name:"Holiday Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express":{name:"Holiday Inn Express",icon:"maki-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","brand:wikidata":"Q5880423"},addTags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"},removeTags:{brand:"Holiday Inn Express","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Holiday Inn Express & Suites":{name:"Holiday Inn Express & Suites",icon:"maki-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","brand:wikidata":"Q5880423"},addTags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"},removeTags:{brand:"Holiday Inn Express & Suites","brand:wikidata":"Q5880423","brand:wikipedia":"en:Holiday Inn Express",name:"Holiday Inn Express & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Homewood Suites":{name:"Homewood Suites",icon:"maki-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","brand:wikidata":"Q5890701"},addTags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"},removeTags:{brand:"Homewood Suites","brand:wikidata":"Q5890701","brand:wikipedia":"en:Homewood Suites by Hilton",name:"Homewood Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis":{name:"Ibis",icon:"maki-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","brand:wikidata":"Q920166"},addTags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"},removeTags:{brand:"Ibis","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Budget":{name:"Ibis Budget",icon:"maki-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","brand:wikidata":"Q1458135"},addTags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"},removeTags:{brand:"Ibis Budget","brand:wikidata":"Q1458135","brand:wikipedia":"en:Ibis Budget",name:"Ibis Budget",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Hotel":{name:"Ibis Hotel",icon:"maki-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","brand:wikidata":"Q920166"},addTags:{brand:"Ibis Hotel","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis Hotel",tourism:"hotel"},removeTags:{brand:"Ibis Hotel","brand:wikidata":"Q920166","brand:wikipedia":"en:Ibis (hotel)",name:"Ibis Hotel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ibis Styles":{name:"Ibis Styles",icon:"maki-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","brand:wikidata":"Q3147425"},addTags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"},removeTags:{brand:"Ibis Styles","brand:wikidata":"Q3147425","brand:wikipedia":"en:Ibis Styles",name:"Ibis Styles",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Kyriad":{name:"Kyriad",icon:"maki-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","brand:wikidata":"Q11751808"},addTags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"},removeTags:{brand:"Kyriad","brand:wikidata":"Q11751808","brand:wikipedia":"pl:Kyriad",name:"Kyriad",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/La Quinta":{name:"La Quinta",icon:"maki-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","brand:wikidata":"Q6464734"},addTags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",tourism:"hotel"},removeTags:{brand:"La Quinta","brand:wikidata":"Q6464734","brand:wikipedia":"en:La Quinta Inns & Suites",name:"La Quinta",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Marriott":{name:"Marriott",icon:"maki-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","brand:wikidata":"Q1141173"},addTags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"},removeTags:{brand:"Marriott","brand:wikidata":"Q1141173","brand:wikipedia":"en:Marriott International",name:"Marriott",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Mercure":{name:"Mercure",icon:"maki-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","brand:wikidata":"Q1709809"},addTags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"},removeTags:{brand:"Mercure","brand:wikidata":"Q1709809","brand:wikipedia":"en:Mercure (hotel)",name:"Mercure",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Novotel":{name:"Novotel",icon:"maki-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","brand:wikidata":"Q420545"},addTags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"},removeTags:{brand:"Novotel","brand:wikidata":"Q420545","brand:wikipedia":"en:Novotel",name:"Novotel",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Premier Inn":{name:"Premier Inn",icon:"maki-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","brand:wikidata":"Q2108626"},addTags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"},removeTags:{brand:"Premier Inn","brand:wikidata":"Q2108626","brand:wikipedia":"en:Premier Inn",name:"Premier Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Première Classe":{name:"Première Classe",icon:"maki-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","brand:wikidata":"Q5964551"},addTags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"},removeTags:{brand:"Première Classe","brand:wikidata":"Q5964551","brand:wikipedia":"en:Hôtel Première Classe",name:"Première Classe",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Quality Inn":{name:"Quality Inn",icon:"maki-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","brand:wikidata":"Q1075788"},addTags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"},removeTags:{brand:"Quality Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Quality Inn & Suites":{name:"Quality Inn & Suites",icon:"maki-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","brand:wikidata":"Q1075788"},addTags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"},removeTags:{brand:"Quality Inn & Suites","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Quality Inn & Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Ramada":{name:"Ramada",icon:"maki-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","brand:wikidata":"Q1502859"},addTags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",tourism:"hotel"},removeTags:{brand:"Ramada","brand:wikidata":"Q1502859","brand:wikipedia":"en:Ramada",name:"Ramada",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Red Roof Inn":{name:"Red Roof Inn",icon:"maki-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","brand:wikidata":"Q7304949"},addTags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"},removeTags:{brand:"Red Roof Inn","brand:wikidata":"Q7304949","brand:wikipedia":"en:Red Roof Inn",name:"Red Roof Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Residence Inn":{name:"Residence Inn",icon:"maki-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","brand:wikidata":"Q7315394"},addTags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"},removeTags:{brand:"Residence Inn","brand:wikidata":"Q7315394","brand:wikipedia":"en:Residence Inn by Marriott",name:"Residence Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Sheraton":{name:"Sheraton",icon:"maki-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","brand:wikidata":"Q634831"},addTags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"},removeTags:{brand:"Sheraton","brand:wikidata":"Q634831","brand:wikipedia":"en:Sheraton Hotels and Resorts",name:"Sheraton",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Sleep Inn":{name:"Sleep Inn",icon:"maki-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","brand:wikidata":"Q1075788"},addTags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"},removeTags:{brand:"Sleep Inn","brand:wikidata":"Q1075788","brand:wikipedia":"en:Choice Hotels",name:"Sleep Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Staybridge Suites":{name:"Staybridge Suites",icon:"maki-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","brand:wikidata":"Q7605116"},addTags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"},removeTags:{brand:"Staybridge Suites","brand:wikidata":"Q7605116","brand:wikipedia":"en:Staybridge Suites",name:"Staybridge Suites",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/Travelodge":{name:"Travelodge",icon:"maki-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","brand:wikidata":"Q7836087"},addTags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",tourism:"hotel"},removeTags:{brand:"Travelodge","brand:wikidata":"Q7836087","brand:wikipedia":"en:Travelodge",name:"Travelodge",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/hotel/東横イン":{name:"東横イン",icon:"maki-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","brand:wikidata":"Q1320541"},addTags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn",tourism:"hotel"},removeTags:{brand:"東横イン","brand:en":"Toyoko Inn","brand:wikidata":"Q1320541","brand:wikipedia":"en:Toyoko Inn",name:"東横イン","name:en":"Toyoko Inn",tourism:"hotel"},matchScore:2,suggestion:true},"tourism/motel/Econo Lodge":{name:"Econo Lodge",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q5333330"},addTags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"},removeTags:{brand:"Econo Lodge","brand:wikidata":"Q5333330","brand:wikipedia":"en:Econo Lodge",name:"Econo Lodge",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Motel 6":{name:"Motel 6",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q2188884"},addTags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"},removeTags:{brand:"Motel 6","brand:wikidata":"Q2188884","brand:wikipedia":"en:Motel 6",name:"Motel 6",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Rodeway Inn":{name:"Rodeway Inn",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q7356709"},addTags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"},removeTags:{brand:"Rodeway Inn","brand:wikidata":"Q7356709","brand:wikipedia":"en:Rodeway Inn",name:"Rodeway Inn",tourism:"motel"},matchScore:2,suggestion:true},"tourism/motel/Super 8":{name:"Super 8",icon:"maki-lodging",fields:["name","brand","operator","address","building_area","smoking","rooms","internet_access","internet_access/fee","internet_access/ssid"],geometry:["point","area"],tags:{tourism:"motel","brand:wikidata":"Q5364003"},addTags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",tourism:"motel"},removeTags:{brand:"Super 8","brand:wikidata":"Q5364003","brand:wikipedia":"en:Super 8 Motels",name:"Super 8",tourism:"motel"},matchScore:2,suggestion:true}};
23662
23663   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","category-utility","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/crossing/marked","highway/crossing/unmarked","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"]};
23664
23665   var categories = {"category-barrier":{icon:"maki-roadblock",geometry:"line",name:"Barrier Features",members:["barrier/fence","barrier/wall","barrier/ditch","barrier/gate","barrier/hedge","barrier/kerb","barrier"]},"category-building":{icon:"maki-building",geometry:"area",name:"Building Features",members:["building","building/house","building/apartments","building/garage","building/retail","building/commercial","building/industrial","building/residential"]},"category-golf":{icon:"maki-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:"maki-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:"maki-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:"maki-natural",geometry:"line",name:"Natural Features",members:["natural/coastline","natural/tree_row"]},"category-natural-point":{icon:"maki-natural",geometry:"point",name:"Natural Features",members:["natural/peak","natural/cliff","natural/beach","natural/cave_entrance"]},"category-path":{icon:"iD-category-path",geometry:"line",name:"Path Features",members:["highway/footway/marked","highway/footway/sidewalk","highway/steps","highway/path","highway/footway","highway/cycleway","highway/bridleway","highway/pedestrian_line"]},"category-rail":{icon:"iD-category-rail",geometry:"line",name:"Rail Features",members:["railway/rail","railway/subway","railway/tram","railway/monorail","railway/disused","railway/abandoned"]},"category-restriction":{icon:"iD-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:"iD-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:"iD-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-utility":{icon:"iD-category-utility",geometry:"line",name:"Utility Features",members:["power/line","power/minor_line","man_made/pipeline","power/cable/underground"]},"category-water-area":{icon:"maki-water",geometry:"area",name:"Water Features",members:["natural/water/lake","natural/water/pond","natural/water/reservoir","natural/water"]},"category-water-line":{icon:"iD-category-water",geometry:"line",name:"Water Features",members:["waterway/river","waterway/stream","waterway/canal","waterway/ditch","waterway/drain"]}};
23666
23667   var fields = {access_simple:{key:"access",type:"combo",label:"Allowed Access",options:["yes","permissive","private","customers","permit","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 allowed by law; a right of way"},no:{title:"Prohibited",description:"Access not allowed to the general public"},permissive:{title:"Permissive",description:"Access allowed until such time as the owner revokes the permission"},"private":{title:"Private",description:"Access allowed only with permission of the owner on an individual basis"},designated:{title:"Designated",description:"Access allowed according to signs or specific local laws"},destination:{title:"Destination",description:"Access allowed only to reach a destination"},dismount:{title:"Dismount",description:"Access allowed but rider must dismount"},permit:{title:"Permit",description:"Access allowed only with a valid permit or license"}}}},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",minValue:1,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",minValue:0,label:"Capacity (per hour)",placeholder:"500, 2500, 5000..."},"aerialway/duration":{key:"aerialway:duration",type:"number",minValue:0,label:"Duration (minutes)",placeholder:"1, 2, 3..."},"aerialway/heating":{key:"aerialway:heating",type:"check",label:"Heated"},"aerialway/occupancy":{key:"aerialway:occupancy",type:"number",minValue:0,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"},booth:{key:"booth",type:"combo",label:"Booth",caseSensitive:true},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"},"bridge/support":{key:"bridge:support",type:"combo",label:"Type"},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",minValue:1,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",minValue:0,label:"Capacity",placeholder:"50, 100, 200..."},cash_in:{key:"cash_in",type:"check",label:"Cash In"},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"},colour:{key:"colour",type:"text",label:"Color"},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",options:["silage","water","oil","fuel","slurry","gas","manure","sewage"]},conveying:{key:"conveying",type:"typeCombo",label:"Movement Direction",strings:{options:{forward:"Forward",backward:"Backward",reversible:"Reversible"}}},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},design:{key:"design",type:"combo",label:"Design"},devices:{key:"devices",type:"number",minValue:0,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:"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",minValue:0,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"}}},fireplace:{key:"fireplace",type:"check",label:"Fireplace"},fitness_station:{key:"fitness_station",type:"typeCombo",label:"Equipment Type"},fixme:{key:"fixme",type:"textarea",label:"Fix Me",universal:true},"flag/type":{key:"flag:type",type:"combo",label:"Flag Type"},ford:{key:"ford",type:"typeCombo",label:"Type",placeholder:"Default"},frequency:{key:"frequency",type:"combo",label:"Operating Frequency"},from:{key:"from",type:"text",label:"From"},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:"typeCombo",label:"Power Output",placeholder:"50 MW, 100 MW, 200 MW...",snake_case:false},"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",minValue:0,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"},"historic/wreck/date_sunk":{key:"wreck:date_sunk",type:"text",label:"Date Sunk"},"historic/wreck/visible_at_high_tide":{key:"wreck:visible_at_high_tide",type:"check",label:"Visible At High Tide"},"historic/wreck/visible_at_low_tide":{key:"wreck:visible_at_low_tide",type:"check",label:"Visible At Low Tide"},hoops:{key:"hoops",type:"number",minValue:0,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",minValue:0,label:"Lanes",placeholder:"1, 2, 3..."},language_multi:{key:"language:",type:"multiCombo",label:"Languages"},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",minValue:0,label:"Length (Meters)"},level:{key:"level",type:"combo",label:"Level",universal:true},levels:{key:"building:levels",type:"number",minValue:0,label:"Levels",placeholder:"2, 4, 6..."},lit:{key:"lit",type:"check",label:"Lit"},location_pool:{key:"location",type:"typeCombo",label:"Location",strings:{options:{outdoor:"Outdoor",indoor:"Indoor",roof:"Rooftop"}}},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"},material:{key:"material",type:"combo",universal:true,label:"Material"},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",minValue:1,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"}}},passenger_information_display:{key:"passenger_information_display",type:"check",label:"Passenger information display"},payment_multi:{key:"payment:",type:"multiCombo",label:"Payment Types",universal:true},phases:{key:"phases",type:"number",minValue:1,label:"Phases",placeholder:"1, 2, 3..."},phone:{key:"phone",type:"tel",icon:"maki-telephone",universal:true,label:"Telephone",placeholder:"+31 42 123 4567"},"piste/difficulty_downhill":{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/difficulty_nordic":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - Flat, no effort needed",easy:"Easy - Soft hills, short steep section",intermediate:"Intermediate - Steep section",advanced:"Advanced - Narrow, steep or icy section, sharp turn",expert:"Expert - Dangerous terrain around"}}},"piste/difficulty_skitour":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice - L: <30° incline",easy:"Easy - WS: 30-35° incline",intermediate:"Intermediate - ZS: 35-40° incline",advanced:"Advanced - S: 40-45° incline",expert:"Expert - SS: 45–50° incline",freeride:"Freeride - AS: 50–55° incline",extreme:"Extreme - EX: >55° incline"}}},"piste/difficulty":{key:"piste:difficulty",type:"combo",label:"Difficulty",placeholder:"Easy, Intermediate, Advanced...",strings:{options:{novice:"Novice",easy:"Easy",intermediate:"Intermediate",advanced:"Advanced",expert:"Expert",freeride:"Freeride",extreme:"Extreme"}}},"piste/grooming_downhill":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",mogul:"Mogul",backcountry:"Backcountry - no grooming"}}},"piste/grooming_hike":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic - Winter Hiking",backcountry:"Backcountry - Snowshoeing"}}},"piste/grooming_nordic":{key:"piste:grooming",type:"combo",label:"Grooming",strings:{options:{classic:"Classic",backcountry:"Backcountry, no grooming","classic+skating":"Classic and Skating",scooter:"Scooter/Snowmobile",skating:"Skating"}}},"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",connection:"Connection"}}},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",minValue:0,label:"Maximum Age"},"playground/min_age":{key:"min_age",type:"number",minValue:0,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"},recycling_type:{key:"recycling_type",type:"combo",label:"Type",placeholder:"Container, Center",strings:{options:{container:"Container",centre:"Center"}}},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:"iD-restrictions",reference:{rtype:"restriction"},label:"Turn Restrictions"},rooms:{key:"rooms",type:"number",minValue:0,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"},scuba_diving:{key:"scuba_diving:",type:"multiCombo",label:"Services",options:["repair","courses","rental","filling","air_filling","nitrox_filling","trimix_filling","oxygen_filling"]},"seamark/beacon_isolated_danger/shape":{key:"seamark:beacon_isolated_danger:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/category":{key:"seamark:beacon_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right"}}},"seamark/beacon_lateral/colour":{key:"seamark:beacon_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green",grey:"Grey"}}},"seamark/beacon_lateral/shape":{key:"seamark:beacon_lateral:shape",type:"combo",label:"Shape"},"seamark/beacon_lateral/system":{key:"seamark:beacon_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/buoy_lateral/category":{key:"seamark:buoy_lateral:category",type:"combo",label:"Category",strings:{options:{port:"Port",starboard:"Starboard",channel_left:"Channel Left",channel_right:"Channel Right",waterway_left:"Waterway Left",waterway_right:"Waterway Right",danger_left:"Danger Left",danger_right:"Danger Right",preferred_channel_port:"Preferred Channel Port",preferred_channel_starboard:"Preferred Channel Starboard"}}},"seamark/buoy_lateral/colour":{key:"seamark:buoy_lateral:colour",type:"combo",label:"Color",strings:{options:{red:"Red",green:"Green","red;white;red;white":"Red-White-Red-White","green;white;green;white":"Green-White-Green-White","red;green;red":"Red-Green-Red","green;red;green":"Green-Red-Green",white:"White",yellow:"Yellow"}}},"seamark/buoy_lateral/shape":{key:"seamark:buoy_lateral:shape",type:"combo",label:"Shape"},"seamark/buoy_lateral/system":{key:"seamark:buoy_lateral:system",type:"combo",label:"System",strings:{options:{"iala-a":"IALA A","iala-b":"IALA B",cevni:"CEVNI",other:"Other"}}},"seamark/mooring/category":{key:"seamark:mooring:category",type:"combo",label:"Category"},"seamark/type":{key:"seamark:type",type:"combo",universal:true,label:"Seamark"},"seamark/wreck/category":{key:"seamark:wreck:category",type:"combo",label:"Category"},seasonal:{key:"seasonal",type:"check",label:"Seasonal"},seats:{key:"seats",type:"number",minValue:0,label:"Seats",placeholder:"2, 4, 6..."},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"},"siren/purpose":{key:"siren:purpose",type:"combo",label:"Purpose"},"siren/type":{key:"siren:type",type:"combo",label:"Type",strings:{options:{pneumatic:"Pneumatic",electronic:"Electronic",other:"Other"}}},site_type:{key:"site_type",type:"combo",label:"Site 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:"combo",label:"Stars"},start_date:{key:"start_date",type:"text",universal:true,label:"Start Date"},step_count:{key:"step_count",type:"number",minValue:0,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"},swimming_pool:{key:"swimming_pool",type:"combo",label:"Type"},"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"}}},to:{key:"to",type:"text",label:"To"},"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_sign:{key:"traffic_sign",type:"typeCombo",label:"Traffic Sign"},"traffic_sign/direction":{key:"traffic_sign:direction",type:"combo",label:"Direction",strings:{options:{forward:"Forward",backward:"Backward",both:"Both / All"}}},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:"maki-wheelchair",universal:true,label:"Wheelchair Access"},wholesale:{key:"wholesale",type:"typeCombo",label:"Wholesale"},width:{key:"width",type:"number",minValue:0,label:"Width (Meters)"},wikidata:{key:"wikidata",type:"wikidata",icon:"wikipedia",universal:true,label:"Wikidata"},wikipedia:{key:"wikipedia",keys:["wikipedia","wikidata"],type:"wikipedia",icon:"wikipedia",universal:true,label:"Wikipedia"},windings:{key:"windings",type:"number",minValue:1,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"}}}};
23668
23669   var quickselect_1 = quickselect;
23670   var default_1 = quickselect;
23671
23672   function quickselect(arr, k, left, right, compare) {
23673       quickselectStep(arr, k, left || 0, right || (arr.length - 1), compare || defaultCompare);
23674   }
23675   function quickselectStep(arr, k, left, right, compare) {
23676
23677       while (right > left) {
23678           if (right - left > 600) {
23679               var n = right - left + 1;
23680               var m = k - left + 1;
23681               var z = Math.log(n);
23682               var s = 0.5 * Math.exp(2 * z / 3);
23683               var sd = 0.5 * Math.sqrt(z * s * (n - s) / n) * (m - n / 2 < 0 ? -1 : 1);
23684               var newLeft = Math.max(left, Math.floor(k - m * s / n + sd));
23685               var newRight = Math.min(right, Math.floor(k + (n - m) * s / n + sd));
23686               quickselectStep(arr, k, newLeft, newRight, compare);
23687           }
23688
23689           var t = arr[k];
23690           var i = left;
23691           var j = right;
23692
23693           swap(arr, left, k);
23694           if (compare(arr[right], t) > 0) swap(arr, left, right);
23695
23696           while (i < j) {
23697               swap(arr, i, j);
23698               i++;
23699               j--;
23700               while (compare(arr[i], t) < 0) i++;
23701               while (compare(arr[j], t) > 0) j--;
23702           }
23703
23704           if (compare(arr[left], t) === 0) swap(arr, left, j);
23705           else {
23706               j++;
23707               swap(arr, j, right);
23708           }
23709
23710           if (j <= k) left = j + 1;
23711           if (k <= j) right = j - 1;
23712       }
23713   }
23714
23715   function swap(arr, i, j) {
23716       var tmp = arr[i];
23717       arr[i] = arr[j];
23718       arr[j] = tmp;
23719   }
23720
23721   function defaultCompare(a, b) {
23722       return a < b ? -1 : a > b ? 1 : 0;
23723   }
23724   quickselect_1.default = default_1;
23725
23726   var rbush_1 = rbush;
23727   var default_1$1 = rbush;
23728
23729
23730
23731   function rbush(maxEntries, format) {
23732       if (!(this instanceof rbush)) return new rbush(maxEntries, format);
23733
23734       // max entries in a node is 9 by default; min node fill is 40% for best performance
23735       this._maxEntries = Math.max(4, maxEntries || 9);
23736       this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));
23737
23738       if (format) {
23739           this._initFormat(format);
23740       }
23741
23742       this.clear();
23743   }
23744
23745   rbush.prototype = {
23746
23747       all: function () {
23748           return this._all(this.data, []);
23749       },
23750
23751       search: function (bbox) {
23752
23753           var node = this.data,
23754               result = [],
23755               toBBox = this.toBBox;
23756
23757           if (!intersects$1(bbox, node)) return result;
23758
23759           var nodesToSearch = [],
23760               i, len, child, childBBox;
23761
23762           while (node) {
23763               for (i = 0, len = node.children.length; i < len; i++) {
23764
23765                   child = node.children[i];
23766                   childBBox = node.leaf ? toBBox(child) : child;
23767
23768                   if (intersects$1(bbox, childBBox)) {
23769                       if (node.leaf) result.push(child);
23770                       else if (contains$2(bbox, childBBox)) this._all(child, result);
23771                       else nodesToSearch.push(child);
23772                   }
23773               }
23774               node = nodesToSearch.pop();
23775           }
23776
23777           return result;
23778       },
23779
23780       collides: function (bbox) {
23781
23782           var node = this.data,
23783               toBBox = this.toBBox;
23784
23785           if (!intersects$1(bbox, node)) return false;
23786
23787           var nodesToSearch = [],
23788               i, len, child, childBBox;
23789
23790           while (node) {
23791               for (i = 0, len = node.children.length; i < len; i++) {
23792
23793                   child = node.children[i];
23794                   childBBox = node.leaf ? toBBox(child) : child;
23795
23796                   if (intersects$1(bbox, childBBox)) {
23797                       if (node.leaf || contains$2(bbox, childBBox)) return true;
23798                       nodesToSearch.push(child);
23799                   }
23800               }
23801               node = nodesToSearch.pop();
23802           }
23803
23804           return false;
23805       },
23806
23807       load: function (data) {
23808           if (!(data && data.length)) return this;
23809
23810           if (data.length < this._minEntries) {
23811               for (var i = 0, len = data.length; i < len; i++) {
23812                   this.insert(data[i]);
23813               }
23814               return this;
23815           }
23816
23817           // recursively build the tree with the given data from scratch using OMT algorithm
23818           var node = this._build(data.slice(), 0, data.length - 1, 0);
23819
23820           if (!this.data.children.length) {
23821               // save as is if tree is empty
23822               this.data = node;
23823
23824           } else if (this.data.height === node.height) {
23825               // split root if trees have the same height
23826               this._splitRoot(this.data, node);
23827
23828           } else {
23829               if (this.data.height < node.height) {
23830                   // swap trees if inserted one is bigger
23831                   var tmpNode = this.data;
23832                   this.data = node;
23833                   node = tmpNode;
23834               }
23835
23836               // insert the small tree into the large tree at appropriate level
23837               this._insert(node, this.data.height - node.height - 1, true);
23838           }
23839
23840           return this;
23841       },
23842
23843       insert: function (item) {
23844           if (item) this._insert(item, this.data.height - 1);
23845           return this;
23846       },
23847
23848       clear: function () {
23849           this.data = createNode([]);
23850           return this;
23851       },
23852
23853       remove: function (item, equalsFn) {
23854           if (!item) return this;
23855
23856           var node = this.data,
23857               bbox = this.toBBox(item),
23858               path = [],
23859               indexes = [],
23860               i, parent, index, goingUp;
23861
23862           // depth-first iterative tree traversal
23863           while (node || path.length) {
23864
23865               if (!node) { // go up
23866                   node = path.pop();
23867                   parent = path[path.length - 1];
23868                   i = indexes.pop();
23869                   goingUp = true;
23870               }
23871
23872               if (node.leaf) { // check current node
23873                   index = findItem(item, node.children, equalsFn);
23874
23875                   if (index !== -1) {
23876                       // item found, remove the item and condense tree upwards
23877                       node.children.splice(index, 1);
23878                       path.push(node);
23879                       this._condense(path);
23880                       return this;
23881                   }
23882               }
23883
23884               if (!goingUp && !node.leaf && contains$2(node, bbox)) { // go down
23885                   path.push(node);
23886                   indexes.push(i);
23887                   i = 0;
23888                   parent = node;
23889                   node = node.children[0];
23890
23891               } else if (parent) { // go right
23892                   i++;
23893                   node = parent.children[i];
23894                   goingUp = false;
23895
23896               } else node = null; // nothing found
23897           }
23898
23899           return this;
23900       },
23901
23902       toBBox: function (item) { return item; },
23903
23904       compareMinX: compareNodeMinX,
23905       compareMinY: compareNodeMinY,
23906
23907       toJSON: function () { return this.data; },
23908
23909       fromJSON: function (data) {
23910           this.data = data;
23911           return this;
23912       },
23913
23914       _all: function (node, result) {
23915           var nodesToSearch = [];
23916           while (node) {
23917               if (node.leaf) result.push.apply(result, node.children);
23918               else nodesToSearch.push.apply(nodesToSearch, node.children);
23919
23920               node = nodesToSearch.pop();
23921           }
23922           return result;
23923       },
23924
23925       _build: function (items, left, right, height) {
23926
23927           var N = right - left + 1,
23928               M = this._maxEntries,
23929               node;
23930
23931           if (N <= M) {
23932               // reached leaf level; return leaf
23933               node = createNode(items.slice(left, right + 1));
23934               calcBBox(node, this.toBBox);
23935               return node;
23936           }
23937
23938           if (!height) {
23939               // target height of the bulk-loaded tree
23940               height = Math.ceil(Math.log(N) / Math.log(M));
23941
23942               // target number of root entries to maximize storage utilization
23943               M = Math.ceil(N / Math.pow(M, height - 1));
23944           }
23945
23946           node = createNode([]);
23947           node.leaf = false;
23948           node.height = height;
23949
23950           // split the items into M mostly square tiles
23951
23952           var N2 = Math.ceil(N / M),
23953               N1 = N2 * Math.ceil(Math.sqrt(M)),
23954               i, j, right2, right3;
23955
23956           multiSelect(items, left, right, N1, this.compareMinX);
23957
23958           for (i = left; i <= right; i += N1) {
23959
23960               right2 = Math.min(i + N1 - 1, right);
23961
23962               multiSelect(items, i, right2, N2, this.compareMinY);
23963
23964               for (j = i; j <= right2; j += N2) {
23965
23966                   right3 = Math.min(j + N2 - 1, right2);
23967
23968                   // pack each entry recursively
23969                   node.children.push(this._build(items, j, right3, height - 1));
23970               }
23971           }
23972
23973           calcBBox(node, this.toBBox);
23974
23975           return node;
23976       },
23977
23978       _chooseSubtree: function (bbox, node, level, path) {
23979
23980           var i, len, child, targetNode, area, enlargement, minArea, minEnlargement;
23981
23982           while (true) {
23983               path.push(node);
23984
23985               if (node.leaf || path.length - 1 === level) break;
23986
23987               minArea = minEnlargement = Infinity;
23988
23989               for (i = 0, len = node.children.length; i < len; i++) {
23990                   child = node.children[i];
23991                   area = bboxArea(child);
23992                   enlargement = enlargedArea(bbox, child) - area;
23993
23994                   // choose entry with the least area enlargement
23995                   if (enlargement < minEnlargement) {
23996                       minEnlargement = enlargement;
23997                       minArea = area < minArea ? area : minArea;
23998                       targetNode = child;
23999
24000                   } else if (enlargement === minEnlargement) {
24001                       // otherwise choose one with the smallest area
24002                       if (area < minArea) {
24003                           minArea = area;
24004                           targetNode = child;
24005                       }
24006                   }
24007               }
24008
24009               node = targetNode || node.children[0];
24010           }
24011
24012           return node;
24013       },
24014
24015       _insert: function (item, level, isNode) {
24016
24017           var toBBox = this.toBBox,
24018               bbox = isNode ? item : toBBox(item),
24019               insertPath = [];
24020
24021           // find the best node for accommodating the item, saving all nodes along the path too
24022           var node = this._chooseSubtree(bbox, this.data, level, insertPath);
24023
24024           // put the item into the node
24025           node.children.push(item);
24026           extend$1(node, bbox);
24027
24028           // split on node overflow; propagate upwards if necessary
24029           while (level >= 0) {
24030               if (insertPath[level].children.length > this._maxEntries) {
24031                   this._split(insertPath, level);
24032                   level--;
24033               } else break;
24034           }
24035
24036           // adjust bboxes along the insertion path
24037           this._adjustParentBBoxes(bbox, insertPath, level);
24038       },
24039
24040       // split overflowed node into two
24041       _split: function (insertPath, level) {
24042
24043           var node = insertPath[level],
24044               M = node.children.length,
24045               m = this._minEntries;
24046
24047           this._chooseSplitAxis(node, m, M);
24048
24049           var splitIndex = this._chooseSplitIndex(node, m, M);
24050
24051           var newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));
24052           newNode.height = node.height;
24053           newNode.leaf = node.leaf;
24054
24055           calcBBox(node, this.toBBox);
24056           calcBBox(newNode, this.toBBox);
24057
24058           if (level) insertPath[level - 1].children.push(newNode);
24059           else this._splitRoot(node, newNode);
24060       },
24061
24062       _splitRoot: function (node, newNode) {
24063           // split root node
24064           this.data = createNode([node, newNode]);
24065           this.data.height = node.height + 1;
24066           this.data.leaf = false;
24067           calcBBox(this.data, this.toBBox);
24068       },
24069
24070       _chooseSplitIndex: function (node, m, M) {
24071
24072           var i, bbox1, bbox2, overlap, area, minOverlap, minArea, index;
24073
24074           minOverlap = minArea = Infinity;
24075
24076           for (i = m; i <= M - m; i++) {
24077               bbox1 = distBBox(node, 0, i, this.toBBox);
24078               bbox2 = distBBox(node, i, M, this.toBBox);
24079
24080               overlap = intersectionArea(bbox1, bbox2);
24081               area = bboxArea(bbox1) + bboxArea(bbox2);
24082
24083               // choose distribution with minimum overlap
24084               if (overlap < minOverlap) {
24085                   minOverlap = overlap;
24086                   index = i;
24087
24088                   minArea = area < minArea ? area : minArea;
24089
24090               } else if (overlap === minOverlap) {
24091                   // otherwise choose distribution with minimum area
24092                   if (area < minArea) {
24093                       minArea = area;
24094                       index = i;
24095                   }
24096               }
24097           }
24098
24099           return index;
24100       },
24101
24102       // sorts node children by the best axis for split
24103       _chooseSplitAxis: function (node, m, M) {
24104
24105           var compareMinX = node.leaf ? this.compareMinX : compareNodeMinX,
24106               compareMinY = node.leaf ? this.compareMinY : compareNodeMinY,
24107               xMargin = this._allDistMargin(node, m, M, compareMinX),
24108               yMargin = this._allDistMargin(node, m, M, compareMinY);
24109
24110           // if total distributions margin value is minimal for x, sort by minX,
24111           // otherwise it's already sorted by minY
24112           if (xMargin < yMargin) node.children.sort(compareMinX);
24113       },
24114
24115       // total margin of all possible split distributions where each node is at least m full
24116       _allDistMargin: function (node, m, M, compare) {
24117
24118           node.children.sort(compare);
24119
24120           var toBBox = this.toBBox,
24121               leftBBox = distBBox(node, 0, m, toBBox),
24122               rightBBox = distBBox(node, M - m, M, toBBox),
24123               margin = bboxMargin(leftBBox) + bboxMargin(rightBBox),
24124               i, child;
24125
24126           for (i = m; i < M - m; i++) {
24127               child = node.children[i];
24128               extend$1(leftBBox, node.leaf ? toBBox(child) : child);
24129               margin += bboxMargin(leftBBox);
24130           }
24131
24132           for (i = M - m - 1; i >= m; i--) {
24133               child = node.children[i];
24134               extend$1(rightBBox, node.leaf ? toBBox(child) : child);
24135               margin += bboxMargin(rightBBox);
24136           }
24137
24138           return margin;
24139       },
24140
24141       _adjustParentBBoxes: function (bbox, path, level) {
24142           // adjust bboxes along the given tree path
24143           for (var i = level; i >= 0; i--) {
24144               extend$1(path[i], bbox);
24145           }
24146       },
24147
24148       _condense: function (path) {
24149           // go through the path, removing empty nodes and updating bboxes
24150           for (var i = path.length - 1, siblings; i >= 0; i--) {
24151               if (path[i].children.length === 0) {
24152                   if (i > 0) {
24153                       siblings = path[i - 1].children;
24154                       siblings.splice(siblings.indexOf(path[i]), 1);
24155
24156                   } else this.clear();
24157
24158               } else calcBBox(path[i], this.toBBox);
24159           }
24160       },
24161
24162       _initFormat: function (format) {
24163           // data format (minX, minY, maxX, maxY accessors)
24164
24165           // uses eval-type function compilation instead of just accepting a toBBox function
24166           // because the algorithms are very sensitive to sorting functions performance,
24167           // so they should be dead simple and without inner calls
24168
24169           var compareArr = ['return a', ' - b', ';'];
24170
24171           this.compareMinX = new Function('a', 'b', compareArr.join(format[0]));
24172           this.compareMinY = new Function('a', 'b', compareArr.join(format[1]));
24173
24174           this.toBBox = new Function('a',
24175               'return {minX: a' + format[0] +
24176               ', minY: a' + format[1] +
24177               ', maxX: a' + format[2] +
24178               ', maxY: a' + format[3] + '};');
24179       }
24180   };
24181
24182   function findItem(item, items, equalsFn) {
24183       if (!equalsFn) return items.indexOf(item);
24184
24185       for (var i = 0; i < items.length; i++) {
24186           if (equalsFn(item, items[i])) return i;
24187       }
24188       return -1;
24189   }
24190
24191   // calculate node's bbox from bboxes of its children
24192   function calcBBox(node, toBBox) {
24193       distBBox(node, 0, node.children.length, toBBox, node);
24194   }
24195
24196   // min bounding rectangle of node children from k to p-1
24197   function distBBox(node, k, p, toBBox, destNode) {
24198       if (!destNode) destNode = createNode(null);
24199       destNode.minX = Infinity;
24200       destNode.minY = Infinity;
24201       destNode.maxX = -Infinity;
24202       destNode.maxY = -Infinity;
24203
24204       for (var i = k, child; i < p; i++) {
24205           child = node.children[i];
24206           extend$1(destNode, node.leaf ? toBBox(child) : child);
24207       }
24208
24209       return destNode;
24210   }
24211
24212   function extend$1(a, b) {
24213       a.minX = Math.min(a.minX, b.minX);
24214       a.minY = Math.min(a.minY, b.minY);
24215       a.maxX = Math.max(a.maxX, b.maxX);
24216       a.maxY = Math.max(a.maxY, b.maxY);
24217       return a;
24218   }
24219
24220   function compareNodeMinX(a, b) { return a.minX - b.minX; }
24221   function compareNodeMinY(a, b) { return a.minY - b.minY; }
24222
24223   function bboxArea(a)   { return (a.maxX - a.minX) * (a.maxY - a.minY); }
24224   function bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }
24225
24226   function enlargedArea(a, b) {
24227       return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *
24228              (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));
24229   }
24230
24231   function intersectionArea(a, b) {
24232       var minX = Math.max(a.minX, b.minX),
24233           minY = Math.max(a.minY, b.minY),
24234           maxX = Math.min(a.maxX, b.maxX),
24235           maxY = Math.min(a.maxY, b.maxY);
24236
24237       return Math.max(0, maxX - minX) *
24238              Math.max(0, maxY - minY);
24239   }
24240
24241   function contains$2(a, b) {
24242       return a.minX <= b.minX &&
24243              a.minY <= b.minY &&
24244              b.maxX <= a.maxX &&
24245              b.maxY <= a.maxY;
24246   }
24247
24248   function intersects$1(a, b) {
24249       return b.minX <= a.maxX &&
24250              b.minY <= a.maxY &&
24251              b.maxX >= a.minX &&
24252              b.maxY >= a.minY;
24253   }
24254
24255   function createNode(children) {
24256       return {
24257           children: children,
24258           height: 1,
24259           leaf: true,
24260           minX: Infinity,
24261           minY: Infinity,
24262           maxX: -Infinity,
24263           maxY: -Infinity
24264       };
24265   }
24266
24267   // sort an array so that items come in groups of n unsorted items, with groups sorted between each other;
24268   // combines selection algorithm with binary divide & conquer approach
24269
24270   function multiSelect(arr, left, right, n, compare) {
24271       var stack = [left, right],
24272           mid;
24273
24274       while (stack.length) {
24275           right = stack.pop();
24276           left = stack.pop();
24277
24278           if (right - left <= n) continue;
24279
24280           mid = left + Math.ceil((right - left) / n / 2) * n;
24281           quickselect_1(arr, mid, left, right, compare);
24282
24283           stack.push(left, mid, mid, right);
24284       }
24285   }
24286   rbush_1.default = default_1$1;
24287
24288   var lineclip_1 = lineclip;
24289
24290   lineclip.polyline = lineclip;
24291   lineclip.polygon = polygonclip;
24292
24293
24294   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
24295   // handle polylines rather than just segments
24296
24297   function lineclip(points, bbox, result) {
24298
24299       var len = points.length,
24300           codeA = bitCode(points[0], bbox),
24301           part = [],
24302           i, a, b, codeB, lastCode;
24303
24304       if (!result) result = [];
24305
24306       for (i = 1; i < len; i++) {
24307           a = points[i - 1];
24308           b = points[i];
24309           codeB = lastCode = bitCode(b, bbox);
24310
24311           while (true) {
24312
24313               if (!(codeA | codeB)) { // accept
24314                   part.push(a);
24315
24316                   if (codeB !== lastCode) { // segment went outside
24317                       part.push(b);
24318
24319                       if (i < len - 1) { // start a new line
24320                           result.push(part);
24321                           part = [];
24322                       }
24323                   } else if (i === len - 1) {
24324                       part.push(b);
24325                   }
24326                   break;
24327
24328               } else if (codeA & codeB) { // trivial reject
24329                   break;
24330
24331               } else if (codeA) { // a outside, intersect with clip edge
24332                   a = intersect$1(a, b, codeA, bbox);
24333                   codeA = bitCode(a, bbox);
24334
24335               } else { // b outside
24336                   b = intersect$1(a, b, codeB, bbox);
24337                   codeB = bitCode(b, bbox);
24338               }
24339           }
24340
24341           codeA = lastCode;
24342       }
24343
24344       if (part.length) result.push(part);
24345
24346       return result;
24347   }
24348
24349   // Sutherland-Hodgeman polygon clipping algorithm
24350
24351   function polygonclip(points, bbox) {
24352
24353       var result, edge, prev, prevInside, i, p, inside;
24354
24355       // clip against each side of the clip rectangle
24356       for (edge = 1; edge <= 8; edge *= 2) {
24357           result = [];
24358           prev = points[points.length - 1];
24359           prevInside = !(bitCode(prev, bbox) & edge);
24360
24361           for (i = 0; i < points.length; i++) {
24362               p = points[i];
24363               inside = !(bitCode(p, bbox) & edge);
24364
24365               // if segment goes through the clip window, add an intersection
24366               if (inside !== prevInside) result.push(intersect$1(prev, p, edge, bbox));
24367
24368               if (inside) result.push(p); // add a point if it's inside
24369
24370               prev = p;
24371               prevInside = inside;
24372           }
24373
24374           points = result;
24375
24376           if (!points.length) break;
24377       }
24378
24379       return result;
24380   }
24381
24382   // intersect a segment against one of the 4 lines that make up the bbox
24383
24384   function intersect$1(a, b, edge, bbox) {
24385       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
24386              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
24387              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
24388              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
24389              null;
24390   }
24391
24392   // bit code reflects the point position relative to the bbox:
24393
24394   //         left  mid  right
24395   //    top  1001  1000  1010
24396   //    mid  0001  0000  0010
24397   // bottom  0101  0100  0110
24398
24399   function bitCode(p, bbox) {
24400       var code = 0;
24401
24402       if (p[0] < bbox[0]) code |= 1; // left
24403       else if (p[0] > bbox[2]) code |= 2; // right
24404
24405       if (p[1] < bbox[1]) code |= 4; // bottom
24406       else if (p[1] > bbox[3]) code |= 8; // top
24407
24408       return code;
24409   }
24410
24411   var whichPolygon_1 = whichPolygon;
24412
24413   function whichPolygon(data) {
24414       var bboxes = [];
24415       for (var i = 0; i < data.features.length; i++) {
24416           var feature = data.features[i];
24417           var coords = feature.geometry.coordinates;
24418
24419           if (feature.geometry.type === 'Polygon') {
24420               bboxes.push(treeItem(coords, feature.properties));
24421
24422           } else if (feature.geometry.type === 'MultiPolygon') {
24423               for (var j = 0; j < coords.length; j++) {
24424                   bboxes.push(treeItem(coords[j], feature.properties));
24425               }
24426           }
24427       }
24428
24429       var tree = rbush_1().load(bboxes);
24430
24431       function query(p, multi) {
24432           var output = [],
24433               result = tree.search({
24434                   minX: p[0],
24435                   minY: p[1],
24436                   maxX: p[0],
24437                   maxY: p[1]
24438               });
24439           for (var i = 0; i < result.length; i++) {
24440               if (insidePolygon(result[i].coords, p)) {
24441                   if (multi)
24442                       output.push(result[i].props);
24443                   else
24444                       return result[i].props;
24445               }
24446           }
24447           return multi && output.length ? output : null;
24448       }
24449
24450       query.tree = tree;
24451       query.bbox = function queryBBox(bbox) {
24452           var output = [];
24453           var result = tree.search({
24454               minX: bbox[0],
24455               minY: bbox[1],
24456               maxX: bbox[2],
24457               maxY: bbox[3]
24458           });
24459           for (var i = 0; i < result.length; i++) {
24460               if (polygonIntersectsBBox(result[i].coords, bbox)) {
24461                   output.push(result[i].props);
24462               }
24463           }
24464           return output;
24465       };
24466
24467       return query;
24468   }
24469
24470   function polygonIntersectsBBox(polygon, bbox) {
24471       var bboxCenter = [
24472           (bbox[0] + bbox[2]) / 2,
24473           (bbox[1] + bbox[3]) / 2
24474       ];
24475       if (insidePolygon(polygon, bboxCenter)) return true;
24476       for (var i = 0; i < polygon.length; i++) {
24477           if (lineclip_1(polygon[i], bbox).length > 0) return true;
24478       }
24479       return false;
24480   }
24481
24482   // ray casting algorithm for detecting if point is in polygon
24483   function insidePolygon(rings, p) {
24484       var inside = false;
24485       for (var i = 0, len = rings.length; i < len; i++) {
24486           var ring = rings[i];
24487           for (var j = 0, len2 = ring.length, k = len2 - 1; j < len2; k = j++) {
24488               if (rayIntersect(p, ring[j], ring[k])) inside = !inside;
24489           }
24490       }
24491       return inside;
24492   }
24493
24494   function rayIntersect(p, p1, p2) {
24495       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]);
24496   }
24497
24498   function treeItem(coords, props) {
24499       var item = {
24500           minX: Infinity,
24501           minY: Infinity,
24502           maxX: -Infinity,
24503           maxY: -Infinity,
24504           coords: coords,
24505           props: props
24506       };
24507
24508       for (var i = 0; i < coords[0].length; i++) {
24509           var p = coords[0][i];
24510           item.minX = Math.min(item.minX, p[0]);
24511           item.minY = Math.min(item.minY, p[1]);
24512           item.maxX = Math.max(item.maxX, p[0]);
24513           item.maxY = Math.max(item.maxY, p[1]);
24514       }
24515       return item;
24516   }
24517
24518   // index the osm-community-index
24519   var ociFeatureCollection = values$1(features$2).map(function(feature) {
24520       // workaround for which-polygon: only supports `properties`, not `id`
24521       // https://github.com/mapbox/which-polygon/pull/6
24522       feature.properties = {
24523           id: feature.id,
24524           area: d3_geoArea(feature)   // also precompute areas
24525       };
24526       return feature;
24527   });
24528
24529
24530   var data = {
24531       community: {
24532           features: features$2,
24533           resources: resources,
24534           query: whichPolygon_1({
24535               type: 'FeatureCollection',
24536               features: ociFeatureCollection
24537           })
24538       },
24539       imagery: dataImagery,  //legacy
24540       presets: {
24541           presets: presets,
24542           defaults: defaults,
24543           categories: categories,
24544           fields: fields
24545       }
24546   };
24547
24548   function osmEntity$$1(attrs) {
24549       // For prototypal inheritance.
24550       if (this instanceof osmEntity$$1) return;
24551
24552       // Create the appropriate subtype.
24553       if (attrs && attrs.type) {
24554           return osmEntity$$1[attrs.type].apply(this, arguments);
24555       } else if (attrs && attrs.id) {
24556           return osmEntity$$1[osmEntity$$1.id.type(attrs.id)].apply(this, arguments);
24557       }
24558
24559       // Initialize a generic Entity (used only in tests).
24560       return (new osmEntity$$1()).initialize(arguments);
24561   }
24562
24563
24564   osmEntity$$1.id = function(type) {
24565       return osmEntity$$1.id.fromOSM(type, osmEntity$$1.id.next[type]--);
24566   };
24567
24568
24569   osmEntity$$1.id.next = {
24570       changeset: -1, node: -1, way: -1, relation: -1
24571   };
24572
24573
24574   osmEntity$$1.id.fromOSM = function(type, id) {
24575       return type[0] + id;
24576   };
24577
24578
24579   osmEntity$$1.id.toOSM = function(id) {
24580       return id.slice(1);
24581   };
24582
24583
24584   osmEntity$$1.id.type = function(id) {
24585       return { 'c': 'changeset', 'n': 'node', 'w': 'way', 'r': 'relation' }[id[0]];
24586   };
24587
24588
24589   // A function suitable for use as the second argument to d3.selection#data().
24590   osmEntity$$1.key = function(entity) {
24591       return entity.id + 'v' + (entity.v || 0);
24592   };
24593
24594
24595   osmEntity$$1.prototype = {
24596
24597       tags: {},
24598
24599
24600       initialize: function(sources) {
24601           for (var i = 0; i < sources.length; ++i) {
24602               var source = sources[i];
24603               for (var prop in source) {
24604                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
24605                       if (source[prop] === undefined) {
24606                           delete this[prop];
24607                       } else {
24608                           this[prop] = source[prop];
24609                       }
24610                   }
24611               }
24612           }
24613
24614           if (!this.id && this.type) {
24615               this.id = osmEntity$$1.id(this.type);
24616           }
24617           if (!this.hasOwnProperty('visible')) {
24618               this.visible = true;
24619           }
24620
24621           return this;
24622       },
24623
24624
24625       copy: function(resolver, copies) {
24626           if (copies[this.id])
24627               return copies[this.id];
24628
24629           var copy = osmEntity$$1(this, {id: undefined, user: undefined, version: undefined});
24630           copies[this.id] = copy;
24631
24632           return copy;
24633       },
24634
24635
24636       osmId: function() {
24637           return osmEntity$$1.id.toOSM(this.id);
24638       },
24639
24640
24641       isNew: function() {
24642           return this.osmId() < 0;
24643       },
24644
24645
24646       update: function(attrs) {
24647           return osmEntity$$1(this, attrs, {v: 1 + (this.v || 0)});
24648       },
24649
24650
24651       mergeTags: function(tags) {
24652           var merged = clone(this.tags), changed = false;
24653           for (var k in tags) {
24654               var t1 = merged[k],
24655                   t2 = tags[k];
24656               if (!t1) {
24657                   changed = true;
24658                   merged[k] = t2;
24659               } else if (t1 !== t2) {
24660                   changed = true;
24661                   merged[k] = union(t1.split(/;\s*/), t2.split(/;\s*/)).join(';');
24662               }
24663           }
24664           return changed ? this.update({tags: merged}) : this;
24665       },
24666
24667
24668       intersects: function(extent, resolver) {
24669           return this.extent(resolver).intersects(extent);
24670       },
24671
24672
24673       isUsed: function(resolver) {
24674           return without(Object.keys(this.tags), 'area').length > 0 ||
24675               resolver.parentRelations(this).length > 0;
24676       },
24677
24678
24679       hasInterestingTags: function() {
24680           return keys$1(this.tags).some(osmIsInterestingTag);
24681       },
24682
24683
24684       isHighwayIntersection: function() {
24685           return false;
24686       },
24687
24688       isDegenerate: function() {
24689           return true;
24690       },
24691
24692       deprecatedTags: function() {
24693           var tags = toPairs(this.tags);
24694           var deprecated = {};
24695
24696           dataDeprecated.forEach(function(d) {
24697               var match = toPairs(d.old)[0];
24698               tags.forEach(function(t) {
24699                   if (t[0] === match[0] &&
24700                       (t[1] === match[1] || match[1] === '*')) {
24701                       deprecated[t[0]] = t[1];
24702                   }
24703               });
24704           });
24705
24706           return deprecated;
24707       }
24708   };
24709
24710   function geoExtent$$1(min, max) {
24711       if (!(this instanceof geoExtent$$1)) {
24712           return new geoExtent$$1(min, max);
24713       } else if (min instanceof geoExtent$$1) {
24714           return min;
24715       } else if (min && min.length === 2 && min[0].length === 2 && min[1].length === 2) {
24716           this[0] = min[0];
24717           this[1] = min[1];
24718       } else {
24719           this[0] = min        || [ Infinity,  Infinity];
24720           this[1] = max || min || [-Infinity, -Infinity];
24721       }
24722   }
24723
24724   geoExtent$$1.prototype = new Array(2);
24725
24726   assignIn(geoExtent$$1.prototype, {
24727
24728       equals: function (obj) {
24729           return this[0][0] === obj[0][0] &&
24730               this[0][1] === obj[0][1] &&
24731               this[1][0] === obj[1][0] &&
24732               this[1][1] === obj[1][1];
24733       },
24734
24735
24736       extend: function(obj) {
24737           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24738           return geoExtent$$1(
24739               [Math.min(obj[0][0], this[0][0]), Math.min(obj[0][1], this[0][1])],
24740               [Math.max(obj[1][0], this[1][0]), Math.max(obj[1][1], this[1][1])]
24741           );
24742       },
24743
24744
24745       _extend: function(extent) {
24746           this[0][0] = Math.min(extent[0][0], this[0][0]);
24747           this[0][1] = Math.min(extent[0][1], this[0][1]);
24748           this[1][0] = Math.max(extent[1][0], this[1][0]);
24749           this[1][1] = Math.max(extent[1][1], this[1][1]);
24750       },
24751
24752
24753       area: function() {
24754           return Math.abs((this[1][0] - this[0][0]) * (this[1][1] - this[0][1]));
24755       },
24756
24757
24758       center: function() {
24759           return [(this[0][0] + this[1][0]) / 2, (this[0][1] + this[1][1]) / 2];
24760       },
24761
24762
24763       rectangle: function() {
24764           return [this[0][0], this[0][1], this[1][0], this[1][1]];
24765       },
24766
24767
24768       bbox: function() {
24769           return { minX: this[0][0], minY: this[0][1], maxX: this[1][0], maxY: this[1][1] };
24770       },
24771
24772
24773       polygon: function() {
24774           return [
24775               [this[0][0], this[0][1]],
24776               [this[0][0], this[1][1]],
24777               [this[1][0], this[1][1]],
24778               [this[1][0], this[0][1]],
24779               [this[0][0], this[0][1]]
24780           ];
24781       },
24782
24783
24784       contains: function(obj) {
24785           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24786           return obj[0][0] >= this[0][0] &&
24787                  obj[0][1] >= this[0][1] &&
24788                  obj[1][0] <= this[1][0] &&
24789                  obj[1][1] <= this[1][1];
24790       },
24791
24792
24793       intersects: function(obj) {
24794           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24795           return obj[0][0] <= this[1][0] &&
24796                  obj[0][1] <= this[1][1] &&
24797                  obj[1][0] >= this[0][0] &&
24798                  obj[1][1] >= this[0][1];
24799       },
24800
24801
24802       intersection: function(obj) {
24803           if (!this.intersects(obj)) return new geoExtent$$1();
24804           return new geoExtent$$1(
24805               [Math.max(obj[0][0], this[0][0]), Math.max(obj[0][1], this[0][1])],
24806               [Math.min(obj[1][0], this[1][0]), Math.min(obj[1][1], this[1][1])]
24807           );
24808       },
24809
24810
24811       percentContainedIn: function(obj) {
24812           if (!(obj instanceof geoExtent$$1)) obj = new geoExtent$$1(obj);
24813           var a1 = this.intersection(obj).area();
24814           var a2 = this.area();
24815
24816           if (a1 === Infinity || a2 === Infinity || a1 === 0 || a2 === 0) {
24817               return 0;
24818           } else {
24819               return a1 / a2;
24820           }
24821       },
24822
24823
24824       padByMeters: function(meters) {
24825           var dLat = geoMetersToLat(meters);
24826           var dLon = geoMetersToLon(meters, this.center()[1]);
24827           return geoExtent$$1(
24828               [this[0][0] - dLon, this[0][1] - dLat],
24829               [this[1][0] + dLon, this[1][1] + dLat]
24830           );
24831       },
24832
24833
24834       toParam: function() {
24835           return this.rectangle().join(',');
24836       }
24837
24838   });
24839
24840   // constants
24841   var TAU = 2 * Math.PI;
24842   var EQUATORIAL_RADIUS = 6356752.314245179;
24843   var POLAR_RADIUS = 6378137.0;
24844
24845
24846   function geoLatToMeters(dLat) {
24847       return dLat * (TAU * POLAR_RADIUS / 360);
24848   }
24849
24850
24851   function geoLonToMeters(dLon, atLat) {
24852       return Math.abs(atLat) >= 90 ? 0 :
24853           dLon * (TAU * EQUATORIAL_RADIUS / 360) * Math.abs(Math.cos(atLat * (Math.PI / 180)));
24854   }
24855
24856
24857   function geoMetersToLat(m) {
24858       return m / (TAU * POLAR_RADIUS / 360);
24859   }
24860
24861
24862   function geoMetersToLon(m, atLat) {
24863       return Math.abs(atLat) >= 90 ? 0 :
24864           m / (TAU * EQUATORIAL_RADIUS / 360) / Math.abs(Math.cos(atLat * (Math.PI / 180)));
24865   }
24866
24867
24868   function geoMetersToOffset(meters, tileSize) {
24869       tileSize = tileSize || 256;
24870       return [
24871           meters[0] * tileSize / (TAU * EQUATORIAL_RADIUS),
24872           -meters[1] * tileSize / (TAU * POLAR_RADIUS)
24873       ];
24874   }
24875
24876
24877   function geoOffsetToMeters(offset, tileSize) {
24878       tileSize = tileSize || 256;
24879       return [
24880           offset[0] * TAU * EQUATORIAL_RADIUS / tileSize,
24881           -offset[1] * TAU * POLAR_RADIUS / tileSize
24882       ];
24883   }
24884
24885
24886   // Equirectangular approximation of spherical distances on Earth
24887   function geoSphericalDistance(a, b) {
24888       var x = geoLonToMeters(a[0] - b[0], (a[1] + b[1]) / 2);
24889       var y = geoLatToMeters(a[1] - b[1]);
24890       return Math.sqrt((x * x) + (y * y));
24891   }
24892
24893
24894   // scale to zoom
24895   function geoScaleToZoom(k, tileSize) {
24896       tileSize = tileSize || 256;
24897       var log2ts = Math.log(tileSize) * Math.LOG2E;
24898       return Math.log(k * TAU) / Math.LN2 - log2ts;
24899   }
24900
24901
24902   // zoom to scale
24903   function geoZoomToScale(z, tileSize) {
24904       tileSize = tileSize || 256;
24905       return tileSize * Math.pow(2, z) / TAU;
24906   }
24907
24908   /**
24909    * A specialized version of `_.every` for arrays without support for
24910    * iteratee shorthands.
24911    *
24912    * @private
24913    * @param {Array} [array] The array to iterate over.
24914    * @param {Function} predicate The function invoked per iteration.
24915    * @returns {boolean} Returns `true` if all elements pass the predicate check,
24916    *  else `false`.
24917    */
24918   function arrayEvery(array, predicate) {
24919     var index = -1,
24920         length = array == null ? 0 : array.length;
24921
24922     while (++index < length) {
24923       if (!predicate(array[index], index, array)) {
24924         return false;
24925       }
24926     }
24927     return true;
24928   }
24929
24930   /**
24931    * The base implementation of `_.every` without support for iteratee shorthands.
24932    *
24933    * @private
24934    * @param {Array|Object} collection The collection to iterate over.
24935    * @param {Function} predicate The function invoked per iteration.
24936    * @returns {boolean} Returns `true` if all elements pass the predicate check,
24937    *  else `false`
24938    */
24939   function baseEvery(collection, predicate) {
24940     var result = true;
24941     baseEach(collection, function(value, index, collection) {
24942       result = !!predicate(value, index, collection);
24943       return result;
24944     });
24945     return result;
24946   }
24947
24948   /**
24949    * Checks if `predicate` returns truthy for **all** elements of `collection`.
24950    * Iteration is stopped once `predicate` returns falsey. The predicate is
24951    * invoked with three arguments: (value, index|key, collection).
24952    *
24953    * **Note:** This method returns `true` for
24954    * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because
24955    * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of
24956    * elements of empty collections.
24957    *
24958    * @static
24959    * @memberOf _
24960    * @since 0.1.0
24961    * @category Collection
24962    * @param {Array|Object} collection The collection to iterate over.
24963    * @param {Function} [predicate=_.identity] The function invoked per iteration.
24964    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
24965    * @returns {boolean} Returns `true` if all elements pass the predicate check,
24966    *  else `false`.
24967    * @example
24968    *
24969    * _.every([true, 1, null, 'yes'], Boolean);
24970    * // => false
24971    *
24972    * var users = [
24973    *   { 'user': 'barney', 'age': 36, 'active': false },
24974    *   { 'user': 'fred',   'age': 40, 'active': false }
24975    * ];
24976    *
24977    * // The `_.matches` iteratee shorthand.
24978    * _.every(users, { 'user': 'barney', 'active': false });
24979    * // => false
24980    *
24981    * // The `_.matchesProperty` iteratee shorthand.
24982    * _.every(users, ['active', false]);
24983    * // => true
24984    *
24985    * // The `_.property` iteratee shorthand.
24986    * _.every(users, 'active');
24987    * // => false
24988    */
24989   function every(collection, predicate, guard) {
24990     var func = isArray(collection) ? arrayEvery : baseEvery;
24991     if (guard && isIterateeCall(collection, predicate, guard)) {
24992       predicate = undefined;
24993     }
24994     return func(collection, baseIteratee(predicate, 3));
24995   }
24996
24997   /**
24998    * The base implementation of `_.some` without support for iteratee shorthands.
24999    *
25000    * @private
25001    * @param {Array|Object} collection The collection to iterate over.
25002    * @param {Function} predicate The function invoked per iteration.
25003    * @returns {boolean} Returns `true` if any element passes the predicate check,
25004    *  else `false`.
25005    */
25006   function baseSome(collection, predicate) {
25007     var result;
25008
25009     baseEach(collection, function(value, index, collection) {
25010       result = predicate(value, index, collection);
25011       return !result;
25012     });
25013     return !!result;
25014   }
25015
25016   /**
25017    * Checks if `predicate` returns truthy for **any** element of `collection`.
25018    * Iteration is stopped once `predicate` returns truthy. The predicate is
25019    * invoked with three arguments: (value, index|key, collection).
25020    *
25021    * @static
25022    * @memberOf _
25023    * @since 0.1.0
25024    * @category Collection
25025    * @param {Array|Object} collection The collection to iterate over.
25026    * @param {Function} [predicate=_.identity] The function invoked per iteration.
25027    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
25028    * @returns {boolean} Returns `true` if any element passes the predicate check,
25029    *  else `false`.
25030    * @example
25031    *
25032    * _.some([null, 0, 'yes', false], Boolean);
25033    * // => true
25034    *
25035    * var users = [
25036    *   { 'user': 'barney', 'active': true },
25037    *   { 'user': 'fred',   'active': false }
25038    * ];
25039    *
25040    * // The `_.matches` iteratee shorthand.
25041    * _.some(users, { 'user': 'barney', 'active': false });
25042    * // => false
25043    *
25044    * // The `_.matchesProperty` iteratee shorthand.
25045    * _.some(users, ['active', false]);
25046    * // => true
25047    *
25048    * // The `_.property` iteratee shorthand.
25049    * _.some(users, 'active');
25050    * // => true
25051    */
25052   function some(collection, predicate, guard) {
25053     var func = isArray(collection) ? arraySome : baseSome;
25054     if (guard && isIterateeCall(collection, predicate, guard)) {
25055       predicate = undefined;
25056     }
25057     return func(collection, baseIteratee(predicate, 3));
25058   }
25059
25060   // vector equals
25061   function geoVecEqual(a, b, epsilon) {
25062       if (epsilon) {
25063           return (Math.abs(a[0] - b[0]) <= epsilon) && (Math.abs(a[1] - b[1]) <= epsilon);
25064       } else {
25065           return (a[0] === b[0]) && (a[1] === b[1]);
25066       }
25067   }
25068
25069   // vector addition
25070   function geoVecAdd(a, b) {
25071       return [ a[0] + b[0], a[1] + b[1] ];
25072   }
25073
25074   // vector subtraction
25075   function geoVecSubtract(a, b) {
25076       return [ a[0] - b[0], a[1] - b[1] ];
25077   }
25078
25079   // vector scaling
25080   function geoVecScale(a, mag) {
25081       return [ a[0] * mag, a[1] * mag ];
25082   }
25083
25084   // vector rounding (was: geoRoundCoordinates)
25085   function geoVecFloor(a) {
25086       return [ Math.floor(a[0]), Math.floor(a[1]) ];
25087   }
25088
25089   // linear interpolation
25090   function geoVecInterp(a, b, t) {
25091       return [
25092           a[0] + (b[0] - a[0]) * t,
25093           a[1] + (b[1] - a[1]) * t
25094       ];
25095   }
25096
25097   // http://jsperf.com/id-dist-optimization
25098   function geoVecLength(a, b) {
25099       var x = a[0] - b[0];
25100       var y = a[1] - b[1];
25101       return Math.sqrt((x * x) + (y * y));
25102   }
25103
25104   // Return the counterclockwise angle in the range (-pi, pi)
25105   // between the positive X axis and the line intersecting a and b.
25106   function geoVecAngle(a, b) {
25107       return Math.atan2(b[1] - a[1], b[0] - a[0]);
25108   }
25109
25110   // dot product
25111   function geoVecDot(a, b, origin) {
25112       origin = origin || [0, 0];
25113       return (a[0] - origin[0]) * (b[0] - origin[0]) +
25114           (a[1] - origin[1]) * (b[1] - origin[1]);
25115   }
25116
25117   // 2D cross product of OA and OB vectors, returns magnitude of Z vector
25118   // Returns a positive value, if OAB makes a counter-clockwise turn,
25119   // negative for clockwise turn, and zero if the points are collinear.
25120   function geoVecCross(a, b, origin) {
25121       origin = origin || [0, 0];
25122       return (a[0] - origin[0]) * (b[1] - origin[1]) -
25123           (a[1] - origin[1]) * (b[0] - origin[0]);
25124   }
25125
25126   // Return the counterclockwise angle in the range (-pi, pi)
25127   // between the positive X axis and the line intersecting a and b.
25128   function geoAngle(a, b, projection) {
25129       return geoVecAngle(projection(a.loc), projection(b.loc));
25130   }
25131
25132   function geoEdgeEqual(a, b) {
25133       return (a[0] === b[0] && a[1] === b[1]) ||
25134           (a[0] === b[1] && a[1] === b[0]);
25135   }
25136
25137   // Rotate all points counterclockwise around a pivot point by given angle
25138   function geoRotate(points, angle, around) {
25139       return points.map(function(point) {
25140           var radial = geoVecSubtract(point, around);
25141           return [
25142               radial[0] * Math.cos(angle) - radial[1] * Math.sin(angle) + around[0],
25143               radial[0] * Math.sin(angle) + radial[1] * Math.cos(angle) + around[1]
25144           ];
25145       });
25146   }
25147
25148
25149   // Choose the edge with the minimal distance from `point` to its orthogonal
25150   // projection onto that edge, if such a projection exists, or the distance to
25151   // the closest vertex on that edge. Returns an object with the `index` of the
25152   // chosen edge, the chosen `loc` on that edge, and the `distance` to to it.
25153   function geoChooseEdge(nodes, point, projection, activeID) {
25154       var dist = geoVecLength;
25155       var points = nodes.map(function(n) { return projection(n.loc); });
25156       var ids = nodes.map(function(n) { return n.id; });
25157       var min = Infinity;
25158       var idx;
25159       var loc;
25160
25161       for (var i = 0; i < points.length - 1; i++) {
25162           if (ids[i] === activeID || ids[i + 1] === activeID) continue;
25163
25164           var o = points[i];
25165           var s = geoVecSubtract(points[i + 1], o);
25166           var v = geoVecSubtract(point, o);
25167           var proj = geoVecDot(v, s) / geoVecDot(s, s);
25168           var p;
25169
25170           if (proj < 0) {
25171               p = o;
25172           } else if (proj > 1) {
25173               p = points[i + 1];
25174           } else {
25175               p = [o[0] + proj * s[0], o[1] + proj * s[1]];
25176           }
25177
25178           var d = dist(p, point);
25179           if (d < min) {
25180               min = d;
25181               idx = i + 1;
25182               loc = projection.invert(p);
25183           }
25184       }
25185
25186       if (idx !== undefined) {
25187           return { index: idx, distance: min, loc: loc };
25188       } else {
25189           return null;
25190       }
25191   }
25192
25193
25194   // Test active (dragged or drawing) segments against inactive segments
25195   // This is used to test e.g. multipolygon rings that cross
25196   // `activeNodes` is the ring containing the activeID being dragged.
25197   // `inactiveNodes` is the other ring to test against
25198   function geoHasLineIntersections(activeNodes, inactiveNodes, activeID) {
25199       var actives = [];
25200       var inactives = [];
25201       var j, k, n1, n2, segment;
25202
25203       // gather active segments (only segments in activeNodes that contain the activeID)
25204       for (j = 0; j < activeNodes.length - 1; j++) {
25205           n1 = activeNodes[j];
25206           n2 = activeNodes[j+1];
25207           segment = [n1.loc, n2.loc];
25208           if (n1.id === activeID || n2.id === activeID) {
25209               actives.push(segment);
25210           }
25211       }
25212
25213       // gather inactive segments
25214       for (j = 0; j < inactiveNodes.length - 1; j++) {
25215           n1 = inactiveNodes[j];
25216           n2 = inactiveNodes[j+1];
25217           segment = [n1.loc, n2.loc];
25218           inactives.push(segment);
25219       }
25220
25221       // test
25222       for (j = 0; j < actives.length; j++) {
25223           for (k = 0; k < inactives.length; k++) {
25224               var p = actives[j];
25225               var q = inactives[k];
25226               var hit = geoLineIntersection(p, q);
25227               if (hit) {
25228                   return true;
25229               }
25230           }
25231       }
25232
25233       return false;
25234   }
25235
25236
25237   // Test active (dragged or drawing) segments against inactive segments
25238   // This is used to test whether a way intersects with itself.
25239   function geoHasSelfIntersections(nodes, activeID) {
25240       var actives = [];
25241       var inactives = [];
25242       var j, k;
25243
25244       // group active and passive segments along the nodes
25245       for (j = 0; j < nodes.length - 1; j++) {
25246           var n1 = nodes[j];
25247           var n2 = nodes[j+1];
25248           var segment = [n1.loc, n2.loc];
25249           if (n1.id === activeID || n2.id === activeID) {
25250               actives.push(segment);
25251           } else {
25252               inactives.push(segment);
25253           }
25254       }
25255
25256       // test
25257       for (j = 0; j < actives.length; j++) {
25258           for (k = 0; k < inactives.length; k++) {
25259               var p = actives[j];
25260               var q = inactives[k];
25261               // skip if segments share an endpoint
25262               if (geoVecEqual(p[1], q[0]) || geoVecEqual(p[0], q[1]) ||
25263                   geoVecEqual(p[0], q[0]) || geoVecEqual(p[1], q[1]) ) {
25264                   continue;
25265               }
25266
25267               var hit = geoLineIntersection(p, q);
25268               if (hit) {
25269                   var epsilon = 1e-8;
25270                   // skip if the hit is at the segment's endpoint
25271                   if (geoVecEqual(p[1], hit, epsilon) || geoVecEqual(p[0], hit, epsilon) ||
25272                       geoVecEqual(q[1], hit, epsilon) || geoVecEqual(q[0], hit, epsilon) ) {
25273                       continue;
25274                   } else {
25275                       return true;
25276                   }
25277               }
25278           }
25279       }
25280
25281       return false;
25282   }
25283
25284
25285   // Return the intersection point of 2 line segments.
25286   // From https://github.com/pgkelley4/line-segments-intersect
25287   // This uses the vector cross product approach described below:
25288   //  http://stackoverflow.com/a/565282/786339
25289   function geoLineIntersection(a, b) {
25290       var p = [a[0][0], a[0][1]];
25291       var p2 = [a[1][0], a[1][1]];
25292       var q = [b[0][0], b[0][1]];
25293       var q2 = [b[1][0], b[1][1]];
25294       var r = geoVecSubtract(p2, p);
25295       var s = geoVecSubtract(q2, q);
25296       var uNumerator = geoVecCross(geoVecSubtract(q, p), r);
25297       var denominator = geoVecCross(r, s);
25298
25299       if (uNumerator && denominator) {
25300           var u = uNumerator / denominator;
25301           var t = geoVecCross(geoVecSubtract(q, p), s) / denominator;
25302
25303           if ((t >= 0) && (t <= 1) && (u >= 0) && (u <= 1)) {
25304               return geoVecInterp(p, p2, t);
25305           }
25306       }
25307
25308       return null;
25309   }
25310
25311
25312   function geoPathIntersections(path1, path2) {
25313       var intersections = [];
25314       for (var i = 0; i < path1.length - 1; i++) {
25315           for (var j = 0; j < path2.length - 1; j++) {
25316               var a = [ path1[i], path1[i+1] ];
25317               var b = [ path2[j], path2[j+1] ];
25318               var hit = geoLineIntersection(a, b);
25319               if (hit) {
25320                   intersections.push(hit);
25321               }
25322           }
25323       }
25324       return intersections;
25325   }
25326
25327   function geoPathHasIntersections(path1, path2) {
25328       for (var i = 0; i < path1.length - 1; i++) {
25329           for (var j = 0; j < path2.length - 1; j++) {
25330               var a = [ path1[i], path1[i+1] ];
25331               var b = [ path2[j], path2[j+1] ];
25332               var hit = geoLineIntersection(a, b);
25333               if (hit) {
25334                   return true;
25335               }
25336           }
25337       }
25338       return false;
25339   }
25340
25341
25342   // Return whether point is contained in polygon.
25343   //
25344   // `point` should be a 2-item array of coordinates.
25345   // `polygon` should be an array of 2-item arrays of coordinates.
25346   //
25347   // From https://github.com/substack/point-in-polygon.
25348   // ray-casting algorithm based on
25349   // http://www.ecse.rpi.edu/Homepages/wrf/Research/Short_Notes/pnpoly.html
25350   //
25351   function geoPointInPolygon(point, polygon) {
25352       var x = point[0];
25353       var y = point[1];
25354       var inside = false;
25355
25356       for (var i = 0, j = polygon.length - 1; i < polygon.length; j = i++) {
25357           var xi = polygon[i][0];
25358           var yi = polygon[i][1];
25359           var xj = polygon[j][0];
25360           var yj = polygon[j][1];
25361
25362           var intersect = ((yi > y) !== (yj > y)) &&
25363               (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
25364           if (intersect) inside = !inside;
25365       }
25366
25367       return inside;
25368   }
25369
25370
25371   function geoPolygonContainsPolygon(outer, inner) {
25372       return every(inner, function(point) {
25373           return geoPointInPolygon(point, outer);
25374       });
25375   }
25376
25377
25378   function geoPolygonIntersectsPolygon(outer, inner, checkSegments) {
25379       function testPoints(outer, inner) {
25380           return some(inner, function(point) {
25381               return geoPointInPolygon(point, outer);
25382           });
25383       }
25384
25385      return testPoints(outer, inner) || (!!checkSegments && geoPathHasIntersections(outer, inner));
25386   }
25387
25388
25389   function geoPathLength(path) {
25390       var length = 0;
25391       for (var i = 0; i < path.length - 1; i++) {
25392           length += geoVecLength(path[i], path[i + 1]);
25393       }
25394       return length;
25395   }
25396
25397
25398   // If the given point is at the edge of the padded viewport,
25399   // return a vector that will nudge the viewport in that direction
25400   function geoViewportEdge(point, dimensions) {
25401       var pad = [80, 20, 50, 20];   // top, right, bottom, left
25402       var x = 0;
25403       var y = 0;
25404
25405       if (point[0] > dimensions[0] - pad[1])
25406           x = -10;
25407       if (point[0] < pad[3])
25408           x = 10;
25409       if (point[1] > dimensions[1] - pad[2])
25410           y = -10;
25411       if (point[1] < pad[0])
25412           y = 10;
25413
25414       if (x || y) {
25415           return [x, y];
25416       } else {
25417           return null;
25418       }
25419   }
25420
25421   /*
25422       Bypasses features of D3's default projection stream pipeline that are unnecessary:
25423       * Antimeridian clipping
25424       * Spherical rotation
25425       * Resampling
25426   */
25427   function geoRawMercator() {
25428       var project = mercatorRaw;
25429       var k = 512 / Math.PI; // scale
25430       var x = 0;
25431       var y = 0; // translate
25432       var clipExtent = [[0, 0], [0, 0]];
25433
25434
25435       function projection$$1(point) {
25436           point = project(point[0] * Math.PI / 180, point[1] * Math.PI / 180);
25437           return [point[0] * k + x, y - point[1] * k];
25438       }
25439
25440
25441       projection$$1.invert = function(point) {
25442           point = project.invert((point[0] - x) / k, (y - point[1]) / k);
25443           return point && [point[0] * 180 / Math.PI, point[1] * 180 / Math.PI];
25444       };
25445
25446
25447       projection$$1.scale = function(_) {
25448           if (!arguments.length) return k;
25449           k = +_;
25450           return projection$$1;
25451       };
25452
25453
25454       projection$$1.translate = function(_) {
25455           if (!arguments.length) return [x, y];
25456           x = +_[0];
25457           y = +_[1];
25458           return projection$$1;
25459       };
25460
25461
25462       projection$$1.clipExtent = function(_) {
25463           if (!arguments.length) return clipExtent;
25464           clipExtent = _;
25465           return projection$$1;
25466       };
25467
25468
25469       projection$$1.transform = function(obj) {
25470           if (!arguments.length) return identity$7.translate(x, y).scale(k);
25471           x = +obj.x;
25472           y = +obj.y;
25473           k = +obj.k;
25474           return projection$$1;
25475       };
25476
25477
25478       projection$$1.stream = d3_geoTransform({
25479           point: function(x, y) {
25480               var vec = projection$$1([x, y]);
25481               this.stream.point(vec[0], vec[1]);
25482           }
25483       }).stream;
25484
25485
25486       return projection$$1;
25487   }
25488
25489   function osmChangeset() {
25490       if (!(this instanceof osmChangeset)) {
25491           return (new osmChangeset()).initialize(arguments);
25492       } else if (arguments.length) {
25493           this.initialize(arguments);
25494       }
25495   }
25496
25497
25498   osmEntity$$1.changeset = osmChangeset;
25499
25500   osmChangeset.prototype = Object.create(osmEntity$$1.prototype);
25501
25502   assignIn(osmChangeset.prototype, {
25503
25504       type: 'changeset',
25505
25506
25507       extent: function() {
25508           return new geoExtent$$1();
25509       },
25510
25511
25512       geometry: function() {
25513           return 'changeset';
25514       },
25515
25516
25517       asJXON: function() {
25518           return {
25519               osm: {
25520                   changeset: {
25521                       tag: map$3(this.tags, function(value, key) {
25522                           return { '@k': key, '@v': value };
25523                       }),
25524                       '@version': 0.6,
25525                       '@generator': 'iD'
25526                   }
25527               }
25528           };
25529       },
25530
25531
25532       // Generate [osmChange](http://wiki.openstreetmap.org/wiki/OsmChange)
25533       // XML. Returns a string.
25534       osmChangeJXON: function(changes) {
25535           var changeset_id = this.id;
25536
25537           function nest(x, order) {
25538               var groups = {};
25539               for (var i = 0; i < x.length; i++) {
25540                   var tagName = Object.keys(x[i])[0];
25541                   if (!groups[tagName]) groups[tagName] = [];
25542                   groups[tagName].push(x[i][tagName]);
25543               }
25544               var ordered = {};
25545               order.forEach(function(o) {
25546                   if (groups[o]) ordered[o] = groups[o];
25547               });
25548               return ordered;
25549           }
25550
25551
25552           // sort relations in a changeset by dependencies
25553           function sort(changes) {
25554
25555               // find a referenced relation in the current changeset
25556               function resolve(item) {
25557                   return find$1(relations, function(relation) {
25558                       return item.keyAttributes.type === 'relation'
25559                           && item.keyAttributes.ref === relation['@id'];
25560                   });
25561               }
25562
25563               // a new item is an item that has not been already processed
25564               function isNew(item) {
25565                   return !sorted[ item['@id'] ] && !find$1(processing, function(proc) {
25566                       return proc['@id'] === item['@id'];
25567                   });
25568               }
25569
25570               var processing = [],
25571                   sorted = {},
25572                   relations = changes.relation;
25573
25574               if (!relations) return changes;
25575
25576               for (var i = 0; i < relations.length; i++) {
25577                   var relation = relations[i];
25578
25579                   // skip relation if already sorted
25580                   if (!sorted[relation['@id']]) {
25581                       processing.push(relation);
25582                   }
25583
25584                   while (processing.length > 0) {
25585                       var next = processing[0],
25586                       deps = filter(compact(next.member.map(resolve)), isNew);
25587                       if (deps.length === 0) {
25588                           sorted[next['@id']] = next;
25589                           processing.shift();
25590                       } else {
25591                           processing = deps.concat(processing);
25592                       }
25593                   }
25594               }
25595
25596               changes.relation = values$1(sorted);
25597               return changes;
25598           }
25599
25600           function rep(entity) {
25601               return entity.asJXON(changeset_id);
25602           }
25603
25604           return {
25605               osmChange: {
25606                   '@version': 0.6,
25607                   '@generator': 'iD',
25608                   'create': sort(nest(changes.created.map(rep), ['node', 'way', 'relation'])),
25609                   'modify': nest(changes.modified.map(rep), ['node', 'way', 'relation']),
25610                   'delete': assignIn(nest(changes.deleted.map(rep), ['relation', 'way', 'node']), { '@if-unused': true })
25611               }
25612           };
25613       },
25614
25615
25616       asGeoJSON: function() {
25617           return {};
25618       }
25619
25620   });
25621
25622   /**
25623    * Creates a duplicate-free version of an array, using
25624    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
25625    * for equality comparisons, in which only the first occurrence of each element
25626    * is kept. The order of result values is determined by the order they occur
25627    * in the array.
25628    *
25629    * @static
25630    * @memberOf _
25631    * @since 0.1.0
25632    * @category Array
25633    * @param {Array} array The array to inspect.
25634    * @returns {Array} Returns the new duplicate free array.
25635    * @example
25636    *
25637    * _.uniq([2, 1, 2]);
25638    * // => [2, 1]
25639    */
25640   function uniq(array) {
25641     return (array && array.length) ? baseUniq(array) : [];
25642   }
25643
25644   function osmNode() {
25645       if (!(this instanceof osmNode)) {
25646           return (new osmNode()).initialize(arguments);
25647       } else if (arguments.length) {
25648           this.initialize(arguments);
25649       }
25650   }
25651
25652   osmEntity$$1.node = osmNode;
25653
25654   osmNode.prototype = Object.create(osmEntity$$1.prototype);
25655
25656   assignIn(osmNode.prototype, {
25657
25658       type: 'node',
25659
25660
25661       extent: function() {
25662           return new geoExtent$$1(this.loc);
25663       },
25664
25665
25666       geometry: function(graph) {
25667           return graph.transient(this, 'geometry', function() {
25668               return graph.isPoi(this) ? 'point' : 'vertex';
25669           });
25670       },
25671
25672
25673       move: function(loc) {
25674           return this.update({loc: loc});
25675       },
25676
25677
25678       isDegenerate: function() {
25679           return !(
25680               Array.isArray(this.loc) && this.loc.length === 2 &&
25681               this.loc[0] >= -180 && this.loc[0] <= 180 &&
25682               this.loc[1] >= -90 && this.loc[1] <= 90
25683           );
25684       },
25685
25686
25687       // Inspect tags and geometry to determine which direction(s) this node/vertex points
25688       directions: function(resolver, projection) {
25689           var val;
25690           var i;
25691
25692           // which tag to use?
25693           if (this.isHighwayIntersection(resolver) && (this.tags.stop || '').toLowerCase() === 'all') {
25694               // all-way stop tag on a highway intersection
25695               val = 'all';
25696           } else {
25697               // generic direction tag
25698               val = (this.tags.direction || '').toLowerCase();
25699
25700               // better suffix-style direction tag
25701               var re = /:direction$/i;
25702               var keys = Object.keys(this.tags);
25703               for (i = 0; i < keys.length; i++) {
25704                   if (re.test(keys[i])) {
25705                       val = this.tags[keys[i]].toLowerCase();
25706                       break;
25707                   }
25708               }
25709           }
25710
25711           if (val === '') return [];
25712
25713           var cardinal = {
25714               north: 0,               n: 0,
25715               northnortheast: 22,     nne: 22,
25716               northeast: 45,          ne: 45,
25717               eastnortheast: 67,      ene: 67,
25718               east: 90,               e: 90,
25719               eastsoutheast: 112,     ese: 112,
25720               southeast: 135,         se: 135,
25721               southsoutheast: 157,    sse: 157,
25722               south: 180,             s: 180,
25723               southsouthwest: 202,    ssw: 202,
25724               southwest: 225,         sw: 225,
25725               westsouthwest: 247,     wsw: 247,
25726               west: 270,              w: 270,
25727               westnorthwest: 292,     wnw: 292,
25728               northwest: 315,         nw: 315,
25729               northnorthwest: 337,    nnw: 337
25730           };
25731
25732
25733           var values = val.split(';');
25734           var results = [];
25735
25736           values.forEach(function(v) {
25737               // swap cardinal for numeric directions
25738               if (cardinal[v] !== undefined) {
25739                   v = cardinal[v];
25740               }
25741
25742               // numeric direction - just add to results
25743               if (v !== '' && !isNaN(+v)) {
25744                   results.push(+v);
25745                   return;
25746               }
25747
25748               // string direction - inspect parent ways
25749               var lookBackward =
25750                   (this.tags['traffic_sign:backward'] || v === 'backward' || v === 'both' || v === 'all');
25751               var lookForward =
25752                   (this.tags['traffic_sign:forward'] || v === 'forward' || v === 'both' || v === 'all');
25753
25754               if (!lookForward && !lookBackward) return;
25755
25756               var nodeIds = {};
25757               resolver.parentWays(this).forEach(function(parent) {
25758                   var nodes = parent.nodes;
25759                   for (i = 0; i < nodes.length; i++) {
25760                       if (nodes[i] === this.id) {  // match current entity
25761                           if (lookForward && i > 0) {
25762                               nodeIds[nodes[i - 1]] = true;  // look back to prev node
25763                           }
25764                           if (lookBackward && i < nodes.length - 1) {
25765                               nodeIds[nodes[i + 1]] = true;  // look ahead to next node
25766                           }
25767                       }
25768                   }
25769               }, this);
25770
25771               Object.keys(nodeIds).forEach(function(nodeId) {
25772                   // +90 because geoAngle returns angle from X axis, not Y (north)
25773                   results.push(
25774                       (geoAngle(this, resolver.entity(nodeId), projection) * (180 / Math.PI)) + 90
25775                   );
25776               }, this);
25777
25778           }, this);
25779
25780           return uniq(results);
25781       },
25782
25783
25784       isEndpoint: function(resolver) {
25785           return resolver.transient(this, 'isEndpoint', function() {
25786               var id = this.id;
25787               return resolver.parentWays(this).filter(function(parent) {
25788                   return !parent.isClosed() && !!parent.affix(id);
25789               }).length > 0;
25790           });
25791       },
25792
25793
25794       isConnected: function(resolver) {
25795           return resolver.transient(this, 'isConnected', function() {
25796               var parents = resolver.parentWays(this);
25797
25798               function isLine(entity) {
25799                   return entity.geometry(resolver) === 'line' &&
25800                       entity.hasInterestingTags();
25801               }
25802
25803               // vertex is connected to multiple parent lines
25804               if (parents.length > 1 && some(parents, isLine)) {
25805                   return true;
25806
25807               } else if (parents.length === 1) {
25808                   var way = parents[0],
25809                       nodes = way.nodes.slice();
25810                   if (way.isClosed()) { nodes.pop(); }  // ignore connecting node if closed
25811
25812                   // return true if vertex appears multiple times (way is self intersecting)
25813                   return nodes.indexOf(this.id) !== nodes.lastIndexOf(this.id);
25814               }
25815
25816               return false;
25817           });
25818       },
25819
25820
25821       isIntersection: function(resolver) {
25822           return resolver.transient(this, 'isIntersection', function() {
25823               return resolver.parentWays(this).filter(function(parent) {
25824                   return (parent.tags.highway ||
25825                       parent.tags.waterway ||
25826                       parent.tags.railway ||
25827                       parent.tags.aeroway) &&
25828                       parent.geometry(resolver) === 'line';
25829               }).length > 1;
25830           });
25831       },
25832
25833
25834       isHighwayIntersection: function(resolver) {
25835           return resolver.transient(this, 'isHighwayIntersection', function() {
25836               return resolver.parentWays(this).filter(function(parent) {
25837                   return parent.tags.highway && parent.geometry(resolver) === 'line';
25838               }).length > 1;
25839           });
25840       },
25841
25842
25843       isOnAddressLine: function(resolver) {
25844           return resolver.transient(this, 'isOnAddressLine', function() {
25845               return resolver.parentWays(this).filter(function(parent) {
25846                   return parent.tags.hasOwnProperty('addr:interpolation') &&
25847                       parent.geometry(resolver) === 'line';
25848               }).length > 0;
25849           });
25850       },
25851
25852
25853       asJXON: function(changeset_id) {
25854           var r = {
25855               node: {
25856                   '@id': this.osmId(),
25857                   '@lon': this.loc[0],
25858                   '@lat': this.loc[1],
25859                   '@version': (this.version || 0),
25860                   tag: map$3(this.tags, function(v, k) {
25861                       return { keyAttributes: { k: k, v: v } };
25862                   })
25863               }
25864           };
25865           if (changeset_id) r.node['@changeset'] = changeset_id;
25866           return r;
25867       },
25868
25869
25870       asGeoJSON: function() {
25871           return {
25872               type: 'Point',
25873               coordinates: this.loc
25874           };
25875       }
25876   });
25877
25878   function osmNote() {
25879       if (!(this instanceof osmNote)) {
25880           return (new osmNote()).initialize(arguments);
25881       } else if (arguments.length) {
25882           this.initialize(arguments);
25883       }
25884   }
25885
25886
25887   osmNote.id = function() {
25888       return osmNote.id.next--;
25889   };
25890
25891
25892   osmNote.id.next = -1;
25893
25894
25895   assignIn(osmNote.prototype, {
25896
25897       type: 'note',
25898
25899       initialize: function(sources) {
25900           for (var i = 0; i < sources.length; ++i) {
25901               var source = sources[i];
25902               for (var prop in source) {
25903                   if (Object.prototype.hasOwnProperty.call(source, prop)) {
25904                       if (source[prop] === undefined) {
25905                           delete this[prop];
25906                       } else {
25907                           this[prop] = source[prop];
25908                       }
25909                   }
25910               }
25911           }
25912
25913           if (!this.id) {
25914               this.id = osmNote.id() + '';  // as string
25915           }
25916
25917           return this;
25918       },
25919
25920       extent: function() {
25921           return new geoExtent$$1(this.loc);
25922       },
25923
25924       update: function(attrs) {
25925           return osmNote(this, attrs); // {v: 1 + (this.v || 0)}
25926       },
25927
25928       isNew: function() {
25929           return this.id < 0;
25930       },
25931
25932       move: function(loc) {
25933           return this.update({ loc: loc });
25934       }
25935
25936   });
25937
25938   /** Error message constants. */
25939   var FUNC_ERROR_TEXT$1 = 'Expected a function';
25940
25941   /**
25942    * Creates a function that negates the result of the predicate `func`. The
25943    * `func` predicate is invoked with the `this` binding and arguments of the
25944    * created function.
25945    *
25946    * @static
25947    * @memberOf _
25948    * @since 3.0.0
25949    * @category Function
25950    * @param {Function} predicate The predicate to negate.
25951    * @returns {Function} Returns the new negated function.
25952    * @example
25953    *
25954    * function isEven(n) {
25955    *   return n % 2 == 0;
25956    * }
25957    *
25958    * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));
25959    * // => [1, 3, 5]
25960    */
25961   function negate(predicate) {
25962     if (typeof predicate != 'function') {
25963       throw new TypeError(FUNC_ERROR_TEXT$1);
25964     }
25965     return function() {
25966       var args = arguments;
25967       switch (args.length) {
25968         case 0: return !predicate.call(this);
25969         case 1: return !predicate.call(this, args[0]);
25970         case 2: return !predicate.call(this, args[0], args[1]);
25971         case 3: return !predicate.call(this, args[0], args[1], args[2]);
25972       }
25973       return !predicate.apply(this, args);
25974     };
25975   }
25976
25977   /**
25978    * The opposite of `_.filter`; this method returns the elements of `collection`
25979    * that `predicate` does **not** return truthy for.
25980    *
25981    * @static
25982    * @memberOf _
25983    * @since 0.1.0
25984    * @category Collection
25985    * @param {Array|Object} collection The collection to iterate over.
25986    * @param {Function} [predicate=_.identity] The function invoked per iteration.
25987    * @returns {Array} Returns the new filtered array.
25988    * @see _.filter
25989    * @example
25990    *
25991    * var users = [
25992    *   { 'user': 'barney', 'age': 36, 'active': false },
25993    *   { 'user': 'fred',   'age': 40, 'active': true }
25994    * ];
25995    *
25996    * _.reject(users, function(o) { return !o.active; });
25997    * // => objects for ['fred']
25998    *
25999    * // The `_.matches` iteratee shorthand.
26000    * _.reject(users, { 'age': 40, 'active': true });
26001    * // => objects for ['barney']
26002    *
26003    * // The `_.matchesProperty` iteratee shorthand.
26004    * _.reject(users, ['active', false]);
26005    * // => objects for ['fred']
26006    *
26007    * // The `_.property` iteratee shorthand.
26008    * _.reject(users, 'active');
26009    * // => objects for ['barney']
26010    */
26011   function reject(collection, predicate) {
26012     var func = isArray(collection) ? arrayFilter : baseFilter;
26013     return func(collection, negate(baseIteratee(predicate, 3)));
26014   }
26015
26016   /*
26017   Order the nodes of a way in reverse order and reverse any direction dependent tags
26018   other than `oneway`. (We assume that correcting a backwards oneway is the primary
26019   reason for reversing a way.)
26020
26021   In addition, numeric-valued `incline` tags are negated.
26022
26023   The JOSM implementation was used as a guide, but transformations that were of unclear benefit
26024   or adjusted tags that don't seem to be used in practice were omitted.
26025
26026   References:
26027       http://wiki.openstreetmap.org/wiki/Forward_%26_backward,_left_%26_right
26028       http://wiki.openstreetmap.org/wiki/Key:direction#Steps
26029       http://wiki.openstreetmap.org/wiki/Key:incline
26030       http://wiki.openstreetmap.org/wiki/Route#Members
26031       http://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/corrector/ReverseWayTagCorrector.java
26032       http://wiki.openstreetmap.org/wiki/Tag:highway%3Dstop
26033       http://wiki.openstreetmap.org/wiki/Key:traffic_sign#On_a_way_or_area
26034   */
26035   function actionReverse(wayID, options) {
26036       var ignoreKey = /^.*(_|:)?(description|name|note|website|ref|source|comment|watch|attribution)(_|:)?/;
26037       var numeric = /^([+\-]?)(?=[\d.])/;
26038       var keyReplacements = [
26039           [/:right$/, ':left'],
26040           [/:left$/, ':right'],
26041           [/:forward$/, ':backward'],
26042           [/:backward$/, ':forward']
26043       ];
26044       var valueReplacements = {
26045           left: 'right',
26046           right: 'left',
26047           up: 'down',
26048           down: 'up',
26049           forward: 'backward',
26050           backward: 'forward',
26051           forwards: 'backward',
26052           backwards: 'forward',
26053       };
26054       var roleReplacements = {
26055           forward: 'backward',
26056           backward: 'forward',
26057           forwards: 'backward',
26058           backwards: 'forward'
26059       };
26060       var onewayReplacements = {
26061           yes: '-1',
26062           '1': '-1',
26063           '-1': 'yes'
26064       };
26065
26066
26067       function reverseKey(key) {
26068           for (var i = 0; i < keyReplacements.length; ++i) {
26069               var replacement = keyReplacements[i];
26070               if (replacement[0].test(key)) {
26071                   return key.replace(replacement[0], replacement[1]);
26072               }
26073           }
26074           return key;
26075       }
26076
26077
26078       function reverseValue(key, value) {
26079           if (ignoreKey.test(key)) return value;
26080
26081           if (key === 'incline' && numeric.test(value)) {
26082               return value.replace(numeric, function(_, sign) { return sign === '-' ? '' : '-'; });
26083           } else if (options && options.reverseOneway && key === 'oneway') {
26084               return onewayReplacements[value] || value;
26085           } else {
26086               return valueReplacements[value] || value;
26087           }
26088       }
26089
26090
26091       // Reverse the direction of tags attached to the nodes - #3076
26092       function reverseNodeTags(graph, nodeIDs) {
26093           for (var i = 0; i < nodeIDs.length; i++) {
26094               var node = graph.hasEntity(nodeIDs[i]);
26095               if (!node || !Object.keys(node.tags).length) continue;
26096
26097               var tags = {};
26098               for (var key in node.tags) {
26099                   tags[reverseKey(key)] = reverseValue(key, node.tags[key]);
26100               }
26101               graph = graph.replace(node.update({tags: tags}));
26102           }
26103           return graph;
26104       }
26105
26106
26107       return function(graph) {
26108           var way = graph.entity(wayID);
26109           var nodes = way.nodes.slice().reverse();
26110           var tags = {};
26111           var role;
26112
26113           for (var key in way.tags) {
26114               tags[reverseKey(key)] = reverseValue(key, way.tags[key]);
26115           }
26116
26117           graph.parentRelations(way).forEach(function(relation) {
26118               relation.members.forEach(function(member, index) {
26119                   if (member.id === way.id && (role = roleReplacements[member.role])) {
26120                       relation = relation.updateMember({role: role}, index);
26121                       graph = graph.replace(relation);
26122                   }
26123               });
26124           });
26125
26126           // Reverse any associated directions on nodes on the way and then replace
26127           // the way itself with the reversed node ids and updated way tags
26128           return reverseNodeTags(graph, nodes)
26129               .replace(way.update({nodes: nodes, tags: tags}));
26130       };
26131   }
26132
26133   /** `Object#toString` result references. */
26134   var numberTag$4 = '[object Number]';
26135
26136   /**
26137    * Checks if `value` is classified as a `Number` primitive or object.
26138    *
26139    * **Note:** To exclude `Infinity`, `-Infinity`, and `NaN`, which are
26140    * classified as numbers, use the `_.isFinite` method.
26141    *
26142    * @static
26143    * @memberOf _
26144    * @since 0.1.0
26145    * @category Lang
26146    * @param {*} value The value to check.
26147    * @returns {boolean} Returns `true` if `value` is a number, else `false`.
26148    * @example
26149    *
26150    * _.isNumber(3);
26151    * // => true
26152    *
26153    * _.isNumber(Number.MIN_VALUE);
26154    * // => true
26155    *
26156    * _.isNumber(Infinity);
26157    * // => true
26158    *
26159    * _.isNumber('3');
26160    * // => false
26161    */
26162   function isNumber(value) {
26163     return typeof value == 'number' ||
26164       (isObjectLike(value) && baseGetTag(value) == numberTag$4);
26165   }
26166
26167   /** `Object#toString` result references. */
26168   var stringTag$4 = '[object String]';
26169
26170   /**
26171    * Checks if `value` is classified as a `String` primitive or object.
26172    *
26173    * @static
26174    * @since 0.1.0
26175    * @memberOf _
26176    * @category Lang
26177    * @param {*} value The value to check.
26178    * @returns {boolean} Returns `true` if `value` is a string, else `false`.
26179    * @example
26180    *
26181    * _.isString('abc');
26182    * // => true
26183    *
26184    * _.isString(1);
26185    * // => false
26186    */
26187   function isString(value) {
26188     return typeof value == 'string' ||
26189       (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag$4);
26190   }
26191
26192   /**
26193    * Checks if `value` is `NaN`.
26194    *
26195    * **Note:** This method is based on
26196    * [`Number.isNaN`](https://mdn.io/Number/isNaN) and is not the same as
26197    * global [`isNaN`](https://mdn.io/isNaN) which returns `true` for
26198    * `undefined` and other non-number values.
26199    *
26200    * @static
26201    * @memberOf _
26202    * @since 0.1.0
26203    * @category Lang
26204    * @param {*} value The value to check.
26205    * @returns {boolean} Returns `true` if `value` is `NaN`, else `false`.
26206    * @example
26207    *
26208    * _.isNaN(NaN);
26209    * // => true
26210    *
26211    * _.isNaN(new Number(NaN));
26212    * // => true
26213    *
26214    * isNaN(undefined);
26215    * // => true
26216    *
26217    * _.isNaN(undefined);
26218    * // => false
26219    */
26220   function isNaN$1(value) {
26221     // An `NaN` primitive is the only value that is not equal to itself.
26222     // Perform the `toStringTag` check first to avoid errors with some
26223     // ActiveX objects in IE.
26224     return isNumber(value) && value != +value;
26225   }
26226
26227   function osmLanes(entity) {
26228       if (entity.type !== 'way') return null;
26229       if (!entity.tags.highway) return null;
26230
26231       var tags = entity.tags;
26232       var isOneWay = entity.isOneWay();
26233       var laneCount = getLaneCount(tags, isOneWay);
26234       var maxspeed = parseMaxspeed(tags);
26235
26236       var laneDirections = parseLaneDirections(tags, isOneWay, laneCount);
26237       var forward = laneDirections.forward;
26238       var backward = laneDirections.backward;
26239       var bothways = laneDirections.bothways;
26240
26241       // parse the piped string 'x|y|z' format
26242       var turnLanes = {};
26243       turnLanes.unspecified = parseTurnLanes(tags['turn:lanes']);
26244       turnLanes.forward = parseTurnLanes(tags['turn:lanes:forward']);
26245       turnLanes.backward = parseTurnLanes(tags['turn:lanes:backward']);
26246
26247       var maxspeedLanes = {};
26248       maxspeedLanes.unspecified = parseMaxspeedLanes(tags['maxspeed:lanes'], maxspeed);
26249       maxspeedLanes.forward = parseMaxspeedLanes(tags['maxspeed:lanes:forward'], maxspeed);
26250       maxspeedLanes.backward = parseMaxspeedLanes(tags['maxspeed:lanes:backward'], maxspeed);
26251
26252       var psvLanes = {};
26253       psvLanes.unspecified = parseMiscLanes(tags['psv:lanes']);
26254       psvLanes.forward = parseMiscLanes(tags['psv:lanes:forward']);
26255       psvLanes.backward = parseMiscLanes(tags['psv:lanes:backward']);
26256
26257       var busLanes = {};
26258       busLanes.unspecified = parseMiscLanes(tags['bus:lanes']);
26259       busLanes.forward = parseMiscLanes(tags['bus:lanes:forward']);
26260       busLanes.backward = parseMiscLanes(tags['bus:lanes:backward']);
26261
26262       var taxiLanes = {};
26263       taxiLanes.unspecified = parseMiscLanes(tags['taxi:lanes']);
26264       taxiLanes.forward = parseMiscLanes(tags['taxi:lanes:forward']);
26265       taxiLanes.backward = parseMiscLanes(tags['taxi:lanes:backward']);
26266
26267       var hovLanes = {};
26268       hovLanes.unspecified = parseMiscLanes(tags['hov:lanes']);
26269       hovLanes.forward = parseMiscLanes(tags['hov:lanes:forward']);
26270       hovLanes.backward = parseMiscLanes(tags['hov:lanes:backward']);
26271
26272       var hgvLanes = {};
26273       hgvLanes.unspecified = parseMiscLanes(tags['hgv:lanes']);
26274       hgvLanes.forward = parseMiscLanes(tags['hgv:lanes:forward']);
26275       hgvLanes.backward = parseMiscLanes(tags['hgv:lanes:backward']);
26276
26277       var bicyclewayLanes = {};
26278       bicyclewayLanes.unspecified = parseBicycleWay(tags['bicycleway:lanes']);
26279       bicyclewayLanes.forward = parseBicycleWay(tags['bicycleway:lanes:forward']);
26280       bicyclewayLanes.backward = parseBicycleWay(tags['bicycleway:lanes:backward']);
26281
26282       var lanesObj = {
26283           forward: [],
26284           backward: [],
26285           unspecified: []
26286       };
26287
26288       // map forward/backward/unspecified of each lane type to lanesObj
26289       mapToLanesObj(lanesObj, turnLanes, 'turnLane');
26290       mapToLanesObj(lanesObj, maxspeedLanes, 'maxspeed');
26291       mapToLanesObj(lanesObj, psvLanes, 'psv');
26292       mapToLanesObj(lanesObj, busLanes, 'bus');
26293       mapToLanesObj(lanesObj, taxiLanes, 'taxi');
26294       mapToLanesObj(lanesObj, hovLanes, 'hov');
26295       mapToLanesObj(lanesObj, hgvLanes, 'hgv');
26296       mapToLanesObj(lanesObj, bicyclewayLanes, 'bicycleway');
26297
26298       return {
26299           metadata: {
26300               count: laneCount,
26301               oneway: isOneWay,
26302               forward: forward,
26303               backward: backward,
26304               bothways: bothways,
26305               turnLanes: turnLanes,
26306               maxspeed: maxspeed,
26307               maxspeedLanes: maxspeedLanes,
26308               psvLanes: psvLanes,
26309               busLanes: busLanes,
26310               taxiLanes: taxiLanes,
26311               hovLanes: hovLanes,
26312               hgvLanes: hgvLanes,
26313               bicyclewayLanes: bicyclewayLanes
26314           },
26315           lanes: lanesObj
26316       };
26317   }
26318
26319
26320   function getLaneCount(tags, isOneWay) {
26321       var count;
26322       if (tags.lanes) {
26323           count = parseInt(tags.lanes, 10);
26324           if (count > 0) {
26325               return count;
26326           }
26327       }
26328
26329
26330       switch (tags.highway) {
26331           case 'trunk':
26332           case 'motorway':
26333               count = isOneWay ? 2 : 4;
26334               break;
26335           default:
26336               count = isOneWay ? 1 : 2;
26337               break;
26338       }
26339
26340       return count;
26341   }
26342
26343
26344   function parseMaxspeed(tags) {
26345       var maxspeed = tags.maxspeed;
26346       if (isNumber(maxspeed)) return maxspeed;
26347       if (isString(maxspeed)) {
26348           maxspeed = maxspeed.match(/^([0-9][\.0-9]+?)(?:[ ]?(?:km\/h|kmh|kph|mph|knots))?$/g);
26349           if (!maxspeed) return;
26350           return parseInt(maxspeed, 10);
26351       }
26352   }
26353
26354
26355   function parseLaneDirections(tags, isOneWay, laneCount) {
26356       var forward = parseInt(tags['lanes:forward'], 10);
26357       var backward = parseInt(tags['lanes:backward'], 10);
26358       var bothways = parseInt(tags['lanes:both_ways'], 10) > 0 ? 1 : 0;
26359
26360       if (parseInt(tags.oneway, 10) === -1) {
26361           forward = 0;
26362           bothways = 0;
26363           backward = laneCount;
26364       }
26365       else if (isOneWay) {
26366           forward = laneCount;
26367           bothways = 0;
26368           backward = 0;
26369       }
26370       else if (isNaN$1(forward) && isNaN$1(backward)) {
26371           backward = Math.floor((laneCount - bothways) / 2);
26372           forward = laneCount - bothways - backward;
26373       }
26374       else if (isNaN$1(forward)) {
26375           if (backward > laneCount - bothways) {
26376               backward = laneCount - bothways;
26377           }
26378           forward = laneCount - bothways - backward;
26379       }
26380       else if (isNaN$1(backward)) {
26381           if (forward > laneCount - bothways) {
26382               forward = laneCount - bothways;
26383           }
26384           backward = laneCount - bothways - forward;
26385       }
26386       return {
26387           forward: forward,
26388           backward: backward,
26389           bothways: bothways
26390       };
26391   }
26392
26393
26394   function parseTurnLanes(tag){
26395       if (!tag) return;
26396
26397       var validValues = [
26398           'left', 'slight_left', 'sharp_left', 'through', 'right', 'slight_right',
26399           'sharp_right', 'reverse', 'merge_to_left', 'merge_to_right', 'none'
26400       ];
26401
26402       return tag.split('|')
26403           .map(function (s) {
26404               if (s === '') s = 'none';
26405               return s.split(';')
26406                   .map(function (d) {
26407                       return validValues.indexOf(d) === -1 ? 'unknown': d;
26408                   });
26409           });
26410   }
26411
26412
26413   function parseMaxspeedLanes(tag, maxspeed) {
26414       if (!tag) return;
26415
26416       return tag.split('|')
26417           .map(function (s) {
26418               if (s === 'none') return s;
26419               var m = parseInt(s, 10);
26420               if (s === '' || m === maxspeed) return null;
26421               return isNaN$1(m) ? 'unknown': m;
26422           });
26423   }
26424
26425
26426   function parseMiscLanes(tag) {
26427       if (!tag) return;
26428
26429       var validValues = [
26430           'yes', 'no', 'designated'
26431       ];
26432
26433       return tag.split('|')
26434           .map(function (s) {
26435               if (s === '') s = 'no';
26436               return validValues.indexOf(s) === -1 ? 'unknown': s;
26437           });
26438   }
26439
26440
26441   function parseBicycleWay(tag) {
26442       if (!tag) return;
26443
26444       var validValues = [
26445           'yes', 'no', 'designated', 'lane'
26446       ];
26447
26448       return tag.split('|')
26449           .map(function (s) {
26450               if (s === '') s = 'no';
26451               return validValues.indexOf(s) === -1 ? 'unknown': s;
26452           });
26453   }
26454
26455
26456   function mapToLanesObj(lanesObj, data, key) {
26457       if (data.forward) data.forward.forEach(function(l, i) {
26458           if (!lanesObj.forward[i]) lanesObj.forward[i] = {};
26459           lanesObj.forward[i][key] = l;
26460       });
26461       if (data.backward) data.backward.forEach(function(l, i) {
26462           if (!lanesObj.backward[i]) lanesObj.backward[i] = {};
26463           lanesObj.backward[i][key] = l;
26464       });
26465       if (data.unspecified) data.unspecified.forEach(function(l, i) {
26466           if (!lanesObj.unspecified[i]) lanesObj.unspecified[i] = {};
26467           lanesObj.unspecified[i][key] = l;
26468       });
26469   }
26470
26471   /** Used to compose bitmasks for cloning. */
26472   var CLONE_DEEP_FLAG$2 = 1,
26473       CLONE_SYMBOLS_FLAG$3 = 4;
26474
26475   /**
26476    * This method is like `_.clone` except that it recursively clones `value`.
26477    *
26478    * @static
26479    * @memberOf _
26480    * @since 1.0.0
26481    * @category Lang
26482    * @param {*} value The value to recursively clone.
26483    * @returns {*} Returns the deep cloned value.
26484    * @see _.clone
26485    * @example
26486    *
26487    * var objects = [{ 'a': 1 }, { 'b': 2 }];
26488    *
26489    * var deep = _.cloneDeep(objects);
26490    * console.log(deep[0] === objects[0]);
26491    * // => false
26492    */
26493   function cloneDeep(value) {
26494     return baseClone(value, CLONE_DEEP_FLAG$2 | CLONE_SYMBOLS_FLAG$3);
26495   }
26496
26497   /**
26498    * Gets the timestamp of the number of milliseconds that have elapsed since
26499    * the Unix epoch (1 January 1970 00:00:00 UTC).
26500    *
26501    * @static
26502    * @memberOf _
26503    * @since 2.4.0
26504    * @category Date
26505    * @returns {number} Returns the timestamp.
26506    * @example
26507    *
26508    * _.defer(function(stamp) {
26509    *   console.log(_.now() - stamp);
26510    * }, _.now());
26511    * // => Logs the number of milliseconds it took for the deferred invocation.
26512    */
26513   var now$1 = function() {
26514     return root$2.Date.now();
26515   };
26516
26517   /** Error message constants. */
26518   var FUNC_ERROR_TEXT$2 = 'Expected a function';
26519
26520   /* Built-in method references for those with the same name as other `lodash` methods. */
26521   var nativeMax$2 = Math.max,
26522       nativeMin = Math.min;
26523
26524   /**
26525    * Creates a debounced function that delays invoking `func` until after `wait`
26526    * milliseconds have elapsed since the last time the debounced function was
26527    * invoked. The debounced function comes with a `cancel` method to cancel
26528    * delayed `func` invocations and a `flush` method to immediately invoke them.
26529    * Provide `options` to indicate whether `func` should be invoked on the
26530    * leading and/or trailing edge of the `wait` timeout. The `func` is invoked
26531    * with the last arguments provided to the debounced function. Subsequent
26532    * calls to the debounced function return the result of the last `func`
26533    * invocation.
26534    *
26535    * **Note:** If `leading` and `trailing` options are `true`, `func` is
26536    * invoked on the trailing edge of the timeout only if the debounced function
26537    * is invoked more than once during the `wait` timeout.
26538    *
26539    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
26540    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
26541    *
26542    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
26543    * for details over the differences between `_.debounce` and `_.throttle`.
26544    *
26545    * @static
26546    * @memberOf _
26547    * @since 0.1.0
26548    * @category Function
26549    * @param {Function} func The function to debounce.
26550    * @param {number} [wait=0] The number of milliseconds to delay.
26551    * @param {Object} [options={}] The options object.
26552    * @param {boolean} [options.leading=false]
26553    *  Specify invoking on the leading edge of the timeout.
26554    * @param {number} [options.maxWait]
26555    *  The maximum time `func` is allowed to be delayed before it's invoked.
26556    * @param {boolean} [options.trailing=true]
26557    *  Specify invoking on the trailing edge of the timeout.
26558    * @returns {Function} Returns the new debounced function.
26559    * @example
26560    *
26561    * // Avoid costly calculations while the window size is in flux.
26562    * jQuery(window).on('resize', _.debounce(calculateLayout, 150));
26563    *
26564    * // Invoke `sendMail` when clicked, debouncing subsequent calls.
26565    * jQuery(element).on('click', _.debounce(sendMail, 300, {
26566    *   'leading': true,
26567    *   'trailing': false
26568    * }));
26569    *
26570    * // Ensure `batchLog` is invoked once after 1 second of debounced calls.
26571    * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });
26572    * var source = new EventSource('/stream');
26573    * jQuery(source).on('message', debounced);
26574    *
26575    * // Cancel the trailing debounced invocation.
26576    * jQuery(window).on('popstate', debounced.cancel);
26577    */
26578   function debounce(func, wait, options) {
26579     var lastArgs,
26580         lastThis,
26581         maxWait,
26582         result,
26583         timerId,
26584         lastCallTime,
26585         lastInvokeTime = 0,
26586         leading = false,
26587         maxing = false,
26588         trailing = true;
26589
26590     if (typeof func != 'function') {
26591       throw new TypeError(FUNC_ERROR_TEXT$2);
26592     }
26593     wait = toNumber(wait) || 0;
26594     if (isObject(options)) {
26595       leading = !!options.leading;
26596       maxing = 'maxWait' in options;
26597       maxWait = maxing ? nativeMax$2(toNumber(options.maxWait) || 0, wait) : maxWait;
26598       trailing = 'trailing' in options ? !!options.trailing : trailing;
26599     }
26600
26601     function invokeFunc(time) {
26602       var args = lastArgs,
26603           thisArg = lastThis;
26604
26605       lastArgs = lastThis = undefined;
26606       lastInvokeTime = time;
26607       result = func.apply(thisArg, args);
26608       return result;
26609     }
26610
26611     function leadingEdge(time) {
26612       // Reset any `maxWait` timer.
26613       lastInvokeTime = time;
26614       // Start the timer for the trailing edge.
26615       timerId = setTimeout(timerExpired, wait);
26616       // Invoke the leading edge.
26617       return leading ? invokeFunc(time) : result;
26618     }
26619
26620     function remainingWait(time) {
26621       var timeSinceLastCall = time - lastCallTime,
26622           timeSinceLastInvoke = time - lastInvokeTime,
26623           timeWaiting = wait - timeSinceLastCall;
26624
26625       return maxing
26626         ? nativeMin(timeWaiting, maxWait - timeSinceLastInvoke)
26627         : timeWaiting;
26628     }
26629
26630     function shouldInvoke(time) {
26631       var timeSinceLastCall = time - lastCallTime,
26632           timeSinceLastInvoke = time - lastInvokeTime;
26633
26634       // Either this is the first call, activity has stopped and we're at the
26635       // trailing edge, the system time has gone backwards and we're treating
26636       // it as the trailing edge, or we've hit the `maxWait` limit.
26637       return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||
26638         (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));
26639     }
26640
26641     function timerExpired() {
26642       var time = now$1();
26643       if (shouldInvoke(time)) {
26644         return trailingEdge(time);
26645       }
26646       // Restart the timer.
26647       timerId = setTimeout(timerExpired, remainingWait(time));
26648     }
26649
26650     function trailingEdge(time) {
26651       timerId = undefined;
26652
26653       // Only invoke if we have `lastArgs` which means `func` has been
26654       // debounced at least once.
26655       if (trailing && lastArgs) {
26656         return invokeFunc(time);
26657       }
26658       lastArgs = lastThis = undefined;
26659       return result;
26660     }
26661
26662     function cancel() {
26663       if (timerId !== undefined) {
26664         clearTimeout(timerId);
26665       }
26666       lastInvokeTime = 0;
26667       lastArgs = lastCallTime = lastThis = timerId = undefined;
26668     }
26669
26670     function flush() {
26671       return timerId === undefined ? result : trailingEdge(now$1());
26672     }
26673
26674     function debounced() {
26675       var time = now$1(),
26676           isInvoking = shouldInvoke(time);
26677
26678       lastArgs = arguments;
26679       lastThis = this;
26680       lastCallTime = time;
26681
26682       if (isInvoking) {
26683         if (timerId === undefined) {
26684           return leadingEdge(lastCallTime);
26685         }
26686         if (maxing) {
26687           // Handle invocations in a tight loop.
26688           timerId = setTimeout(timerExpired, wait);
26689           return invokeFunc(lastCallTime);
26690         }
26691       }
26692       if (timerId === undefined) {
26693         timerId = setTimeout(timerExpired, wait);
26694       }
26695       return result;
26696     }
26697     debounced.cancel = cancel;
26698     debounced.flush = flush;
26699     return debounced;
26700   }
26701
26702   /**
26703    * Casts `value` to `identity` if it's not a function.
26704    *
26705    * @private
26706    * @param {*} value The value to inspect.
26707    * @returns {Function} Returns cast function.
26708    */
26709   function castFunction(value) {
26710     return typeof value == 'function' ? value : identity$8;
26711   }
26712
26713   /**
26714    * Iterates over elements of `collection` and invokes `iteratee` for each element.
26715    * The iteratee is invoked with three arguments: (value, index|key, collection).
26716    * Iteratee functions may exit iteration early by explicitly returning `false`.
26717    *
26718    * **Note:** As with other "Collections" methods, objects with a "length"
26719    * property are iterated like arrays. To avoid this behavior use `_.forIn`
26720    * or `_.forOwn` for object iteration.
26721    *
26722    * @static
26723    * @memberOf _
26724    * @since 0.1.0
26725    * @alias each
26726    * @category Collection
26727    * @param {Array|Object} collection The collection to iterate over.
26728    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26729    * @returns {Array|Object} Returns `collection`.
26730    * @see _.forEachRight
26731    * @example
26732    *
26733    * _.forEach([1, 2], function(value) {
26734    *   console.log(value);
26735    * });
26736    * // => Logs `1` then `2`.
26737    *
26738    * _.forEach({ 'a': 1, 'b': 2 }, function(value, key) {
26739    *   console.log(key);
26740    * });
26741    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26742    */
26743   function forEach(collection, iteratee) {
26744     var func = isArray(collection) ? arrayEach : baseEach;
26745     return func(collection, castFunction(iteratee));
26746   }
26747
26748   /**
26749    * Iterates over own enumerable string keyed properties of an object and
26750    * invokes `iteratee` for each property. The iteratee is invoked with three
26751    * arguments: (value, key, object). Iteratee functions may exit iteration
26752    * early by explicitly returning `false`.
26753    *
26754    * @static
26755    * @memberOf _
26756    * @since 0.3.0
26757    * @category Object
26758    * @param {Object} object The object to iterate over.
26759    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
26760    * @returns {Object} Returns `object`.
26761    * @see _.forOwnRight
26762    * @example
26763    *
26764    * function Foo() {
26765    *   this.a = 1;
26766    *   this.b = 2;
26767    * }
26768    *
26769    * Foo.prototype.c = 3;
26770    *
26771    * _.forOwn(new Foo, function(value, key) {
26772    *   console.log(key);
26773    * });
26774    * // => Logs 'a' then 'b' (iteration order is not guaranteed).
26775    */
26776   function forOwn(object, iteratee) {
26777     return object && baseForOwn(object, castFunction(iteratee));
26778   }
26779
26780   var translations = Object.create(null);
26781
26782   var currentLocale = 'en';
26783   var textDirection = 'ltr';
26784
26785   function setLocale(_) {
26786       if (translations[_] !== undefined) {
26787           currentLocale = _;
26788       } else if (translations[_.split('-')[0]]) {
26789           currentLocale = _.split('-')[0];
26790       }
26791   }
26792
26793   function addTranslation(id, value) {
26794       translations[id] = value;
26795   }
26796
26797   /**
26798    * Given a string identifier, try to find that string in the current
26799    * language, and return it.  This function will be called recursively
26800    * with locale `en` if a string can not be found in the requested language.
26801    *
26802    * @param {string}   s   string identifier
26803    * @param {object?}  o   object of token replacements and default string
26804    * @param {string?}  loc locale to use
26805    * @returns {string?} locale string
26806    */
26807   function t(s, o, loc) {
26808       loc = loc || currentLocale;
26809
26810       var path = s
26811           .split('.')
26812           .map(function (s) { return s.replace('<TX_DOT>', '.'); })
26813           .reverse();
26814
26815       var rep = translations[loc];
26816
26817       while (rep !== undefined && path.length) {
26818           rep = rep[path.pop()];
26819       }
26820
26821       if (rep !== undefined) {
26822           if (o) {
26823               for (var k in o) {
26824                   rep = rep.replace('{' + k + '}', o[k]);
26825               }
26826           }
26827           return rep;
26828       }
26829
26830       if (loc !== 'en') {
26831           return t(s, o, 'en');
26832       }
26833
26834       if (o && 'default' in o) {
26835           return o.default;
26836       }
26837
26838       var missing = 'Missing ' + loc + ' translation: ' + s;
26839       if (typeof console !== 'undefined') console.error(missing); // eslint-disable-line
26840
26841       return missing;
26842   }
26843
26844   /**
26845    * Given string 'ltr' or 'rtl', save that setting
26846    *
26847    * @param {string} dir ltr or rtl
26848    */
26849
26850   function setTextDirection(dir) {
26851       textDirection = dir;
26852   }
26853
26854   /** Used to compose bitmasks for cloning. */
26855   var CLONE_DEEP_FLAG$3 = 1,
26856       CLONE_SYMBOLS_FLAG$4 = 4;
26857
26858   /**
26859    * This method is like `_.cloneWith` except that it recursively clones `value`.
26860    *
26861    * @static
26862    * @memberOf _
26863    * @since 4.0.0
26864    * @category Lang
26865    * @param {*} value The value to recursively clone.
26866    * @param {Function} [customizer] The function to customize cloning.
26867    * @returns {*} Returns the deep cloned value.
26868    * @see _.cloneWith
26869    * @example
26870    *
26871    * function customizer(value) {
26872    *   if (_.isElement(value)) {
26873    *     return value.cloneNode(true);
26874    *   }
26875    * }
26876    *
26877    * var el = _.cloneDeepWith(document.body, customizer);
26878    *
26879    * console.log(el === document.body);
26880    * // => false
26881    * console.log(el.nodeName);
26882    * // => 'BODY'
26883    * console.log(el.childNodes.length);
26884    * // => 20
26885    */
26886   function cloneDeepWith(value, customizer) {
26887     customizer = typeof customizer == 'function' ? customizer : undefined;
26888     return baseClone(value, CLONE_DEEP_FLAG$3 | CLONE_SYMBOLS_FLAG$4, customizer);
26889   }
26890
26891   /**
26892    * Creates an array of `array` values not included in the other given arrays
26893    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
26894    * for equality comparisons. The order and references of result values are
26895    * determined by the first array.
26896    *
26897    * **Note:** Unlike `_.pullAll`, this method returns a new array.
26898    *
26899    * @static
26900    * @memberOf _
26901    * @since 0.1.0
26902    * @category Array
26903    * @param {Array} array The array to inspect.
26904    * @param {...Array} [values] The values to exclude.
26905    * @returns {Array} Returns the new array of filtered values.
26906    * @see _.without, _.xor
26907    * @example
26908    *
26909    * _.difference([2, 1], [2, 3]);
26910    * // => [1]
26911    */
26912   var difference = baseRest(function(array, values) {
26913     return isArrayLikeObject(array)
26914       ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))
26915       : [];
26916   });
26917
26918   /** `Object#toString` result references. */
26919   var mapTag$7 = '[object Map]',
26920       setTag$7 = '[object Set]';
26921
26922   /** Used for built-in method references. */
26923   var objectProto$h = Object.prototype;
26924
26925   /** Used to check objects for own properties. */
26926   var hasOwnProperty$e = objectProto$h.hasOwnProperty;
26927
26928   /**
26929    * Checks if `value` is an empty object, collection, map, or set.
26930    *
26931    * Objects are considered empty if they have no own enumerable string keyed
26932    * properties.
26933    *
26934    * Array-like values such as `arguments` objects, arrays, buffers, strings, or
26935    * jQuery-like collections are considered empty if they have a `length` of `0`.
26936    * Similarly, maps and sets are considered empty if they have a `size` of `0`.
26937    *
26938    * @static
26939    * @memberOf _
26940    * @since 0.1.0
26941    * @category Lang
26942    * @param {*} value The value to check.
26943    * @returns {boolean} Returns `true` if `value` is empty, else `false`.
26944    * @example
26945    *
26946    * _.isEmpty(null);
26947    * // => true
26948    *
26949    * _.isEmpty(true);
26950    * // => true
26951    *
26952    * _.isEmpty(1);
26953    * // => true
26954    *
26955    * _.isEmpty([1, 2, 3]);
26956    * // => false
26957    *
26958    * _.isEmpty({ 'a': 1 });
26959    * // => false
26960    */
26961   function isEmpty(value) {
26962     if (value == null) {
26963       return true;
26964     }
26965     if (isArrayLike(value) &&
26966         (isArray(value) || typeof value == 'string' || typeof value.splice == 'function' ||
26967           isBuffer(value) || isTypedArray(value) || isArguments(value))) {
26968       return !value.length;
26969     }
26970     var tag = getTag$1(value);
26971     if (tag == mapTag$7 || tag == setTag$7) {
26972       return !value.size;
26973     }
26974     if (isPrototype(value)) {
26975       return !baseKeys(value).length;
26976     }
26977     for (var key in value) {
26978       if (hasOwnProperty$e.call(value, key)) {
26979         return false;
26980       }
26981     }
26982     return true;
26983   }
26984
26985   var detected;
26986
26987   function utilDetect(force) {
26988       if (detected && !force) return detected;
26989       detected = {};
26990
26991       var ua = navigator.userAgent,
26992           m = null;
26993
26994       m = ua.match(/(edge)\/?\s*(\.?\d+(\.\d+)*)/i);   // Edge
26995       if (m !== null) {
26996           detected.browser = m[1];
26997           detected.version = m[2];
26998       }
26999       if (!detected.browser) {
27000           m = ua.match(/Trident\/.*rv:([0-9]{1,}[\.0-9]{0,})/i);   // IE11
27001           if (m !== null) {
27002               detected.browser = 'msie';
27003               detected.version = m[1];
27004           }
27005       }
27006       if (!detected.browser) {
27007           m = ua.match(/(opr)\/?\s*(\.?\d+(\.\d+)*)/i);   // Opera 15+
27008           if (m !== null) {
27009               detected.browser = 'Opera';
27010               detected.version = m[2];
27011           }
27012       }
27013       if (!detected.browser) {
27014           m = ua.match(/(opera|chrome|safari|firefox|msie)\/?\s*(\.?\d+(\.\d+)*)/i);
27015           if (m !== null) {
27016               detected.browser = m[1];
27017               detected.version = m[2];
27018               m = ua.match(/version\/([\.\d]+)/i);
27019               if (m !== null) detected.version = m[1];
27020           }
27021       }
27022       if (!detected.browser) {
27023           detected.browser = navigator.appName;
27024           detected.version = navigator.appVersion;
27025       }
27026
27027       // keep major.minor version only..
27028       detected.version = detected.version.split(/\W/).slice(0,2).join('.');
27029
27030       if (detected.browser.toLowerCase() === 'msie') {
27031           detected.ie = true;
27032           detected.browser = 'Internet Explorer';
27033           detected.support = parseFloat(detected.version) >= 11;
27034       } else {
27035           detected.ie = false;
27036           detected.support = true;
27037       }
27038
27039       // Added due to incomplete svg style support. See #715
27040       detected.opera = (detected.browser.toLowerCase() === 'opera' && parseFloat(detected.version) < 15 );
27041
27042       detected.locale = (navigator.language || navigator.userLanguage || 'en-US');
27043       detected.language = detected.locale.split('-')[0];
27044
27045       // Search `navigator.languages` for a better locale.. Prefer the first language,
27046       // unless the second language is a culture-specific version of the first one, see #3842
27047       if (navigator.languages && navigator.languages.length > 0) {
27048           var code0 = navigator.languages[0],
27049               parts0 = code0.split('-');
27050
27051           detected.locale = code0;
27052           detected.language = parts0[0];
27053
27054           if (navigator.languages.length > 1 && parts0.length === 1) {
27055               var code1 = navigator.languages[1],
27056                   parts1 = code1.split('-');
27057
27058               if (parts1[0] === parts0[0]) {
27059                   detected.locale = code1;
27060               }
27061           }
27062       }
27063
27064       // Loaded locale is stored in currentLocale
27065       // return that instead (except in the situation where 'en' might override 'en-US')
27066       var loadedLocale = currentLocale || 'en';
27067       if (loadedLocale !== 'en') {
27068           detected.locale = loadedLocale;
27069           detected.language = detected.locale.split('-')[0];
27070       }
27071
27072       // detect text direction
27073       var q = utilStringQs(window.location.hash.substring(1));
27074       var lang = dataLocales[detected.locale];
27075       if ((lang && lang.rtl) || (q.rtl === 'true')) {
27076           detected.textDirection = 'rtl';
27077       } else {
27078           detected.textDirection = 'ltr';
27079       }
27080       setTextDirection(detected.textDirection);
27081
27082       // detect host
27083       var loc = window.top.location;
27084       var origin = loc.origin;
27085       if (!origin) {  // for unpatched IE11
27086           origin = loc.protocol + '//' + loc.hostname + (loc.port ? ':' + loc.port: '');
27087       }
27088
27089       detected.host = origin + loc.pathname;
27090
27091       detected.filedrop = (window.FileReader && 'ondrop' in window);
27092
27093       detected.download = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27094
27095       detected.cssfilters = !(detected.ie || detected.browser.toLowerCase() === 'edge');
27096
27097       function nav(x) {
27098           return navigator.userAgent.indexOf(x) !== -1;
27099       }
27100
27101       if (nav('Win')) {
27102           detected.os = 'win';
27103           detected.platform = 'Windows';
27104       }
27105       else if (nav('Mac')) {
27106           detected.os = 'mac';
27107           detected.platform = 'Macintosh';
27108       }
27109       else if (nav('X11') || nav('Linux')) {
27110           detected.os = 'linux';
27111           detected.platform = 'Linux';
27112       }
27113       else {
27114           detected.os = 'win';
27115           detected.platform = 'Unknown';
27116       }
27117
27118       return detected;
27119   }
27120
27121   var remove$1 = removeDiacritics;
27122
27123   var replacementList = [
27124     {
27125       base: ' ',
27126       chars: "\u00A0",
27127     }, {
27128       base: '0',
27129       chars: "\u07C0",
27130     }, {
27131       base: 'A',
27132       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",
27133     }, {
27134       base: 'AA',
27135       chars: "\uA732",
27136     }, {
27137       base: 'AE',
27138       chars: "\u00C6\u01FC\u01E2",
27139     }, {
27140       base: 'AO',
27141       chars: "\uA734",
27142     }, {
27143       base: 'AU',
27144       chars: "\uA736",
27145     }, {
27146       base: 'AV',
27147       chars: "\uA738\uA73A",
27148     }, {
27149       base: 'AY',
27150       chars: "\uA73C",
27151     }, {
27152       base: 'B',
27153       chars: "\u24B7\uFF22\u1E02\u1E04\u1E06\u0243\u0181",
27154     }, {
27155       base: 'C',
27156       chars: "\u24b8\uff23\uA73E\u1E08\u0106\u0043\u0108\u010A\u010C\u00C7\u0187\u023B",
27157     }, {
27158       base: 'D',
27159       chars: "\u24B9\uFF24\u1E0A\u010E\u1E0C\u1E10\u1E12\u1E0E\u0110\u018A\u0189\u1D05\uA779",
27160     }, {
27161       base: 'Dh',
27162       chars: "\u00D0",
27163     }, {
27164       base: 'DZ',
27165       chars: "\u01F1\u01C4",
27166     }, {
27167       base: 'Dz',
27168       chars: "\u01F2\u01C5",
27169     }, {
27170       base: 'E',
27171       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",
27172     }, {
27173       base: 'F',
27174       chars: "\uA77C\u24BB\uFF26\u1E1E\u0191\uA77B",
27175     }, {
27176       base: 'G',
27177       chars: "\u24BC\uFF27\u01F4\u011C\u1E20\u011E\u0120\u01E6\u0122\u01E4\u0193\uA7A0\uA77D\uA77E\u0262",
27178     }, {
27179       base: 'H',
27180       chars: "\u24BD\uFF28\u0124\u1E22\u1E26\u021E\u1E24\u1E28\u1E2A\u0126\u2C67\u2C75\uA78D",
27181     }, {
27182       base: 'I',
27183       chars: "\u24BE\uFF29\xCC\xCD\xCE\u0128\u012A\u012C\u0130\xCF\u1E2E\u1EC8\u01CF\u0208\u020A\u1ECA\u012E\u1E2C\u0197",
27184     }, {
27185       base: 'J',
27186       chars: "\u24BF\uFF2A\u0134\u0248\u0237",
27187     }, {
27188       base: 'K',
27189       chars: "\u24C0\uFF2B\u1E30\u01E8\u1E32\u0136\u1E34\u0198\u2C69\uA740\uA742\uA744\uA7A2",
27190     }, {
27191       base: 'L',
27192       chars: "\u24C1\uFF2C\u013F\u0139\u013D\u1E36\u1E38\u013B\u1E3C\u1E3A\u0141\u023D\u2C62\u2C60\uA748\uA746\uA780",
27193     }, {
27194       base: 'LJ',
27195       chars: "\u01C7",
27196     }, {
27197       base: 'Lj',
27198       chars: "\u01C8",
27199     }, {
27200       base: 'M',
27201       chars: "\u24C2\uFF2D\u1E3E\u1E40\u1E42\u2C6E\u019C\u03FB",
27202     }, {
27203       base: 'N',
27204       chars: "\uA7A4\u0220\u24C3\uFF2E\u01F8\u0143\xD1\u1E44\u0147\u1E46\u0145\u1E4A\u1E48\u019D\uA790\u1D0E",
27205     }, {
27206       base: 'NJ',
27207       chars: "\u01CA",
27208     }, {
27209       base: 'Nj',
27210       chars: "\u01CB",
27211     }, {
27212       base: 'O',
27213       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",
27214     }, {
27215       base: 'OE',
27216       chars: "\u0152",
27217     }, {
27218       base: 'OI',
27219       chars: "\u01A2",
27220     }, {
27221       base: 'OO',
27222       chars: "\uA74E",
27223     }, {
27224       base: 'OU',
27225       chars: "\u0222",
27226     }, {
27227       base: 'P',
27228       chars: "\u24C5\uFF30\u1E54\u1E56\u01A4\u2C63\uA750\uA752\uA754",
27229     }, {
27230       base: 'Q',
27231       chars: "\u24C6\uFF31\uA756\uA758\u024A",
27232     }, {
27233       base: 'R',
27234       chars: "\u24C7\uFF32\u0154\u1E58\u0158\u0210\u0212\u1E5A\u1E5C\u0156\u1E5E\u024C\u2C64\uA75A\uA7A6\uA782",
27235     }, {
27236       base: 'S',
27237       chars: "\u24C8\uFF33\u1E9E\u015A\u1E64\u015C\u1E60\u0160\u1E66\u1E62\u1E68\u0218\u015E\u2C7E\uA7A8\uA784",
27238     }, {
27239       base: 'T',
27240       chars: "\u24C9\uFF34\u1E6A\u0164\u1E6C\u021A\u0162\u1E70\u1E6E\u0166\u01AC\u01AE\u023E\uA786",
27241     }, {
27242       base: 'Th',
27243       chars: "\u00DE",
27244     }, {
27245       base: 'TZ',
27246       chars: "\uA728",
27247     }, {
27248       base: 'U',
27249       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",
27250     }, {
27251       base: 'V',
27252       chars: "\u24CB\uFF36\u1E7C\u1E7E\u01B2\uA75E\u0245",
27253     }, {
27254       base: 'VY',
27255       chars: "\uA760",
27256     }, {
27257       base: 'W',
27258       chars: "\u24CC\uFF37\u1E80\u1E82\u0174\u1E86\u1E84\u1E88\u2C72",
27259     }, {
27260       base: 'X',
27261       chars: "\u24CD\uFF38\u1E8A\u1E8C",
27262     }, {
27263       base: 'Y',
27264       chars: "\u24CE\uFF39\u1EF2\xDD\u0176\u1EF8\u0232\u1E8E\u0178\u1EF6\u1EF4\u01B3\u024E\u1EFE",
27265     }, {
27266       base: 'Z',
27267       chars: "\u24CF\uFF3A\u0179\u1E90\u017B\u017D\u1E92\u1E94\u01B5\u0224\u2C7F\u2C6B\uA762",
27268     }, {
27269       base: 'a',
27270       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",
27271     }, {
27272       base: 'aa',
27273       chars: "\uA733",
27274     }, {
27275       base: 'ae',
27276       chars: "\u00E6\u01FD\u01E3",
27277     }, {
27278       base: 'ao',
27279       chars: "\uA735",
27280     }, {
27281       base: 'au',
27282       chars: "\uA737",
27283     }, {
27284       base: 'av',
27285       chars: "\uA739\uA73B",
27286     }, {
27287       base: 'ay',
27288       chars: "\uA73D",
27289     }, {
27290       base: 'b',
27291       chars: "\u24D1\uFF42\u1E03\u1E05\u1E07\u0180\u0183\u0253\u0182",
27292     }, {
27293       base: 'c',
27294       chars: "\uFF43\u24D2\u0107\u0109\u010B\u010D\u00E7\u1E09\u0188\u023C\uA73F\u2184",
27295     }, {
27296       base: 'd',
27297       chars: "\u24D3\uFF44\u1E0B\u010F\u1E0D\u1E11\u1E13\u1E0F\u0111\u018C\u0256\u0257\u018B\u13E7\u0501\uA7AA",
27298     }, {
27299       base: 'dh',
27300       chars: "\u00F0",
27301     }, {
27302       base: 'dz',
27303       chars: "\u01F3\u01C6",
27304     }, {
27305       base: 'e',
27306       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",
27307     }, {
27308       base: 'f',
27309       chars: "\u24D5\uFF46\u1E1F\u0192",
27310     }, {
27311       base: 'ff',
27312       chars: "\uFB00",
27313     }, {
27314       base: 'fi',
27315       chars: "\uFB01",
27316     }, {
27317       base: 'fl',
27318       chars: "\uFB02",
27319     }, {
27320       base: 'ffi',
27321       chars: "\uFB03",
27322     }, {
27323       base: 'ffl',
27324       chars: "\uFB04",
27325     }, {
27326       base: 'g',
27327       chars: "\u24D6\uFF47\u01F5\u011D\u1E21\u011F\u0121\u01E7\u0123\u01E5\u0260\uA7A1\uA77F\u1D79",
27328     }, {
27329       base: 'h',
27330       chars: "\u24D7\uFF48\u0125\u1E23\u1E27\u021F\u1E25\u1E29\u1E2B\u1E96\u0127\u2C68\u2C76\u0265",
27331     }, {
27332       base: 'hv',
27333       chars: "\u0195",
27334     }, {
27335       base: 'i',
27336       chars: "\u24D8\uFF49\xEC\xED\xEE\u0129\u012B\u012D\xEF\u1E2F\u1EC9\u01D0\u0209\u020B\u1ECB\u012F\u1E2D\u0268\u0131",
27337     }, {
27338       base: 'j',
27339       chars: "\u24D9\uFF4A\u0135\u01F0\u0249",
27340     }, {
27341       base: 'k',
27342       chars: "\u24DA\uFF4B\u1E31\u01E9\u1E33\u0137\u1E35\u0199\u2C6A\uA741\uA743\uA745\uA7A3",
27343     }, {
27344       base: 'l',
27345       chars: "\u24DB\uFF4C\u0140\u013A\u013E\u1E37\u1E39\u013C\u1E3D\u1E3B\u017F\u0142\u019A\u026B\u2C61\uA749\uA781\uA747\u026D",
27346     }, {
27347       base: 'lj',
27348       chars: "\u01C9",
27349     }, {
27350       base: 'm',
27351       chars: "\u24DC\uFF4D\u1E3F\u1E41\u1E43\u0271\u026F",
27352     }, {
27353       base: 'n',
27354       chars: "\u24DD\uFF4E\u01F9\u0144\xF1\u1E45\u0148\u1E47\u0146\u1E4B\u1E49\u019E\u0272\u0149\uA791\uA7A5\u043B\u0509",
27355     }, {
27356       base: 'nj',
27357       chars: "\u01CC",
27358     }, {
27359       base: 'o',
27360       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",
27361     }, {
27362       base: 'oe',
27363       chars: "\u0153",
27364     }, {
27365       base: 'oi',
27366       chars: "\u01A3",
27367     }, {
27368       base: 'oo',
27369       chars: "\uA74F",
27370     }, {
27371       base: 'ou',
27372       chars: "\u0223",
27373     }, {
27374       base: 'p',
27375       chars: "\u24DF\uFF50\u1E55\u1E57\u01A5\u1D7D\uA751\uA753\uA755\u03C1",
27376     }, {
27377       base: 'q',
27378       chars: "\u24E0\uFF51\u024B\uA757\uA759",
27379     }, {
27380       base: 'r',
27381       chars: "\u24E1\uFF52\u0155\u1E59\u0159\u0211\u0213\u1E5B\u1E5D\u0157\u1E5F\u024D\u027D\uA75B\uA7A7\uA783",
27382     }, {
27383       base: 's',
27384       chars: "\u24E2\uFF53\u015B\u1E65\u015D\u1E61\u0161\u1E67\u1E63\u1E69\u0219\u015F\u023F\uA7A9\uA785\u1E9B\u0282",
27385     }, {
27386       base: 'ss',
27387       chars: "\xDF",
27388     }, {
27389       base: 't',
27390       chars: "\u24E3\uFF54\u1E6B\u1E97\u0165\u1E6D\u021B\u0163\u1E71\u1E6F\u0167\u01AD\u0288\u2C66\uA787",
27391     }, {
27392       base: 'th',
27393       chars: "\u00FE",
27394     }, {
27395       base: 'tz',
27396       chars: "\uA729",
27397     }, {
27398       base: 'u',
27399       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",
27400     }, {
27401       base: 'v',
27402       chars: "\u24E5\uFF56\u1E7D\u1E7F\u028B\uA75F\u028C",
27403     }, {
27404       base: 'vy',
27405       chars: "\uA761",
27406     }, {
27407       base: 'w',
27408       chars: "\u24E6\uFF57\u1E81\u1E83\u0175\u1E87\u1E85\u1E98\u1E89\u2C73",
27409     }, {
27410       base: 'x',
27411       chars: "\u24E7\uFF58\u1E8B\u1E8D",
27412     }, {
27413       base: 'y',
27414       chars: "\u24E8\uFF59\u1EF3\xFD\u0177\u1EF9\u0233\u1E8F\xFF\u1EF7\u1E99\u1EF5\u01B4\u024F\u1EFF",
27415     }, {
27416       base: 'z',
27417       chars: "\u24E9\uFF5A\u017A\u1E91\u017C\u017E\u1E93\u1E95\u01B6\u0225\u0240\u2C6C\uA763",
27418     }
27419   ];
27420
27421   var diacriticsMap = {};
27422   for (var i = 0; i < replacementList.length; i += 1) {
27423     var chars = replacementList[i].chars;
27424     for (var j = 0; j < chars.length; j += 1) {
27425       diacriticsMap[chars[j]] = replacementList[i].base;
27426     }
27427   }
27428
27429   function removeDiacritics(str) {
27430     return str.replace(/[^\u0000-\u007e]/g, function(c) {
27431       return diacriticsMap[c] || c;
27432     });
27433   }
27434
27435   // see https://github.com/openstreetmap/iD/pull/3707
27436   // https://gist.github.com/mapmeld/556b09ddec07a2044c76e1ef45f01c60
27437
27438   var chars$1 = {
27439       // madda above alef
27440       1570: { initial: 'آ‎', isolated: 'ﺁ', medial: 'ﺁ', final: 'ﺂ' },
27441
27442       // hamza above and below alef
27443       1571: { initial: 'أ', isolated: 'ﺃ', medial: '', final: 'ﺄ' },
27444       // 1572 is ؤ
27445       1573: { initial: 'إ', isolated: 'ﺇ', medial: '', final: 'ﺈ' },
27446       // 1574 is ئ
27447       1575: { initial: 'ا', isolated: 'ا', medial: '', final: 'ﺎ' },
27448       1576: { initial: 'ﺑ', isolated: 'ﺏ', medial: 'ﺒ', final: 'ﺐ' },
27449
27450       // 1577 ة
27451       1577: { initial: '', isolated: 'ة', medial: '', final: 'ﺔ' },
27452
27453       1578: { initial: 'ﺗ', isolated: 'ﺕ', medial: 'ﺘ', final: 'ﺖ' },
27454       1579: { initial: 'ﺛ', isolated: 'ﺙ', medial: 'ﺜ', final: 'ﺚ' },
27455       1580: { initial: 'ﺟ', isolated: 'ﺝ', medial: 'ﺠ', final: 'ﺞ' },
27456       1581: { initial: 'ﺣ', isolated: 'ﺡ', medial: 'ﺤ', final: 'ﺢ' },
27457       1582: { initial: 'ﺧ', isolated: 'ﺥ', medial: 'ﺨ', final: 'ﺦ' },
27458       1583: { initial: 'ﺩ', isolated: 'ﺩ', medial: '', final: 'ﺪ' },
27459       1584: { initial: 'ﺫ', isolated: 'ﺫ', medial: '', final: 'ﺬ' },
27460       1585: { initial: 'ﺭ', isolated: 'ﺭ', medial: '', final: 'ﺮ' },
27461       1586: { initial: 'ﺯ', isolated: 'ﺯ', medial: '', final: 'ﺰ' },
27462       1688: { initial: 'ﮊ', isolated: 'ﮊ', medial: '', final: 'ﮋ' },
27463       1587: { initial: 'ﺳ', isolated: 'ﺱ', medial: 'ﺴ', final: 'ﺲ' },
27464       1588: { initial: 'ﺷ', isolated: 'ﺵ', medial: 'ﺸ', final: 'ﺶ' },
27465       1589: { initial: 'ﺻ', isolated: 'ﺹ', medial: 'ﺼ', final: 'ﺺ' },
27466       1590: { initial: 'ﺿ', isolated: 'ﺽ', medial: 'ﻀ', final: 'ﺾ' },
27467       1591: { initial: 'ﻃ', isolated: 'ﻁ', medial: 'ﻄ', final: 'ﻂ' },
27468       1592: { initial: 'ﻇ', isolated: 'ﻅ', medial: 'ﻈ', final: 'ﻆ' },
27469       1593: { initial: 'ﻋ', isolated: 'ﻉ', medial: 'ﻌ', final: 'ﻊ' },
27470       1594: { initial: 'ﻏ', isolated: 'ﻍ', medial: 'ﻐ', final: 'ﻎ' },
27471
27472       // 1595 ػ - may be very rare
27473
27474       1601: { initial: 'ﻓ', isolated: 'ﻑ', medial: 'ﻔ', final: 'ﻒ' },
27475       1602: { initial: 'ﻗ', isolated: 'ﻕ', medial: 'ﻘ', final: 'ﻖ' },
27476       1604: { initial: 'ﻟ', isolated: 'ﻝ', medial: 'ﻠ', final: 'ﻞ' },
27477       1605: { initial: 'ﻣ', isolated: 'ﻡ', medial: 'ﻤ', final: 'ﻢ' },
27478       1606: { initial: 'ﻧ', isolated: 'ﻥ', medial: 'ﻨ', final: 'ﻦ' },
27479       1607: { initial: 'ﻫ', isolated: 'ﻩ', medial: 'ﻬ', final: 'ﻪ' },
27480       1608: { initial: 'ﻭ', isolated: 'ﻭ', medial: '', final: 'ﻮ' },
27481
27482       // 1609 ى
27483       1609: { initial: 'ﯨ', isolated: 'ﻯ', medial: 'ﯩ', final: 'ﻰ' },
27484       // 1610 ي
27485       1610: { initial: 'ﻳ', isolated: 'ﻱ', medial: 'ﻴ', final: 'ﻲ' },
27486
27487       // short vowel sounds / tashkil markings
27488
27489       1662: { initial: 'ﭘ', isolated: 'ﭖ', medial: 'ﭙ', final: 'ﭗ' },
27490
27491       1670: { initial: 'ﭼ', isolated: 'ﭺ', medial: 'ﭽ', final: 'ﭻ' },
27492       1603: { initial: 'ﻛ', isolated: 'ﻙ', medial: 'ﻜ', final: 'ﻚ' },
27493       1705: { initial: 'ﻛ', isolated: 'ﮎ', medial: 'ﻜ', final: 'ﮏ' },
27494       1711: { initial: 'ﮔ', isolated: 'ﮒ', medial: 'ﮕ', final: 'ﮓ' },
27495       1740: { initial: 'ﻳ', isolated: 'ﻯ', medial: 'ﻴ', final: 'ﻰ' },
27496       5000: { initial: 'ﻻ', isolated: 'ﻻ', medial: '', final: 'ﻼ' }
27497   };
27498
27499   var rtlRegex = /[\u0590-\u05FF\u0600-\u06FF\u0780-\u07BF]/;
27500
27501   function fixRTLTextForSvg(inputText) {
27502       var context = true;
27503       var ret = '';
27504       var rtlBuffer = [];
27505       var arabicRegex = /[\u0600-\u06FF]/g;
27506       var arabicTashkil = /[\u0610-\u061A\u064B-\u065F\u0670\u06D6-\u06DC\u06DF-\u06E4\u06E7\u06E8\u06EA-\u06ED]/;
27507       var thaanaVowel = /[\u07A6-\u07B0]/;
27508       var hebrewSign = /[\u0591-\u05bd\u05bf\u05c1-\u05c5\u05c7]/;
27509
27510       if (!arabicRegex.test(inputText)) {
27511           // Hebrew or Thaana RTL script
27512           for (var n = 0; n < inputText.length; n++) {
27513               var c = inputText[n];
27514               if ((thaanaVowel.test(c) || hebrewSign.test(c)) && rtlBuffer.length) {
27515                   rtlBuffer[rtlBuffer.length - 1] += c;
27516               } else if (rtlRegex.test(c)) {
27517                   rtlBuffer.push(c);
27518               } else if (c === ' ' && rtlBuffer.length) {
27519                   // whitespace within RTL text
27520                   rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27521               } else {
27522                   // non-RTL character
27523                   ret += rtlBuffer.reverse().join('') + c;
27524                   rtlBuffer = [];
27525               }
27526           }
27527       } else {
27528           for (var i = 0, l = inputText.length; i < l; i++) {
27529               var code = inputText[i].charCodeAt(0);
27530               var nextCode = inputText[i + 1] ? inputText[i + 1].charCodeAt(0) : 0;
27531
27532               if (!chars$1[code]) {
27533                   if (code === 32 && rtlBuffer.length) {
27534                       // whitespace
27535                       rtlBuffer = [rtlBuffer.reverse().join('') + ' '];
27536                   } else if (arabicTashkil.test(inputText[i]) && rtlBuffer.length) {
27537                       // tashkil mark
27538                       rtlBuffer[rtlBuffer.length - 1] += inputText[i];
27539                   } else {
27540                       // non-RTL character
27541                       ret += rtlBuffer.reverse().join('') + inputText[i];
27542                       rtlBuffer = [];
27543                   }
27544                   continue;
27545               }
27546               if (context) {
27547                   if (i === l - 1 || nextCode === 32) {
27548                       rtlBuffer.push(chars$1[code].isolated);
27549                   } else {
27550                       // special case for لا
27551                       if (code === 1604 && nextCode === 1575) {
27552                           rtlBuffer.push(chars$1[5000].initial);
27553                           i++;
27554                           context = true;
27555                           continue;
27556                       }
27557                       rtlBuffer.push(chars$1[code].initial);
27558                   }
27559               } else {
27560                   if (i === l - 1 || nextCode === 32){
27561                       rtlBuffer.push(chars$1[code].final);
27562                   } else {
27563                       // special case for ﻼ
27564                       if (code === 1604 && nextCode === 1575){
27565                           rtlBuffer.push(chars$1[5000].final);
27566                           i++;
27567                           context = true;
27568                           continue;
27569                       }
27570                       if (chars$1[code].medial === ''){
27571                           rtlBuffer.push(chars$1[code].final);
27572                       } else {
27573                           rtlBuffer.push(chars$1[code].medial);
27574                       }
27575                   }
27576               }
27577               context = (chars$1[code].medial === '') || nextCode === 32;
27578           }
27579       }
27580       ret += rtlBuffer.reverse().join('');
27581       return ret;
27582   }
27583
27584   function utilTagText(entity) {
27585       return map$3(entity.tags, function(v, k) {
27586           return k + '=' + v;
27587       }).join(', ');
27588   }
27589
27590
27591   function utilEntitySelector(ids) {
27592       return ids.length ? '.' + ids.join(',.') : 'nothing';
27593   }
27594
27595
27596   function utilEntityOrMemberSelector(ids, graph) {
27597       var s = utilEntitySelector(ids);
27598
27599       ids.forEach(function(id) {
27600           var entity = graph.hasEntity(id);
27601           if (entity && entity.type === 'relation') {
27602               entity.members.forEach(function(member) {
27603                   s += ',.' + member.id;
27604               });
27605           }
27606       });
27607
27608       return s;
27609   }
27610
27611
27612   function utilEntityOrDeepMemberSelector(ids, graph) {
27613       var seen = {};
27614       var allIDs = [];
27615       function addEntityAndMembersIfNotYetSeen(id) {
27616           // avoid infinite recursion for circular relations by skipping seen entities
27617           if (seen[id]) return;
27618           // mark the entity as seen
27619           seen[id] = true;
27620           // add the id;
27621           allIDs.push(id);
27622           if (graph.hasEntity(id)) {
27623               var entity = graph.entity(id);
27624               if (entity.type === 'relation' && entity.members) {
27625                   entity.members.forEach(function(member){
27626                       addEntityAndMembersIfNotYetSeen(member.id);
27627                   });
27628               }
27629           }
27630       }
27631       ids.forEach(function(id) {
27632           addEntityAndMembersIfNotYetSeen(id);
27633       });
27634       return utilEntitySelector(allIDs);
27635   }
27636
27637
27638   function utilGetAllNodes(ids, graph) {
27639       var seen = {};
27640       var nodes = [];
27641       ids.forEach(getNodes);
27642       return nodes;
27643
27644       function getNodes(id) {
27645           if (seen[id]) return;
27646           seen[id] = true;
27647
27648           var entity = graph.hasEntity(id);
27649           if (!entity) return;
27650
27651           if (entity.type === 'node') {
27652               nodes.push(entity);
27653           } else if (entity.type === 'way') {
27654               entity.nodes.forEach(getNodes);
27655           } else {
27656               entity.members.map(function(member) { return member.id; }).forEach(getNodes);
27657           }
27658       }
27659   }
27660
27661
27662   function utilDisplayName(entity) {
27663       var localizedNameKey = 'name:' + utilDetect().locale.toLowerCase().split('-')[0],
27664           name = entity.tags[localizedNameKey] || entity.tags.name || '',
27665           network = entity.tags.cycle_network || entity.tags.network;
27666
27667       if (!name && entity.tags.ref) {
27668           name = entity.tags.ref;
27669           if (network) {
27670               name = network + ' ' + name;
27671           }
27672       }
27673
27674       return name;
27675   }
27676
27677
27678   function utilDisplayNameForPath(entity) {
27679       var name = utilDisplayName(entity);
27680       var isFirefox = utilDetect().browser.toLowerCase().indexOf('firefox') > -1;
27681
27682       if (!isFirefox && name && rtlRegex.test(name)) {
27683           name = fixRTLTextForSvg(name);
27684       }
27685
27686       return name;
27687   }
27688
27689
27690   function utilDisplayType(id) {
27691       return {
27692           n: t('inspector.node'),
27693           w: t('inspector.way'),
27694           r: t('inspector.relation')
27695       }[id.charAt(0)];
27696   }
27697
27698
27699   function utilStringQs(str) {
27700       return str.split('&').reduce(function(obj, pair){
27701           var parts = pair.split('=');
27702           if (parts.length === 2) {
27703               obj[parts[0]] = (null === parts[1]) ? '' : decodeURIComponent(parts[1]);
27704           }
27705           if (parts[0] === 'mvt') {
27706               obj[parts[0]] = (parts[2] !== undefined) ? (decodeURIComponent(parts[1]) + '=' + decodeURIComponent(parts[2])) : (decodeURIComponent(parts[1]));
27707           }
27708           return obj;
27709       }, {});
27710   }
27711
27712
27713   function utilQsString(obj, noencode) {
27714       function softEncode(s) {
27715         // encode everything except special characters used in certain hash parameters:
27716         // "/" in map states, ":", ",", {" and "}" in background
27717         return encodeURIComponent(s).replace(/(%2F|%3A|%2C|%7B|%7D)/g, decodeURIComponent);
27718       }
27719       return Object.keys(obj).sort().map(function(key) {
27720           return encodeURIComponent(key) + '=' + (
27721               noencode ? softEncode(obj[key]) : encodeURIComponent(obj[key]));
27722       }).join('&');
27723   }
27724
27725
27726   function utilPrefixDOMProperty(property) {
27727       var prefixes = ['webkit', 'ms', 'moz', 'o'],
27728           i = -1,
27729           n = prefixes.length,
27730           s = document.body;
27731
27732       if (property in s)
27733           return property;
27734
27735       property = property.substr(0, 1).toUpperCase() + property.substr(1);
27736
27737       while (++i < n)
27738           if (prefixes[i] + property in s)
27739               return prefixes[i] + property;
27740
27741       return false;
27742   }
27743
27744
27745   function utilPrefixCSSProperty(property) {
27746       var prefixes = ['webkit', 'ms', 'Moz', 'O'],
27747           i = -1,
27748           n = prefixes.length,
27749           s = document.body.style;
27750
27751       if (property.toLowerCase() in s)
27752           return property.toLowerCase();
27753
27754       while (++i < n)
27755           if (prefixes[i] + property in s)
27756               return '-' + prefixes[i].toLowerCase() + property.replace(/([A-Z])/g, '-$1').toLowerCase();
27757
27758       return false;
27759   }
27760
27761
27762   var transformProperty;
27763   function utilSetTransform(el, x, y, scale) {
27764       var prop = transformProperty = transformProperty || utilPrefixCSSProperty('Transform'),
27765           translate = utilDetect().opera ?
27766               'translate('   + x + 'px,' + y + 'px)' :
27767               'translate3d(' + x + 'px,' + y + 'px,0)';
27768       return el.style(prop, translate + (scale ? ' scale(' + scale + ')' : ''));
27769   }
27770
27771
27772   // Calculates Levenshtein distance between two strings
27773   // see:  https://en.wikipedia.org/wiki/Levenshtein_distance
27774   // first converts the strings to lowercase and replaces diacritic marks with ascii equivalents.
27775   function utilEditDistance(a, b) {
27776       a = remove$1(a.toLowerCase());
27777       b = remove$1(b.toLowerCase());
27778       if (a.length === 0) return b.length;
27779       if (b.length === 0) return a.length;
27780       var matrix = [];
27781       for (var i = 0; i <= b.length; i++) { matrix[i] = [i]; }
27782       for (var j = 0; j <= a.length; j++) { matrix[0][j] = j; }
27783       for (i = 1; i <= b.length; i++) {
27784           for (j = 1; j <= a.length; j++) {
27785               if (b.charAt(i-1) === a.charAt(j-1)) {
27786                   matrix[i][j] = matrix[i-1][j-1];
27787               } else {
27788                   matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution
27789                       Math.min(matrix[i][j-1] + 1, // insertion
27790                       matrix[i-1][j] + 1)); // deletion
27791               }
27792           }
27793       }
27794       return matrix[b.length][a.length];
27795   }
27796
27797
27798   // a d3.mouse-alike which
27799   // 1. Only works on HTML elements, not SVG
27800   // 2. Does not cause style recalculation
27801   function utilFastMouse(container) {
27802       var rect = container.getBoundingClientRect(),
27803           rectLeft = rect.left,
27804           rectTop = rect.top,
27805           clientLeft = +container.clientLeft,
27806           clientTop = +container.clientTop;
27807       if (textDirection === 'rtl') {
27808           rectLeft = 0;
27809       }
27810       return function(e) {
27811           return [
27812               e.clientX - rectLeft - clientLeft,
27813               e.clientY - rectTop - clientTop];
27814       };
27815   }
27816
27817
27818   /* eslint-disable no-proto */
27819   var utilGetPrototypeOf = Object.getPrototypeOf || function(obj) { return obj.__proto__; };
27820   /* eslint-enable no-proto */
27821
27822
27823   function utilAsyncMap(inputs, func, callback) {
27824       var remaining = inputs.length,
27825           results = [],
27826           errors = [];
27827
27828       inputs.forEach(function(d, i) {
27829           func(d, function done(err, data) {
27830               errors[i] = err;
27831               results[i] = data;
27832               remaining--;
27833               if (!remaining) callback(errors, results);
27834           });
27835       });
27836   }
27837
27838
27839   // wraps an index to an interval [0..length-1]
27840   function utilWrap(index, length) {
27841       if (index < 0)
27842           index += Math.ceil(-index/length)*length;
27843       return index % length;
27844   }
27845
27846
27847   /**
27848    * a replacement for functor
27849    *
27850    * @param {*} value any value
27851    * @returns {Function} a function that returns that value or the value if it's a function
27852    */
27853   function utilFunctor(value) {
27854       if (typeof value === 'function') return value;
27855       return function() {
27856           return value;
27857       };
27858   }
27859
27860
27861   function utilNoAuto(selection) {
27862       var isText = (selection.size() && selection.node().tagName.toLowerCase() === 'textarea');
27863
27864       return selection
27865           .attr('autocomplete', 'off')
27866           .attr('autocorrect', 'off')
27867           .attr('autocapitalize', 'off')
27868           .attr('spellcheck', isText ? 'true' : 'false');
27869   }
27870
27871
27872   // https://stackoverflow.com/questions/194846/is-there-any-kind-of-hash-code-function-in-javascript
27873   // https://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
27874   function utilHashcode(str) {
27875       var hash = 0;
27876       if (str.length === 0) {
27877           return hash;
27878       }
27879       for (var i = 0; i < str.length; i++) {
27880           var char = str.charCodeAt(i);
27881           hash = ((hash << 5) - hash) + char;
27882           hash = hash & hash; // Convert to 32bit integer
27883       }
27884       return hash;
27885   }
27886
27887   // Adds or removes highlight styling for the specified entity's SVG elements in the map.
27888   function utilHighlightEntity(id, highlighted, context) {
27889       context.surface()
27890           .selectAll(utilEntityOrDeepMemberSelector([id], context.graph()))
27891           .classed('highlighted', highlighted);
27892   }
27893
27894   // note the function should be of low priority
27895   // and should not be returning a value.
27896   function utilCallWhenIdle(func, timeout) {
27897       return function() {
27898           var args = arguments;
27899           var that = this;
27900           window.requestIdleCallback(function() {
27901               func.apply(that, args);
27902           }, {timeout: timeout});
27903       };
27904   }
27905
27906   function utilCleanTags(tags) {
27907       var out = {};
27908       for (var k in tags) {
27909           if (!k) continue;
27910           var v = tags[k];
27911           if (v !== undefined) {
27912               out[k] = cleanValue(k, v);
27913           }
27914       }
27915
27916       return out;
27917
27918
27919       function cleanValue(k, v) {
27920           function keepSpaces(k) {
27921               return /_hours|_times|:conditional$/.test(k);
27922           }
27923
27924           function skip(k) {
27925               return /^(description|note|fixme)$/.test(k);
27926           }
27927
27928           if (skip(k)) return v;
27929
27930           var cleaned = v
27931               .split(';')
27932               .map(function(s) { return s.trim(); })
27933               .join(keepSpaces(k) ? '; ' : ';');
27934
27935           // The code below is not intended to validate websites and emails.
27936           // It is only intended to prevent obvious copy-paste errors. (#2323)
27937           // clean website- and email-like tags
27938           if (k.indexOf('website') !== -1 ||
27939               k.indexOf('email') !== -1 ||
27940               cleaned.indexOf('http') === 0) {
27941               cleaned = cleaned
27942                   .replace(/[\u200B-\u200F\uFEFF]/g, '');  // strip LRM and other zero width chars
27943
27944           }
27945
27946           return cleaned;
27947       }
27948   }
27949
27950   // Like selection.property('value', ...), but avoids no-op value sets,
27951   // which can result in layout/repaint thrashing in some situations.
27952   function utilGetSetValue(selection, value) {
27953       function d3_selection_value(value) {
27954           function valueNull() {
27955               delete this.value;
27956           }
27957
27958           function valueConstant() {
27959               if (this.value !== value) {
27960                   this.value = value;
27961               }
27962           }
27963
27964           function valueFunction() {
27965               var x = value.apply(this, arguments);
27966               if (x == null) {
27967                   delete this.value;
27968               } else if (this.value !== x) {
27969                   this.value = x;
27970               }
27971           }
27972
27973           return value == null
27974               ? valueNull : (typeof value === 'function'
27975               ? valueFunction : valueConstant);
27976       }
27977
27978       if (arguments.length === 1) {
27979           return selection.property('value');
27980       }
27981
27982       return selection.each(d3_selection_value(value));
27983   }
27984
27985   function utilIdleWorker(tasks, processor, callback) {
27986       var results = [], result;
27987       for (var i = 0; i < tasks.length; i++) {
27988           result = processor(tasks[i]);
27989           if (result) results.push(result);
27990       }
27991       callback(results);
27992
27993       // var processed = [];
27994       // var currentPos = 0;
27995       // var totalTasks = tasks.length;
27996
27997       // function worker(deadline) {
27998       //     while (deadline.timeRemaining() > 0 && currentPos < totalTasks) {
27999       //         var result = processor(tasks[currentPos]);
28000
28001       //         // if falsy dont add to the processed list
28002       //         if (result) processed.push(result);
28003       //         currentPos++;
28004       //     }
28005
28006       //     // more tasks are left, we might need more idleCallbacks
28007       //     if (currentPos < totalTasks) {
28008       //         return window.requestIdleCallback(function(deadline) {worker(deadline);});
28009       //     }
28010
28011       //     // tasks are completed
28012       //     return callback(processed);
28013       // }
28014
28015       // window.requestIdleCallback(function(deadline) {worker(deadline);});
28016   }
28017
28018   // shim
28019   window.requestIdleCallback =
28020       window.requestIdleCallback ||
28021       function(cb) {
28022           var start = Date.now();
28023           return setTimeout(function() {
28024               cb({
28025                   didTimeout: false,
28026                   timeRemaining: function() {
28027                       return Math.max(0, 50 - (Date.now() - start));
28028                   }
28029               });
28030           }, 1);
28031       };
28032
28033   window.cancelIdleCallback =
28034       window.cancelIdleCallback ||
28035       function(id) {
28036           clearTimeout(id);
28037       };
28038
28039   function utilKeybinding(namespace$$1) {
28040       var _keybindings = {};
28041
28042
28043       function testBindings(isCapturing) {
28044           var didMatch = false;
28045           var bindings = Object.keys(_keybindings).map(function(id) { return _keybindings[id]; });
28046           var i, binding;
28047
28048           // Most key shortcuts will accept either lower or uppercase ('h' or 'H'),
28049           // so we don't strictly match on the shift key, but we prioritize
28050           // shifted keybindings first, and fallback to unshifted only if no match.
28051           // (This lets us differentiate between '←'/'⇧←' or '⌘Z'/'⌘⇧Z')
28052
28053           // priority match shifted keybindings first
28054           for (i = 0; i < bindings.length; i++) {
28055               binding = bindings[i];
28056               if (!binding.event.modifiers.shiftKey) continue;  // no shift
28057               if (!!binding.capture !== isCapturing) continue;
28058               if (matches(binding, true)) {
28059                   binding.callback();
28060                   didMatch = true;
28061               }
28062           }
28063
28064           // then unshifted keybindings
28065           if (didMatch) return;
28066           for (i = 0; i < bindings.length; i++) {
28067               binding = bindings[i];
28068               if (binding.event.modifiers.shiftKey) continue;   // shift
28069               if (!!binding.capture !== isCapturing) continue;
28070               if (matches(binding, false)) {
28071                   binding.callback();
28072               }
28073           }
28074
28075
28076           function matches(binding, testShift) {
28077               var event$$1 = event;
28078               var isMatch = false;
28079               var tryKeyCode = true;
28080
28081               // Prefer a match on `KeyboardEvent.key`
28082               if (event$$1.key !== undefined) {
28083                   tryKeyCode = (event$$1.key.charCodeAt(0) > 255);  // outside ISO-Latin-1
28084                   isMatch = true;
28085
28086                   if (binding.event.key === undefined) {
28087                       isMatch = false;
28088                   } else if (Array.isArray(binding.event.key)) {
28089                       if (binding.event.key.map(function(s) { return s.toLowerCase(); }).indexOf(event$$1.key.toLowerCase()) === -1)
28090                           isMatch = false;
28091                   } else {
28092                       if (event$$1.key.toLowerCase() !== binding.event.key.toLowerCase())
28093                           isMatch = false;
28094                   }
28095               }
28096
28097               // Fallback match on `KeyboardEvent.keyCode`, can happen if:
28098               // - browser doesn't support `KeyboardEvent.key`
28099               // - `KeyboardEvent.key` is outside ISO-Latin-1 range (cyrillic?)
28100               if (!isMatch && tryKeyCode) {
28101                   isMatch = (event$$1.keyCode === binding.event.keyCode);
28102               }
28103
28104               if (!isMatch) return false;
28105
28106               // test modifier keys
28107               if (!(event$$1.ctrlKey && event$$1.altKey)) {  // if both are set, assume AltGr and skip it - #4096
28108                   if (event$$1.ctrlKey !== binding.event.modifiers.ctrlKey) return false;
28109                   if (event$$1.altKey !== binding.event.modifiers.altKey) return false;
28110               }
28111               if (event$$1.metaKey !== binding.event.modifiers.metaKey) return false;
28112               if (testShift && event$$1.shiftKey !== binding.event.modifiers.shiftKey) return false;
28113
28114               return true;
28115           }
28116       }
28117
28118
28119       function capture() {
28120           testBindings(true);
28121       }
28122
28123
28124       function bubble() {
28125           var tagName = select(event.target).node().tagName;
28126           if (tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA') {
28127               return;
28128           }
28129           testBindings(false);
28130       }
28131
28132
28133       function keybinding(selection$$1) {
28134           selection$$1 = selection$$1 || select(document);
28135           selection$$1.on('keydown.capture.' + namespace$$1, capture, true);
28136           selection$$1.on('keydown.bubble.' + namespace$$1, bubble, false);
28137           return keybinding;
28138       }
28139
28140       // was: keybinding.off()
28141       keybinding.unbind = function(selection$$1) {
28142           _keybindings = [];
28143           selection$$1 = selection$$1 || select(document);
28144           selection$$1.on('keydown.capture.' + namespace$$1, null);
28145           selection$$1.on('keydown.bubble.' + namespace$$1, null);
28146           return keybinding;
28147       };
28148
28149
28150       keybinding.clear = function() {
28151           _keybindings = {};
28152           return keybinding;
28153       };
28154
28155
28156       // Remove one or more keycode bindings.
28157       keybinding.off = function(codes, capture) {
28158           var arr = [].concat(codes);
28159
28160           for (var i = 0; i < arr.length; i++) {
28161               var id = arr[i] + (capture ? '-capture' : '-bubble');
28162               delete _keybindings[id];
28163           }
28164           return keybinding;
28165       };
28166
28167
28168       // Add one or more keycode bindings.
28169       keybinding.on = function(codes, callback, capture) {
28170           if (!isFunction(callback)) {
28171               return keybinding.off(codes, capture);
28172           }
28173
28174           var arr = [].concat(codes);
28175
28176           for (var i = 0; i < arr.length; i++) {
28177               var id = arr[i] + (capture ? '-capture' : '-bubble');
28178               var binding = {
28179                   id: id,
28180                   capture: capture,
28181                   callback: callback,
28182                   event: {
28183                       key: undefined,  // preferred
28184                       keyCode: 0,      // fallback
28185                       modifiers: {
28186                           shiftKey: false,
28187                           ctrlKey: false,
28188                           altKey: false,
28189                           metaKey: false
28190                       }
28191                   }
28192               };
28193
28194               if (_keybindings[id]) {
28195                   console.warn('warning: duplicate keybinding for "' + id + '"'); // eslint-disable-line no-console
28196               }
28197
28198               _keybindings[id] = binding;
28199
28200               var matches = arr[i].toLowerCase().match(/(?:(?:[^+⇧⌃⌥⌘])+|[⇧⌃⌥⌘]|\+\+|^\+$)/g);
28201               for (var j = 0; j < matches.length; j++) {
28202                   // Normalise matching errors
28203                   if (matches[j] === '++') matches[j] = '+';
28204
28205                   if (matches[j] in utilKeybinding.modifierCodes) {
28206                       var prop = utilKeybinding.modifierProperties[utilKeybinding.modifierCodes[matches[j]]];
28207                       binding.event.modifiers[prop] = true;
28208                   } else {
28209                       binding.event.key = utilKeybinding.keys[matches[j]] || matches[j];
28210                       if (matches[j] in utilKeybinding.keyCodes) {
28211                           binding.event.keyCode = utilKeybinding.keyCodes[matches[j]];
28212                       }
28213                   }
28214               }
28215           }
28216
28217           return keybinding;
28218       };
28219
28220
28221       return keybinding;
28222   }
28223
28224
28225   /*
28226    * See https://github.com/keithamus/jwerty
28227    */
28228
28229   utilKeybinding.modifierCodes = {
28230       // Shift key, ⇧
28231       '⇧': 16, shift: 16,
28232       // CTRL key, on Mac: ⌃
28233       '⌃': 17, ctrl: 17,
28234       // ALT key, on Mac: ⌥ (Alt)
28235       '⌥': 18, alt: 18, option: 18,
28236       // META, on Mac: ⌘ (CMD), on Windows (Win), on Linux (Super)
28237       '⌘': 91, meta: 91, cmd: 91, 'super': 91, win: 91
28238   };
28239
28240   utilKeybinding.modifierProperties = {
28241       16: 'shiftKey',
28242       17: 'ctrlKey',
28243       18: 'altKey',
28244       91: 'metaKey'
28245   };
28246
28247   utilKeybinding.keys = {
28248       // Backspace key, on Mac: ⌫ (Backspace)
28249       '⌫': 'Backspace', backspace: 'Backspace',
28250       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
28251       '⇥': 'Tab', '⇆': 'Tab', tab: 'Tab',
28252       // Return key, ↩
28253       '↩': 'Enter', 'return': 'Enter', enter: 'Enter', '⌅': 'Enter',
28254       // Pause/Break key
28255       'pause': 'Pause', 'pause-break': 'Pause',
28256       // Caps Lock key, ⇪
28257       '⇪': 'CapsLock', caps: 'CapsLock', 'caps-lock': 'CapsLock',
28258       // Escape key, on Mac: ⎋, on Windows: Esc
28259       '⎋': ['Escape', 'Esc'], escape: ['Escape', 'Esc'], esc: ['Escape', 'Esc'],
28260       // Space key
28261       space: [' ', 'Spacebar'],
28262       // Page-Up key, or pgup, on Mac: ↖
28263       '↖': 'PageUp', pgup: 'PageUp', 'page-up': 'PageUp',
28264       // Page-Down key, or pgdown, on Mac: ↘
28265       '↘': 'PageDown', pgdown: 'PageDown', 'page-down': 'PageDown',
28266       // END key, on Mac: ⇟
28267       '⇟': 'End', end: 'End',
28268       // HOME key, on Mac: ⇞
28269       '⇞': 'Home', home: 'Home',
28270       // Insert key, or ins
28271       ins: 'Insert', insert: 'Insert',
28272       // Delete key, on Mac: ⌦ (Delete)
28273       '⌦': ['Delete', 'Del'], del: ['Delete', 'Del'], 'delete': ['Delete', 'Del'],
28274       // Left Arrow Key, or ←
28275       '←': ['ArrowLeft', 'Left'], left: ['ArrowLeft', 'Left'], 'arrow-left': ['ArrowLeft', 'Left'],
28276       // Up Arrow Key, or ↑
28277       '↑': ['ArrowUp', 'Up'], up: ['ArrowUp', 'Up'], 'arrow-up': ['ArrowUp', 'Up'],
28278       // Right Arrow Key, or →
28279       '→': ['ArrowRight', 'Right'], right: ['ArrowRight', 'Right'], 'arrow-right': ['ArrowRight', 'Right'],
28280       // Up Arrow Key, or ↓
28281       '↓': ['ArrowDown', 'Down'], down: ['ArrowDown', 'Down'], 'arrow-down': ['ArrowDown', 'Down'],
28282       // odities, stuff for backward compatibility (browsers and code):
28283       // Num-Multiply, or *
28284       '*': ['*', 'Multiply'], star: ['*', 'Multiply'], asterisk: ['*', 'Multiply'], multiply: ['*', 'Multiply'],
28285       // Num-Plus or +
28286       '+': ['+', 'Add'], 'plus': ['+', 'Add'],
28287       // Num-Subtract, or -
28288       '-': ['-', 'Subtract'], subtract: ['-', 'Subtract'], 'dash': ['-', 'Subtract'],
28289       // Semicolon
28290       semicolon: ';',
28291       // = or equals
28292       equals: '=',
28293       // Comma, or ,
28294       comma: ',',
28295       // Period, or ., or full-stop
28296       period: '.', 'full-stop': '.',
28297       // Slash, or /, or forward-slash
28298       slash: '/', 'forward-slash': '/',
28299       // Tick, or `, or back-quote
28300       tick: '`', 'back-quote': '`',
28301       // Open bracket, or [
28302       'open-bracket': '[',
28303       // Back slash, or \
28304       'back-slash': '\\',
28305       // Close backet, or ]
28306       'close-bracket': ']',
28307       // Apostrophe, or Quote, or '
28308       quote: '\'', apostrophe: '\'',
28309       // NUMPAD 0-9
28310       'num-0': '0',
28311       'num-1': '1',
28312       'num-2': '2',
28313       'num-3': '3',
28314       'num-4': '4',
28315       'num-5': '5',
28316       'num-6': '6',
28317       'num-7': '7',
28318       'num-8': '8',
28319       'num-9': '9',
28320       // F1-F25
28321       f1: 'F1',
28322       f2: 'F2',
28323       f3: 'F3',
28324       f4: 'F4',
28325       f5: 'F5',
28326       f6: 'F6',
28327       f7: 'F7',
28328       f8: 'F8',
28329       f9: 'F9',
28330       f10: 'F10',
28331       f11: 'F11',
28332       f12: 'F12',
28333       f13: 'F13',
28334       f14: 'F14',
28335       f15: 'F15',
28336       f16: 'F16',
28337       f17: 'F17',
28338       f18: 'F18',
28339       f19: 'F19',
28340       f20: 'F20',
28341       f21: 'F21',
28342       f22: 'F22',
28343       f23: 'F23',
28344       f24: 'F24',
28345       f25: 'F25'
28346   };
28347
28348   utilKeybinding.keyCodes = {
28349       // Backspace key, on Mac: ⌫ (Backspace)
28350       '⌫': 8, backspace: 8,
28351       // Tab Key, on Mac: ⇥ (Tab), on Windows ⇥⇥
28352       '⇥': 9, '⇆': 9, tab: 9,
28353       // Return key, ↩
28354       '↩': 13, 'return': 13, enter: 13, '⌅': 13,
28355       // Pause/Break key
28356       'pause': 19, 'pause-break': 19,
28357       // Caps Lock key, ⇪
28358       '⇪': 20, caps: 20, 'caps-lock': 20,
28359       // Escape key, on Mac: ⎋, on Windows: Esc
28360       '⎋': 27, escape: 27, esc: 27,
28361       // Space key
28362       space: 32,
28363       // Page-Up key, or pgup, on Mac: ↖
28364       '↖': 33, pgup: 33, 'page-up': 33,
28365       // Page-Down key, or pgdown, on Mac: ↘
28366       '↘': 34, pgdown: 34, 'page-down': 34,
28367       // END key, on Mac: ⇟
28368       '⇟': 35, end: 35,
28369       // HOME key, on Mac: ⇞
28370       '⇞': 36, home: 36,
28371       // Insert key, or ins
28372       ins: 45, insert: 45,
28373       // Delete key, on Mac: ⌦ (Delete)
28374       '⌦': 46, del: 46, 'delete': 46,
28375       // Left Arrow Key, or ←
28376       '←': 37, left: 37, 'arrow-left': 37,
28377       // Up Arrow Key, or ↑
28378       '↑': 38, up: 38, 'arrow-up': 38,
28379       // Right Arrow Key, or →
28380       '→': 39, right: 39, 'arrow-right': 39,
28381       // Up Arrow Key, or ↓
28382       '↓': 40, down: 40, 'arrow-down': 40,
28383       // odities, printing characters that come out wrong:
28384       // Firefox Equals
28385       'ffequals': 61,
28386       // Num-Multiply, or *
28387       '*': 106, star: 106, asterisk: 106, multiply: 106,
28388       // Num-Plus or +
28389       '+': 107, 'plus': 107,
28390       // Num-Subtract, or -
28391       '-': 109, subtract: 109,
28392       // Firefox Plus
28393       'ffplus': 171,
28394       // Firefox Minus
28395       'ffminus': 173,
28396       // Semicolon
28397       ';': 186, semicolon: 186,
28398       // = or equals
28399       '=': 187, 'equals': 187,
28400       // Comma, or ,
28401       ',': 188, comma: 188,
28402       // Dash / Underscore key
28403       'dash': 189,
28404       // Period, or ., or full-stop
28405       '.': 190, period: 190, 'full-stop': 190,
28406       // Slash, or /, or forward-slash
28407       '/': 191, slash: 191, 'forward-slash': 191,
28408       // Tick, or `, or back-quote
28409       '`': 192, tick: 192, 'back-quote': 192,
28410       // Open bracket, or [
28411       '[': 219, 'open-bracket': 219,
28412       // Back slash, or \
28413       '\\': 220, 'back-slash': 220,
28414       // Close backet, or ]
28415       ']': 221, 'close-bracket': 221,
28416       // Apostrophe, or Quote, or '
28417       '\'': 222, quote: 222, apostrophe: 222
28418   };
28419
28420   // NUMPAD 0-9
28421   var i$1 = 95, n = 0;
28422   while (++i$1 < 106) {
28423       utilKeybinding.keyCodes['num-' + n] = i$1;
28424       ++n;
28425   }
28426
28427   // 0-9
28428   i$1 = 47; n = 0;
28429   while (++i$1 < 58) {
28430       utilKeybinding.keyCodes[n] = i$1;
28431       ++n;
28432   }
28433
28434   // F1-F25
28435   i$1 = 111; n = 1;
28436   while (++i$1 < 136) {
28437       utilKeybinding.keyCodes['f' + n] = i$1;
28438       ++n;
28439   }
28440
28441   // a-z
28442   i$1 = 64;
28443   while (++i$1 < 91) {
28444       utilKeybinding.keyCodes[String.fromCharCode(i$1).toLowerCase()] = i$1;
28445   }
28446
28447   // Copies a variable number of methods from source to target.
28448   function utilRebind(target, source) {
28449       var i = 1, n = arguments.length, method;
28450       while (++i < n) {
28451           target[method = arguments[i]] = d3_rebind(target, source, source[method]);
28452       }
28453       return target;
28454   }
28455
28456   // Method is assumed to be a standard D3 getter-setter:
28457   // If passed with no arguments, gets the value.
28458   // If passed with arguments, sets the value and returns the target.
28459   function d3_rebind(target, source, method) {
28460       return function() {
28461           var value = method.apply(source, arguments);
28462           return value === source ? target : value;
28463       };
28464   }
28465
28466   // A per-domain session mutex backed by a cookie and dead man's
28467   // switch. If the session crashes, the mutex will auto-release
28468   // after 5 seconds.
28469
28470   // This accepts a string and returns an object that complies with utilSessionMutexType
28471   function utilSessionMutex(name) {
28472       var mutex = {};
28473       var intervalID;
28474
28475       function renew() {
28476           var expires = new Date();
28477           expires.setSeconds(expires.getSeconds() + 5);
28478           document.cookie = name + '=1; expires=' + expires.toUTCString();
28479       }
28480
28481       mutex.lock = function () {
28482           if (intervalID) return true;
28483           var cookie = document.cookie.replace(new RegExp('(?:(?:^|.*;)\\s*' + name + '\\s*\\=\\s*([^;]*).*$)|^.*$'), '$1');
28484           if (cookie) return false;
28485           renew();
28486           intervalID = window.setInterval(renew, 4000);
28487           return true;
28488       };
28489
28490       mutex.unlock = function () {
28491           if (!intervalID) return;
28492           document.cookie = name + '=; expires=Thu, 01 Jan 1970 00:00:00 GMT';
28493           clearInterval(intervalID);
28494           intervalID = null;
28495       };
28496
28497       mutex.locked = function () {
28498           return !!intervalID;
28499       };
28500
28501       return mutex;
28502   }
28503
28504   function utilTiler() {
28505       var _size = [256, 256];
28506       var _scale = 256;
28507       var _tileSize = 256;
28508       var _zoomExtent = [0, 20];
28509       var _translate = [_size[0] / 2, _size[1] / 2];
28510       var _margin = 0;
28511       var _skipNullIsland = false;
28512
28513
28514       function clamp(num, min$$1, max$$1) {
28515           return Math.max(min$$1, Math.min(num, max$$1));
28516       }
28517
28518
28519       function nearNullIsland(tile) {
28520           var x = tile[0];
28521           var y = tile[1];
28522           var z = tile[2];
28523           if (z >= 7) {
28524               var center = Math.pow(2, z - 1);
28525               var width = Math.pow(2, z - 6);
28526               var min$$1 = center - (width / 2);
28527               var max$$1 = center + (width / 2) - 1;
28528               return x >= min$$1 && x <= max$$1 && y >= min$$1 && y <= max$$1;
28529           }
28530           return false;
28531       }
28532
28533
28534       function tiler() {
28535           var z = geoScaleToZoom(_scale / (2 * Math.PI), _tileSize);
28536           var z0 = clamp(Math.round(z), _zoomExtent[0], _zoomExtent[1]);
28537           var tileMin = 0;
28538           var tileMax = Math.pow(2, z0) - 1;
28539           var log2ts = Math.log(_tileSize) * Math.LOG2E;
28540           var k = Math.pow(2, z - z0 + log2ts);
28541           var origin = [
28542               (_translate[0] - _scale / 2) / k,
28543               (_translate[1] - _scale / 2) / k
28544           ];
28545
28546           var cols = range(
28547               clamp(Math.floor(-origin[0]) - _margin,               tileMin, tileMax + 1),
28548               clamp(Math.ceil(_size[0] / k - origin[0]) + _margin,  tileMin, tileMax + 1)
28549           );
28550           var rows = range(
28551               clamp(Math.floor(-origin[1]) - _margin,               tileMin, tileMax + 1),
28552               clamp(Math.ceil(_size[1] / k - origin[1]) + _margin,  tileMin, tileMax + 1)
28553           );
28554
28555           var tiles = [];
28556           for (var i = 0; i < rows.length; i++) {
28557               var y = rows[i];
28558               for (var j = 0; j < cols.length; j++) {
28559                   var x = cols[j];
28560
28561                   if (i >= _margin && i <= rows.length - _margin &&
28562                       j >= _margin && j <= cols.length - _margin) {
28563                       tiles.unshift([x, y, z0]);  // tiles in view at beginning
28564                   } else {
28565                       tiles.push([x, y, z0]);     // tiles in margin at the end
28566                   }
28567               }
28568           }
28569
28570           tiles.translate = origin;
28571           tiles.scale = k;
28572
28573           return tiles;
28574       }
28575
28576
28577       /**
28578        * getTiles() returns an array of tiles that cover the map view
28579        */
28580       tiler.getTiles = function(projection) {
28581           var origin = [
28582               projection.scale() * Math.PI - projection.translate()[0],
28583               projection.scale() * Math.PI - projection.translate()[1]
28584           ];
28585
28586           this
28587               .size(projection.clipExtent()[1])
28588               .scale(projection.scale() * 2 * Math.PI)
28589               .translate(projection.translate());
28590
28591           var tiles = tiler();
28592           var ts = tiles.scale;
28593
28594           return tiles
28595               .map(function(tile) {
28596                   if (_skipNullIsland && nearNullIsland(tile)) {
28597                       return false;
28598                   }
28599                   var x = tile[0] * ts - origin[0];
28600                   var y = tile[1] * ts - origin[1];
28601                   return {
28602                       id: tile.toString(),
28603                       xyz: tile,
28604                       extent: geoExtent$$1(
28605                           projection.invert([x, y + ts]),
28606                           projection.invert([x + ts, y])
28607                       )
28608                   };
28609               }).filter(Boolean);
28610       };
28611
28612
28613       /**
28614        * getGeoJSON() returns a FeatureCollection for debugging tiles
28615        */
28616       tiler.getGeoJSON = function(projection) {
28617           var features = tiler.getTiles(projection).map(function(tile) {
28618               return {
28619                   type: 'Feature',
28620                   properties: {
28621                       id: tile.id,
28622                       name: tile.id
28623                   },
28624                   geometry: {
28625                       type: 'Polygon',
28626                       coordinates: [ tile.extent.polygon() ]
28627                   }
28628               };
28629           });
28630
28631           return {
28632               type: 'FeatureCollection',
28633               features: features
28634           };
28635       };
28636
28637
28638       tiler.tileSize = function(val) {
28639           if (!arguments.length) return _tileSize;
28640           _tileSize = val;
28641           return tiler;
28642       };
28643
28644
28645       tiler.zoomExtent = function(val) {
28646           if (!arguments.length) return _zoomExtent;
28647           _zoomExtent = val;
28648           return tiler;
28649       };
28650
28651
28652       tiler.size = function(val) {
28653           if (!arguments.length) return _size;
28654           _size = val;
28655           return tiler;
28656       };
28657
28658
28659       tiler.scale = function(val) {
28660           if (!arguments.length) return _scale;
28661           _scale = val;
28662           return tiler;
28663       };
28664
28665
28666       tiler.translate = function(val) {
28667           if (!arguments.length) return _translate;
28668           _translate = val;
28669           return tiler;
28670       };
28671
28672
28673       // number to extend the rows/columns beyond those covering the viewport
28674       tiler.margin = function(val) {
28675           if (!arguments.length) return _margin;
28676           _margin = +val;
28677           return tiler;
28678       };
28679
28680
28681       tiler.skipNullIsland = function(val) {
28682           if (!arguments.length) return _skipNullIsland;
28683           _skipNullIsland = val;
28684           return tiler;
28685       };
28686
28687
28688       return tiler;
28689   }
28690
28691   function utilTriggerEvent(target, type) {
28692       target.each(function() {
28693           var evt = document.createEvent('HTMLEvents');
28694           evt.initEvent(type, true, true);
28695           this.dispatchEvent(evt);
28696       });
28697   }
28698
28699   function validationDeprecatedTag() {
28700
28701       var validation = function(changes) {
28702           var warnings = [];
28703           for (var i = 0; i < changes.created.length; i++) {
28704               var change = changes.created[i],
28705                   deprecatedTags = change.deprecatedTags();
28706
28707               if (!isEmpty(deprecatedTags)) {
28708                   var tags = utilTagText({ tags: deprecatedTags });
28709                   warnings.push({
28710                       id: 'deprecated_tags',
28711                       message: t('validations.deprecated_tags', { tags: tags }),
28712                       entity: change
28713                   });
28714               }
28715           }
28716
28717           return warnings;
28718       };
28719
28720
28721       return validation;
28722   }
28723
28724   function validationDisconnectedHighway() {
28725
28726       function isDisconnectedHighway(entity, graph) {
28727           if (!entity.tags.highway) return false;
28728           if (entity.geometry(graph) !== 'line') return false;
28729
28730           return graph.childNodes(entity)
28731               .every(function(vertex) {
28732                   var parents = graph.parentWays(vertex);
28733                   if (parents.length === 1) {  // standalone vertex
28734                       return true;
28735                   } else {                     // shared vertex
28736                       return !vertex.tags.entrance &&
28737                           parents.filter(function(parent) {
28738                               return parent.tags.highway && parent !== entity;
28739                           }).length === 0;
28740                   }
28741               });
28742       }
28743
28744
28745       var validation = function(changes, graph) {
28746           var warnings = [];
28747           for (var i = 0; i < changes.created.length; i++) {
28748               var entity = changes.created[i];
28749
28750               if (isDisconnectedHighway(entity, graph)) {
28751                   warnings.push({
28752                       id: 'disconnected_highway',
28753                       message: t('validations.disconnected_highway'),
28754                       tooltip: t('validations.disconnected_highway_tooltip'),
28755                       entity: entity
28756                   });
28757               }
28758           }
28759
28760           return warnings;
28761       };
28762
28763
28764       return validation;
28765   }
28766
28767   function validationManyDeletions() {
28768       var threshold = 100;
28769
28770       var validation = function(changes, graph) {
28771           var warnings = [];
28772           var nodes=0, ways=0, areas=0, relations=0;
28773
28774           changes.deleted.forEach(function(c) {
28775               if (c.type === 'node') {nodes++;}
28776               else if (c.type === 'way' && c.geometry(graph) === 'line') {ways++;}
28777               else if (c.type === 'way' && c.geometry(graph) === 'area') {areas++;}
28778               else if (c.type === 'relation') {relations++;}
28779           });
28780           if (changes.deleted.length > threshold) {
28781               warnings.push({
28782                   id: 'many_deletions',
28783                   message: t('validations.many_deletions',
28784                       { n: changes.deleted.length, p: nodes, l: ways, a:areas, r: relations })
28785               });
28786           }
28787
28788           return warnings;
28789       };
28790
28791
28792       return validation;
28793   }
28794
28795   function validationMissingTag() {
28796
28797       // Slightly stricter check than Entity#isUsed (#3091)
28798       function hasTags(entity, graph) {
28799           return without(Object.keys(entity.tags), 'area', 'name').length > 0 ||
28800               graph.parentRelations(entity).length > 0;
28801       }
28802
28803       var validation = function(changes, graph) {
28804           var types = ['point', 'line', 'area', 'relation'],
28805               warnings = [];
28806
28807           for (var i = 0; i < changes.created.length; i++) {
28808               var change = changes.created[i],
28809                   geometry = change.geometry(graph);
28810
28811               if (types.indexOf(geometry) !== -1 && !hasTags(change, graph)) {
28812                   warnings.push({
28813                       id: 'missing_tag',
28814                       message: t('validations.untagged_' + geometry),
28815                       tooltip: t('validations.untagged_' + geometry + '_tooltip'),
28816                       entity: change
28817                   });
28818               }
28819           }
28820
28821           return warnings;
28822       };
28823
28824
28825       return validation;
28826   }
28827
28828   function validationOldMultipolygon() {
28829
28830       return function validation(changes, graph) {
28831           var warnings = [];
28832           for (var i = 0; i < changes.created.length; i++) {
28833               var entity = changes.created[i];
28834               var parent = osmIsSimpleMultipolygonOuterMember(entity, graph);
28835               if (parent) {
28836                   warnings.push({
28837                       id: 'old_multipolygon',
28838                       message: t('validations.old_multipolygon'),
28839                       tooltip: t('validations.old_multipolygon_tooltip'),
28840                       entity: parent
28841                   });
28842               }
28843           }
28844           return warnings;
28845       };
28846   }
28847
28848   // https://github.com/openstreetmap/josm/blob/mirror/src/org/
28849   // openstreetmap/josm/data/validation/tests/UnclosedWays.java#L80
28850   function validationTagSuggestsArea() {
28851
28852       function tagSuggestsArea(tags) {
28853           if (isEmpty(tags)) return false;
28854
28855           var presence = ['landuse', 'amenities', 'tourism', 'shop'];
28856           for (var i = 0; i < presence.length; i++) {
28857               if (tags[presence[i]] !== undefined) {
28858                   if (presence[i] === 'tourism' && tags[presence[i]] === 'artwork') {
28859                       continue;   // exception for tourism=artwork - #5206
28860                   } else {
28861                       return presence[i] + '=' + tags[presence[i]];
28862                   }
28863               }
28864           }
28865
28866           if (tags.building && tags.building === 'yes') return 'building=yes';
28867       }
28868
28869
28870       var validation = function(changes, graph) {
28871           var warnings = [];
28872           for (var i = 0; i < changes.created.length; i++) {
28873               var change = changes.created[i],
28874                   geometry = change.geometry(graph),
28875                   suggestion = (geometry === 'line' ? tagSuggestsArea(change.tags) : undefined);
28876
28877               if (suggestion) {
28878                   warnings.push({
28879                       id: 'tag_suggests_area',
28880                       message: t('validations.tag_suggests_area', { tag: suggestion }),
28881                       entity: change
28882                   });
28883               }
28884           }
28885
28886           return warnings;
28887       };
28888
28889
28890       return validation;
28891   }
28892
28893
28894
28895   var Validations = /*#__PURE__*/Object.freeze({
28896     validationDeprecatedTag: validationDeprecatedTag,
28897     validationDisconnectedHighway: validationDisconnectedHighway,
28898     validationManyDeletions: validationManyDeletions,
28899     validationMissingTag: validationMissingTag,
28900     validationOldMultipolygon: validationOldMultipolygon,
28901     validationTagSuggestsArea: validationTagSuggestsArea
28902   });
28903
28904   /**
28905    * Performs a deep comparison between two values to determine if they are
28906    * equivalent.
28907    *
28908    * **Note:** This method supports comparing arrays, array buffers, booleans,
28909    * date objects, error objects, maps, numbers, `Object` objects, regexes,
28910    * sets, strings, symbols, and typed arrays. `Object` objects are compared
28911    * by their own, not inherited, enumerable properties. Functions and DOM
28912    * nodes are compared by strict equality, i.e. `===`.
28913    *
28914    * @static
28915    * @memberOf _
28916    * @since 0.1.0
28917    * @category Lang
28918    * @param {*} value The value to compare.
28919    * @param {*} other The other value to compare.
28920    * @returns {boolean} Returns `true` if the values are equivalent, else `false`.
28921    * @example
28922    *
28923    * var object = { 'a': 1 };
28924    * var other = { 'a': 1 };
28925    *
28926    * _.isEqual(object, other);
28927    * // => true
28928    *
28929    * object === other;
28930    * // => false
28931    */
28932   function isEqual(value, other) {
28933     return baseIsEqual(value, other);
28934   }
28935
28936   /*
28937       iD.Difference represents the difference between two graphs.
28938       It knows how to calculate the set of entities that were
28939       created, modified, or deleted, and also contains the logic
28940       for recursively extending a difference to the complete set
28941       of entities that will require a redraw, taking into account
28942       child and parent relationships.
28943    */
28944   function coreDifference(base, head) {
28945       var _changes = {};
28946       var _diff = {};
28947       var _length = 0;
28948       var i, k, h, b, keys;
28949
28950       function changed(h, b) {
28951           if (h === b) return false;
28952           if (!h || !b) return true;
28953
28954           if (h.loc || b.loc) {
28955               if (!h.loc && b.loc || h.loc && !b.loc ||
28956                   h.loc[0] !== b.loc[0] || h.loc[1] !== b.loc[1]) return true;
28957           }
28958           if (h.nodes || b.nodes) {
28959               if (!isEqual(h.nodes, b.nodes)) return true;
28960           }
28961           if (h.members || b.members) {
28962               if (!isEqual(h.members, b.members)) return true;
28963           }
28964           return !isEqual(h.tags, b.tags);
28965       }
28966
28967
28968       keys = Object.keys(head.entities);
28969       for (i = 0; i < keys.length; i++) {
28970           k = keys[i];
28971           h = head.entities[k];
28972           b = base.entities[k];
28973           if (changed(h, b)) {
28974               _changes[k] = {base: b, head: h};
28975               _length++;
28976           }
28977       }
28978
28979       keys = Object.keys(base.entities);
28980       for (i = 0; i < keys.length; i++) {
28981           k = keys[i];
28982           h = head.entities[k];
28983           b = base.entities[k];
28984           if (!_changes[k] && changed(h, b)) {
28985               _changes[k] = {base: b, head: h};
28986               _length++;
28987           }
28988       }
28989
28990
28991       function addParents(parents, result) {
28992           for (var i = 0; i < parents.length; i++) {
28993               var parent = parents[i];
28994
28995               if (parent.id in result)
28996                   continue;
28997
28998               result[parent.id] = parent;
28999               addParents(head.parentRelations(parent), result);
29000           }
29001       }
29002
29003
29004       _diff.length = function length() {
29005           return _length;
29006       };
29007
29008
29009       _diff.changes = function changes() {
29010           return _changes;
29011       };
29012
29013
29014       _diff.extantIDs = function extantIDs() {
29015           var result = [];
29016           forEach(_changes, function(change, id) {
29017               if (change.head) result.push(id);
29018           });
29019           return result;
29020       };
29021
29022
29023       _diff.modified = function modified() {
29024           var result = [];
29025           forEach(_changes, function(change) {
29026               if (change.base && change.head) result.push(change.head);
29027           });
29028           return result;
29029       };
29030
29031
29032       _diff.created = function created() {
29033           var result = [];
29034           forEach(_changes, function(change) {
29035               if (!change.base && change.head) result.push(change.head);
29036           });
29037           return result;
29038       };
29039
29040
29041       _diff.deleted = function deleted() {
29042           var result = [];
29043           forEach(_changes, function(change) {
29044               if (change.base && !change.head) result.push(change.base);
29045           });
29046           return result;
29047       };
29048
29049
29050       _diff.summary = function summary() {
29051           var relevant = {};
29052
29053           function addEntity(entity, graph, changeType) {
29054               relevant[entity.id] = {
29055                   entity: entity,
29056                   graph: graph,
29057                   changeType: changeType
29058               };
29059           }
29060
29061           function addParents(entity) {
29062               var parents = head.parentWays(entity);
29063               for (var j = parents.length - 1; j >= 0; j--) {
29064                   var parent = parents[j];
29065                   if (!(parent.id in relevant)) addEntity(parent, head, 'modified');
29066               }
29067           }
29068
29069           var keys = Object.keys(_changes);
29070           for (var i = 0; i < keys.length; i++) {
29071               var change = _changes[keys[i]];
29072
29073               if (change.head && change.head.geometry(head) !== 'vertex') {
29074                   addEntity(change.head, head, change.base ? 'modified' : 'created');
29075
29076               } else if (change.base && change.base.geometry(base) !== 'vertex') {
29077                   addEntity(change.base, base, 'deleted');
29078
29079               } else if (change.base && change.head) { // modified vertex
29080                   var moved    = !isEqual(change.base.loc,  change.head.loc);
29081                   var retagged = !isEqual(change.base.tags, change.head.tags);
29082
29083                   if (moved) {
29084                       addParents(change.head);
29085                   }
29086
29087                   if (retagged || (moved && change.head.hasInterestingTags())) {
29088                       addEntity(change.head, head, 'modified');
29089                   }
29090
29091               } else if (change.head && change.head.hasInterestingTags()) { // created vertex
29092                   addEntity(change.head, head, 'created');
29093
29094               } else if (change.base && change.base.hasInterestingTags()) { // deleted vertex
29095                   addEntity(change.base, base, 'deleted');
29096               }
29097           }
29098
29099           return values$1(relevant);
29100       };
29101
29102
29103       _diff.complete = function complete(extent) {
29104           var result = {};
29105           var id, change;
29106
29107           for (id in _changes) {
29108               change = _changes[id];
29109
29110               var h = change.head;
29111               var b = change.base;
29112               var entity = h || b;
29113
29114               if (extent &&
29115                   (!h || !h.intersects(extent, head)) &&
29116                   (!b || !b.intersects(extent, base)))
29117                   continue;
29118
29119               result[id] = h;
29120
29121               if (entity.type === 'way') {
29122                   var nh = h ? h.nodes : [];
29123                   var nb = b ? b.nodes : [];
29124                   var diff, i;
29125
29126                   diff = difference(nh, nb);
29127                   for (i = 0; i < diff.length; i++) {
29128                       result[diff[i]] = head.hasEntity(diff[i]);
29129                   }
29130
29131                   diff = difference(nb, nh);
29132                   for (i = 0; i < diff.length; i++) {
29133                       result[diff[i]] = head.hasEntity(diff[i]);
29134                   }
29135               }
29136
29137               addParents(head.parentWays(entity), result);
29138               addParents(head.parentRelations(entity), result);
29139           }
29140
29141           return result;
29142       };
29143
29144
29145       return _diff;
29146   }
29147
29148   /** Used for built-in method references. */
29149   var objectProto$i = Object.prototype;
29150
29151   /** Used to check objects for own properties. */
29152   var hasOwnProperty$f = objectProto$i.hasOwnProperty;
29153
29154   /**
29155    * Assigns own enumerable string keyed properties of source objects to the
29156    * destination object. Source objects are applied from left to right.
29157    * Subsequent sources overwrite property assignments of previous sources.
29158    *
29159    * **Note:** This method mutates `object` and is loosely based on
29160    * [`Object.assign`](https://mdn.io/Object/assign).
29161    *
29162    * @static
29163    * @memberOf _
29164    * @since 0.10.0
29165    * @category Object
29166    * @param {Object} object The destination object.
29167    * @param {...Object} [sources] The source objects.
29168    * @returns {Object} Returns `object`.
29169    * @see _.assignIn
29170    * @example
29171    *
29172    * function Foo() {
29173    *   this.a = 1;
29174    * }
29175    *
29176    * function Bar() {
29177    *   this.c = 3;
29178    * }
29179    *
29180    * Foo.prototype.b = 2;
29181    * Bar.prototype.d = 4;
29182    *
29183    * _.assign({ 'a': 0 }, new Foo, new Bar);
29184    * // => { 'a': 1, 'c': 3 }
29185    */
29186   var assign = createAssigner(function(object, source) {
29187     if (isPrototype(source) || isArrayLike(source)) {
29188       copyObject(source, keys$1(source), object);
29189       return;
29190     }
29191     for (var key in source) {
29192       if (hasOwnProperty$f.call(source, key)) {
29193         assignValue(object, key, source[key]);
29194       }
29195     }
29196   });
29197
29198   /* Built-in method references for those with the same name as other `lodash` methods. */
29199   var nativeMax$3 = Math.max;
29200
29201   /**
29202    * Checks if `value` is in `collection`. If `collection` is a string, it's
29203    * checked for a substring of `value`, otherwise
29204    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
29205    * is used for equality comparisons. If `fromIndex` is negative, it's used as
29206    * the offset from the end of `collection`.
29207    *
29208    * @static
29209    * @memberOf _
29210    * @since 0.1.0
29211    * @category Collection
29212    * @param {Array|Object|string} collection The collection to inspect.
29213    * @param {*} value The value to search for.
29214    * @param {number} [fromIndex=0] The index to search from.
29215    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.
29216    * @returns {boolean} Returns `true` if `value` is found, else `false`.
29217    * @example
29218    *
29219    * _.includes([1, 2, 3], 1);
29220    * // => true
29221    *
29222    * _.includes([1, 2, 3], 1, 2);
29223    * // => false
29224    *
29225    * _.includes({ 'a': 1, 'b': 2 }, 1);
29226    * // => true
29227    *
29228    * _.includes('abcd', 'bc');
29229    * // => true
29230    */
29231   function includes(collection, value, fromIndex, guard) {
29232     collection = isArrayLike(collection) ? collection : values$1(collection);
29233     fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;
29234
29235     var length = collection.length;
29236     if (fromIndex < 0) {
29237       fromIndex = nativeMax$3(length + fromIndex, 0);
29238     }
29239     return isString(collection)
29240       ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)
29241       : (!!length && baseIndexOf(collection, value, fromIndex) > -1);
29242   }
29243
29244   function coreGraph$$1(other, mutable) {
29245       if (!(this instanceof coreGraph$$1)) return new coreGraph$$1(other, mutable);
29246
29247       if (other instanceof coreGraph$$1) {
29248           var base = other.base();
29249           this.entities = assign(Object.create(base.entities), other.entities);
29250           this._parentWays = assign(Object.create(base.parentWays), other._parentWays);
29251           this._parentRels = assign(Object.create(base.parentRels), other._parentRels);
29252
29253       } else {
29254           this.entities = Object.create({});
29255           this._parentWays = Object.create({});
29256           this._parentRels = Object.create({});
29257           this.rebase(other || [], [this]);
29258       }
29259
29260       this.transients = {};
29261       this._childNodes = {};
29262       this.frozen = !mutable;
29263   }
29264
29265
29266   coreGraph$$1.prototype = {
29267
29268       hasEntity: function(id) {
29269           return this.entities[id];
29270       },
29271
29272
29273       entity: function(id) {
29274           var entity = this.entities[id];
29275
29276           //https://github.com/openstreetmap/iD/issues/3973#issuecomment-307052376
29277           if (!entity) {
29278               entity = this.entities.__proto__[id];  // eslint-disable-line no-proto
29279           }
29280
29281           if (!entity) {
29282               throw new Error('entity ' + id + ' not found');
29283           }
29284           return entity;
29285       },
29286
29287
29288       transient: function(entity, key, fn) {
29289           var id = entity.id;
29290           var transients = this.transients[id] || (this.transients[id] = {});
29291
29292           if (transients[key] !== undefined) {
29293               return transients[key];
29294           }
29295
29296           transients[key] = fn.call(entity);
29297
29298           return transients[key];
29299       },
29300
29301
29302       parentWays: function(entity) {
29303           var parents = this._parentWays[entity.id];
29304           var result = [];
29305
29306           if (parents) {
29307               for (var i = 0; i < parents.length; i++) {
29308                   result.push(this.entity(parents[i]));
29309               }
29310           }
29311           return result;
29312       },
29313
29314
29315       isPoi: function(entity) {
29316           var parentWays = this._parentWays[entity.id];
29317           return !parentWays || parentWays.length === 0;
29318       },
29319
29320
29321       isShared: function(entity) {
29322           var parentWays = this._parentWays[entity.id];
29323           return parentWays && parentWays.length > 1;
29324       },
29325
29326
29327       parentRelations: function(entity) {
29328           var parents = this._parentRels[entity.id];
29329           var result = [];
29330
29331           if (parents) {
29332               for (var i = 0; i < parents.length; i++) {
29333                   result.push(this.entity(parents[i]));
29334               }
29335           }
29336           return result;
29337       },
29338
29339
29340       childNodes: function(entity) {
29341           if (this._childNodes[entity.id]) return this._childNodes[entity.id];
29342           if (!entity.nodes) return [];
29343
29344           var nodes = [];
29345           for (var i = 0; i < entity.nodes.length; i++) {
29346               nodes[i] = this.entity(entity.nodes[i]);
29347           }
29348
29349           this._childNodes[entity.id] = nodes;
29350           return this._childNodes[entity.id];
29351       },
29352
29353
29354       base: function() {
29355           return {
29356               'entities': utilGetPrototypeOf(this.entities),
29357               'parentWays': utilGetPrototypeOf(this._parentWays),
29358               'parentRels': utilGetPrototypeOf(this._parentRels)
29359           };
29360       },
29361
29362
29363       // Unlike other graph methods, rebase mutates in place. This is because it
29364       // is used only during the history operation that merges newly downloaded
29365       // data into each state. To external consumers, it should appear as if the
29366       // graph always contained the newly downloaded data.
29367       rebase: function(entities, stack, force) {
29368           var base = this.base();
29369           var i, j, k, id;
29370
29371           for (i = 0; i < entities.length; i++) {
29372               var entity = entities[i];
29373
29374               if (!entity.visible || (!force && base.entities[entity.id]))
29375                   continue;
29376
29377               // Merging data into the base graph
29378               base.entities[entity.id] = entity;
29379               this._updateCalculated(undefined, entity, base.parentWays, base.parentRels);
29380
29381               // Restore provisionally-deleted nodes that are discovered to have an extant parent
29382               if (entity.type === 'way') {
29383                   for (j = 0; j < entity.nodes.length; j++) {
29384                       id = entity.nodes[j];
29385                       for (k = 1; k < stack.length; k++) {
29386                           var ents = stack[k].entities;
29387                           if (ents.hasOwnProperty(id) && ents[id] === undefined) {
29388                               delete ents[id];
29389                           }
29390                       }
29391                   }
29392               }
29393           }
29394
29395           for (i = 0; i < stack.length; i++) {
29396               stack[i]._updateRebased();
29397           }
29398       },
29399
29400
29401       _updateRebased: function() {
29402           var base = this.base();
29403           var i, k, child, id, keys;
29404
29405           keys = Object.keys(this._parentWays);
29406           for (i = 0; i < keys.length; i++) {
29407               child = keys[i];
29408               if (base.parentWays[child]) {
29409                   for (k = 0; k < base.parentWays[child].length; k++) {
29410                       id = base.parentWays[child][k];
29411                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentWays[child], id)) {
29412                           this._parentWays[child].push(id);
29413                       }
29414                   }
29415               }
29416           }
29417
29418           keys = Object.keys(this._parentRels);
29419           for (i = 0; i < keys.length; i++) {
29420               child = keys[i];
29421               if (base.parentRels[child]) {
29422                   for (k = 0; k < base.parentRels[child].length; k++) {
29423                       id = base.parentRels[child][k];
29424                       if (!this.entities.hasOwnProperty(id) && !includes(this._parentRels[child], id)) {
29425                           this._parentRels[child].push(id);
29426                       }
29427                   }
29428               }
29429           }
29430
29431           this.transients = {};
29432
29433           // this._childNodes is not updated, under the assumption that
29434           // ways are always downloaded with their child nodes.
29435       },
29436
29437
29438       // Updates calculated properties (parentWays, parentRels) for the specified change
29439       _updateCalculated: function(oldentity, entity, parentWays, parentRels) {
29440           parentWays = parentWays || this._parentWays;
29441           parentRels = parentRels || this._parentRels;
29442
29443           var type = entity && entity.type || oldentity && oldentity.type;
29444           var removed, added, ways, rels, i;
29445
29446           if (type === 'way') {   // Update parentWays
29447               if (oldentity && entity) {
29448                   removed = difference(oldentity.nodes, entity.nodes);
29449                   added = difference(entity.nodes, oldentity.nodes);
29450               } else if (oldentity) {
29451                   removed = oldentity.nodes;
29452                   added = [];
29453               } else if (entity) {
29454                   removed = [];
29455                   added = entity.nodes;
29456               }
29457               for (i = 0; i < removed.length; i++) {
29458                   parentWays[removed[i]] = without(parentWays[removed[i]], oldentity.id);
29459               }
29460               for (i = 0; i < added.length; i++) {
29461                   ways = without(parentWays[added[i]], entity.id);
29462                   ways.push(entity.id);
29463                   parentWays[added[i]] = ways;
29464               }
29465
29466           } else if (type === 'relation') {   // Update parentRels
29467               if (oldentity && entity) {
29468                   removed = difference(oldentity.members, entity.members);
29469                   added = difference(entity.members, oldentity);
29470               } else if (oldentity) {
29471                   removed = oldentity.members;
29472                   added = [];
29473               } else if (entity) {
29474                   removed = [];
29475                   added = entity.members;
29476               }
29477               for (i = 0; i < removed.length; i++) {
29478                   parentRels[removed[i].id] = without(parentRels[removed[i].id], oldentity.id);
29479               }
29480               for (i = 0; i < added.length; i++) {
29481                   rels = without(parentRels[added[i].id], entity.id);
29482                   rels.push(entity.id);
29483                   parentRels[added[i].id] = rels;
29484               }
29485           }
29486       },
29487
29488
29489       replace: function(entity) {
29490           if (this.entities[entity.id] === entity) return this;
29491
29492           return this.update(function() {
29493               this._updateCalculated(this.entities[entity.id], entity);
29494               this.entities[entity.id] = entity;
29495           });
29496       },
29497
29498
29499       remove: function(entity) {
29500           return this.update(function() {
29501               this._updateCalculated(entity, undefined);
29502               this.entities[entity.id] = undefined;
29503           });
29504       },
29505
29506
29507       revert: function(id) {
29508           var baseEntity = this.base().entities[id];
29509           var headEntity = this.entities[id];
29510           if (headEntity === baseEntity) return this;
29511
29512           return this.update(function() {
29513               this._updateCalculated(headEntity, baseEntity);
29514               delete this.entities[id];
29515           });
29516       },
29517
29518
29519       update: function() {
29520           var graph = this.frozen ? coreGraph$$1(this, true) : this;
29521           for (var i = 0; i < arguments.length; i++) {
29522               arguments[i].call(graph, graph);
29523           }
29524
29525           if (this.frozen) graph.frozen = true;
29526
29527           return graph;
29528       },
29529
29530
29531       // Obliterates any existing entities
29532       load: function(entities) {
29533           var base = this.base();
29534           this.entities = Object.create(base.entities);
29535
29536           for (var i in entities) {
29537               this.entities[i] = entities[i];
29538               this._updateCalculated(base.entities[i], this.entities[i]);
29539           }
29540
29541           return this;
29542       }
29543   };
29544
29545   function coreTree(head) {
29546       var rtree = rbush_1(),
29547           bboxes = {},
29548           tree = {};
29549
29550
29551       function entityBBox(entity) {
29552           var bbox = entity.extent(head).bbox();
29553           bbox.id = entity.id;
29554           bboxes[entity.id] = bbox;
29555           return bbox;
29556       }
29557
29558
29559       function updateParents(entity, insertions, memo) {
29560           head.parentWays(entity).forEach(function(way) {
29561               if (bboxes[way.id]) {
29562                   rtree.remove(bboxes[way.id]);
29563                   insertions[way.id] = way;
29564               }
29565               updateParents(way, insertions, memo);
29566           });
29567
29568           head.parentRelations(entity).forEach(function(relation) {
29569               if (memo[entity.id]) return;
29570               memo[entity.id] = true;
29571               if (bboxes[relation.id]) {
29572                   rtree.remove(bboxes[relation.id]);
29573                   insertions[relation.id] = relation;
29574               }
29575               updateParents(relation, insertions, memo);
29576           });
29577       }
29578
29579
29580       tree.rebase = function(entities, force) {
29581           var insertions = {};
29582
29583           for (var i = 0; i < entities.length; i++) {
29584               var entity = entities[i];
29585
29586               if (!entity.visible)
29587                   continue;
29588
29589               if (head.entities.hasOwnProperty(entity.id) || bboxes[entity.id]) {
29590                   if (!force) {
29591                       continue;
29592                   } else if (bboxes[entity.id]) {
29593                       rtree.remove(bboxes[entity.id]);
29594                   }
29595               }
29596
29597               insertions[entity.id] = entity;
29598               updateParents(entity, insertions, {});
29599           }
29600
29601           rtree.load(map$3(insertions, entityBBox));
29602
29603           return tree;
29604       };
29605
29606
29607       tree.intersects = function(extent, graph) {
29608           if (graph !== head) {
29609               var diff = coreDifference(head, graph),
29610                   insertions = {};
29611
29612               head = graph;
29613
29614               diff.deleted().forEach(function(entity) {
29615                   rtree.remove(bboxes[entity.id]);
29616                   delete bboxes[entity.id];
29617               });
29618
29619               diff.modified().forEach(function(entity) {
29620                   rtree.remove(bboxes[entity.id]);
29621                   insertions[entity.id] = entity;
29622                   updateParents(entity, insertions, {});
29623               });
29624
29625               diff.created().forEach(function(entity) {
29626                   insertions[entity.id] = entity;
29627               });
29628
29629               rtree.load(map$3(insertions, entityBBox));
29630           }
29631
29632           return rtree.search(extent.bbox()).map(function(bbox) {
29633               return head.entity(bbox.id);
29634           });
29635       };
29636
29637
29638       return tree;
29639   }
29640
29641   var _tooltipID = 0;
29642
29643   function tooltip() {
29644       var _id = _tooltipID++;
29645       var tooltip = function(selection$$1) {
29646           selection$$1.each(setup);
29647       };
29648       var _animation = utilFunctor(false);
29649       var _title = function() {
29650           var title = this.getAttribute('data-original-title');
29651           if (title) {
29652               return title;
29653           } else {
29654               title = this.getAttribute('title');
29655               this.removeAttribute('title');
29656               this.setAttribute('data-original-title', title);
29657           }
29658           return title;
29659       };
29660       var _html = utilFunctor(false);
29661       var _placement = utilFunctor('top');
29662
29663
29664       tooltip.title = function(val) {
29665           if (arguments.length) {
29666               _title = utilFunctor(val);
29667               return tooltip;
29668           } else {
29669               return _title;
29670           }
29671       };
29672
29673
29674       tooltip.html = function(val) {
29675           if (arguments.length) {
29676               _html = utilFunctor(val);
29677               return tooltip;
29678           } else {
29679               return _html;
29680           }
29681       };
29682
29683
29684       tooltip.placement = function(val) {
29685           if (arguments.length) {
29686               _placement = utilFunctor(val);
29687               return tooltip;
29688           } else {
29689               return _placement;
29690           }
29691       };
29692
29693
29694       tooltip.show = function(selection$$1) {
29695           selection$$1.each(show);
29696       };
29697
29698
29699       tooltip.hide = function(selection$$1) {
29700           selection$$1.each(hide);
29701       };
29702
29703
29704       tooltip.toggle = function(selection$$1) {
29705           selection$$1.each(toggle);
29706       };
29707
29708
29709       tooltip.destroy = function(selection$$1, selector$$1) {
29710           // by default, just destroy the current tooltip
29711           selector$$1 = selector$$1 || '.tooltip-' + _id;
29712
29713           selection$$1
29714               .on('mouseenter.tooltip', null)
29715               .on('mouseleave.tooltip', null)
29716               .attr('title', function() {
29717                   return this.getAttribute('data-original-title') || this.getAttribute('title');
29718               })
29719               .attr('data-original-title', null)
29720               .selectAll(selector$$1)
29721               .remove();
29722       };
29723
29724
29725       tooltip.destroyAny = function(selection$$1) {
29726           selection$$1.call(tooltip.destroy, '.tooltip');
29727       };
29728
29729
29730       function setup() {
29731           var root = select(this);
29732           var animate = _animation.apply(this, arguments);
29733           var tip = root.selectAll('.tooltip-' + _id)
29734               .data([0]);
29735
29736           var enter = tip.enter()
29737               .append('div')
29738               .attr('class', 'tooltip tooltip-' + _id);
29739
29740           enter
29741               .append('div')
29742               .attr('class', 'tooltip-arrow');
29743
29744           enter
29745               .append('div')
29746               .attr('class', 'tooltip-inner');
29747
29748           tip = enter
29749               .merge(tip);
29750
29751           if (animate) {
29752               tip.classed('fade', true);
29753           }
29754
29755           var place = _placement.apply(this, arguments);
29756           tip.classed(place, true);
29757
29758           root.on('mouseenter.tooltip', show);
29759           root.on('mouseleave.tooltip', hide);
29760       }
29761
29762
29763       function show() {
29764           var root = select(this);
29765           var content = _title.apply(this, arguments);
29766           var tip = root.selectAll('.tooltip-' + _id);
29767
29768           if (tip.empty()) {   // tooltip was removed somehow, put it back
29769               root.call(tooltip.destroy);
29770               root.each(setup);
29771               tip = root.selectAll('.tooltip-' + _id);
29772           }
29773
29774           tip.classed('in', true);
29775           var markup = _html.apply(this, arguments);
29776
29777           tip.selectAll('.tooltip-inner')[markup ? 'html' : 'text'](content);
29778           var place = _placement.apply(this, arguments);
29779           var outer = getPosition(root.node());
29780           var inner = getPosition(tip.node());
29781           var pos;
29782
29783           switch (place) {
29784               case 'top':
29785               pos = { x: outer.x + (outer.w - inner.w) / 2, y: outer.y - inner.h };
29786               break;
29787               case 'right':
29788               pos = { x: outer.x + outer.w, y: outer.y + (outer.h - inner.h) / 2 };
29789               break;
29790               case 'left':
29791               pos = { x: outer.x - inner.w, y: outer.y + (outer.h - inner.h) / 2 };
29792               break;
29793               case 'bottom':
29794               pos = { x: Math.max(0, outer.x + (outer.w - inner.w) / 2), y: outer.y + outer.h };
29795               break;
29796           }
29797
29798           if (pos) {
29799               tip.style('left', ~~pos.x + 'px').style('top', ~~pos.y + 'px');
29800           } else {
29801               tip.style('left', null).style('top', null);
29802           }
29803
29804           this.tooltipVisible = true;
29805
29806
29807           function getPosition(node) {
29808               var mode = select(node).style('position');
29809               if (mode === 'absolute' || mode === 'static') {
29810                   return {
29811                       x: node.offsetLeft,
29812                       y: node.offsetTop,
29813                       w: node.offsetWidth,
29814                       h: node.offsetHeight
29815                   };
29816               } else {
29817                   return {
29818                       x: 0,
29819                       y: 0,
29820                       w: node.offsetWidth,
29821                       h: node.offsetHeight
29822                   };
29823               }
29824           }
29825       }
29826
29827
29828       function hide() {
29829           select(this).selectAll('.tooltip-' + _id).classed('in', false);
29830           this.tooltipVisible = false;
29831       }
29832
29833
29834       function toggle() {
29835           if (this.tooltipVisible) {
29836               hide.apply(this, arguments);
29837           } else {
29838               show.apply(this, arguments);
29839           }
29840       }
29841
29842
29843       return tooltip;
29844   }
29845
29846   function behaviorEdit(context) {
29847
29848       function behavior() {
29849           context.map()
29850               .minzoom(context.minEditableZoom());
29851       }
29852
29853
29854       behavior.off = function() {
29855           context.map()
29856               .minzoom(0);
29857       };
29858
29859       return behavior;
29860   }
29861
29862   /*
29863      The hover behavior adds the `.hover` class on mouseover to all elements to which
29864      the identical datum is bound, and removes it on mouseout.
29865
29866      The :hover pseudo-class is insufficient for iD's purposes because a datum's visual
29867      representation may consist of several elements scattered throughout the DOM hierarchy.
29868      Only one of these elements can have the :hover pseudo-class, but all of them will
29869      have the .hover class.
29870    */
29871   function behaviorHover(context) {
29872       var dispatch$$1 = dispatch('hover');
29873       var _selection = select(null);
29874       var _newId = null;
29875       var _buttonDown;
29876       var _altDisables;
29877       var _target;
29878
29879
29880       function keydown() {
29881           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
29882               _selection.selectAll('.hover')
29883                   .classed('hover-suppressed', true)
29884                   .classed('hover', false);
29885
29886               _selection
29887                   .classed('hover-disabled', true);
29888
29889               dispatch$$1.call('hover', this, null);
29890           }
29891       }
29892
29893
29894       function keyup() {
29895           if (_altDisables && event.keyCode === utilKeybinding.modifierCodes.alt) {
29896               _selection.selectAll('.hover-suppressed')
29897                   .classed('hover-suppressed', false)
29898                   .classed('hover', true);
29899
29900               _selection
29901                   .classed('hover-disabled', false);
29902
29903               dispatch$$1.call('hover', this, _target ? _target.id : null);
29904           }
29905       }
29906
29907
29908       function behavior(selection$$1) {
29909           _selection = selection$$1;
29910           _newId = null;
29911
29912           _selection
29913               .on('mouseover.hover', mouseover)
29914               .on('mouseout.hover', mouseout)
29915               .on('mousedown.hover', mousedown);
29916
29917           select(window)
29918               .on('keydown.hover', keydown)
29919               .on('keyup.hover', keyup);
29920
29921
29922           function mouseover() {
29923               if (_buttonDown) return;
29924               var target = event.target;
29925               enter(target ? target.__data__ : null);
29926           }
29927
29928
29929           function mouseout() {
29930               if (_buttonDown) return;
29931               var target = event.relatedTarget;
29932               enter(target ? target.__data__ : null);
29933           }
29934
29935
29936           function mousedown() {
29937               _buttonDown = true;
29938               select(window)
29939                   .on('mouseup.hover', mouseup, true);
29940           }
29941
29942
29943           function mouseup() {
29944               _buttonDown = false;
29945               select(window)
29946                   .on('mouseup.hover', null, true);
29947           }
29948
29949
29950           function enter(datum) {
29951               if (datum === _target) return;
29952               _target = datum;
29953
29954               _selection.selectAll('.hover')
29955                   .classed('hover', false);
29956               _selection.selectAll('.hover-suppressed')
29957                   .classed('hover-suppressed', false);
29958
29959               // What are we hovering over?
29960               var entity, selector$$1;
29961               if (datum && datum.__featurehash__) {
29962                   entity = datum;
29963                   selector$$1 = '.data' + datum.__featurehash__;
29964
29965               } else if (datum instanceof osmNote) {
29966                   entity = datum;
29967                   selector$$1 = '.note-' + datum.id;
29968
29969               } else if (datum instanceof osmEntity$$1) {
29970                   entity = datum;
29971                   selector$$1 = '.' + entity.id;
29972                   if (entity.type === 'relation') {
29973                       entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
29974                   }
29975
29976               } else if (datum && datum.properties && (datum.properties.entity instanceof osmEntity$$1)) {
29977                   entity = datum.properties.entity;
29978                   selector$$1 = '.' + entity.id;
29979                   if (entity.type === 'relation') {
29980                       entity.members.forEach(function(member) { selector$$1 += ', .' + member.id; });
29981                   }
29982               }
29983
29984               // Update hover state and dispatch event
29985               if (entity && entity.id !== _newId) {
29986                   // If drawing a way, don't hover on a node that was just placed. #3974
29987                   var mode = context.mode() && context.mode().id;
29988                   if ((mode === 'draw-line' || mode === 'draw-area') && !_newId && entity.type === 'node') {
29989                       _newId = entity.id;
29990                       return;
29991                   }
29992
29993                   var suppressed = _altDisables && event && event.altKey;
29994                   _selection.selectAll(selector$$1)
29995                       .classed(suppressed ? 'hover-suppressed' : 'hover', true);
29996
29997                   dispatch$$1.call('hover', this, !suppressed && entity);
29998
29999               } else {
30000                   dispatch$$1.call('hover', this, null);
30001               }
30002           }
30003       }
30004
30005
30006       behavior.off = function(selection$$1) {
30007           selection$$1.selectAll('.hover')
30008               .classed('hover', false);
30009           selection$$1.selectAll('.hover-suppressed')
30010               .classed('hover-suppressed', false);
30011           selection$$1
30012               .classed('hover-disabled', false);
30013
30014           selection$$1
30015               .on('mouseover.hover', null)
30016               .on('mouseout.hover', null)
30017               .on('mousedown.hover', null);
30018
30019           select(window)
30020               .on('keydown.hover', null)
30021               .on('keyup.hover', null);
30022       };
30023
30024
30025       behavior.altDisables = function(val) {
30026           if (!arguments.length) return _altDisables;
30027           _altDisables = val;
30028           return behavior;
30029       };
30030
30031
30032       return utilRebind(behavior, dispatch$$1, 'on');
30033   }
30034
30035   function refresh(selection, node) {
30036       var cr = node.getBoundingClientRect();
30037       var prop = [cr.width, cr.height];
30038       selection.property('__dimensions__', prop);
30039       return prop;
30040   }
30041
30042   function utilGetDimensions(selection, force) {
30043       if (!selection || selection.empty()) {
30044           return [0, 0];
30045       }
30046       var node = selection.node(),
30047           cached = selection.property('__dimensions__');
30048       return (!cached || force) ? refresh(selection, node) : cached;
30049   }
30050
30051
30052   function utilSetDimensions(selection, dimensions) {
30053       if (!selection || selection.empty()) {
30054           return selection;
30055       }
30056       var node = selection.node();
30057       if (dimensions === null) {
30058           refresh(selection, node);
30059           return selection;
30060       }
30061       return selection
30062           .property('__dimensions__', [dimensions[0], dimensions[1]])
30063           .attr('width', dimensions[0])
30064           .attr('height', dimensions[1]);
30065   }
30066
30067   function behaviorTail() {
30068       var container;
30069       var xmargin = 25;
30070       var tooltipSize = [0, 0];
30071       var selectionSize = [0, 0];
30072       var _text;
30073
30074
30075       function behavior(selection$$1) {
30076           if (!_text) return;
30077
30078           select(window)
30079               .on('resize.tail', function() { selectionSize = utilGetDimensions(selection$$1); });
30080
30081           container = select(document.body)
30082               .append('div')
30083               .style('display', 'none')
30084               .attr('class', 'tail tooltip-inner');
30085
30086           container.append('div')
30087               .text(_text);
30088
30089           selection$$1
30090               .on('mousemove.tail', mousemove)
30091               .on('mouseenter.tail', mouseenter)
30092               .on('mouseleave.tail', mouseleave);
30093
30094           container
30095               .on('mousemove.tail', mousemove);
30096
30097           tooltipSize = utilGetDimensions(container);
30098           selectionSize = utilGetDimensions(selection$$1);
30099
30100
30101           function show() {
30102               container.style('display', 'block');
30103               tooltipSize = utilGetDimensions(container);
30104           }
30105
30106
30107           function mousemove() {
30108               if (container.style('display') === 'none') show();
30109               var xoffset = ((event.clientX + tooltipSize[0] + xmargin) > selectionSize[0]) ?
30110                   -tooltipSize[0] - xmargin : xmargin;
30111               container.classed('left', xoffset > 0);
30112               utilSetTransform(container, event.clientX + xoffset, event.clientY);
30113           }
30114
30115
30116           function mouseleave() {
30117               if (event.relatedTarget !== container.node()) {
30118                   container.style('display', 'none');
30119               }
30120           }
30121
30122
30123           function mouseenter() {
30124               if (event.relatedTarget !== container.node()) {
30125                   show();
30126               }
30127           }
30128       }
30129
30130
30131       behavior.off = function(selection$$1) {
30132           if (!_text) return;
30133
30134           container
30135               .on('mousemove.tail', null)
30136               .remove();
30137
30138           selection$$1
30139               .on('mousemove.tail', null)
30140               .on('mouseenter.tail', null)
30141               .on('mouseleave.tail', null);
30142
30143           select(window)
30144               .on('resize.tail', null);
30145       };
30146
30147
30148       behavior.text = function(val) {
30149           if (!arguments.length) return _text;
30150           _text = val;
30151           return behavior;
30152       };
30153
30154
30155       return behavior;
30156   }
30157
30158   var _usedTails = {};
30159   var _disableSpace = false;
30160   var _lastSpace = null;
30161
30162
30163   function behaviorDraw(context) {
30164       var dispatch$$1 = dispatch(
30165           'move', 'click', 'clickWay', 'clickNode', 'undo', 'cancel', 'finish'
30166       );
30167
30168       var keybinding = utilKeybinding('draw');
30169
30170       var hover = behaviorHover(context).altDisables(true)
30171           .on('hover', context.ui().sidebar.hover);
30172       var tail = behaviorTail();
30173       var edit = behaviorEdit(context);
30174
30175       var closeTolerance = 4;
30176       var tolerance = 12;
30177       var _mouseLeave = false;
30178       var _lastMouse = null;
30179
30180
30181       // related code
30182       // - `mode/drag_node.js` `datum()`
30183       function datum() {
30184           var mode = context.mode();
30185           var isNote = mode && (mode.id.indexOf('note') !== -1);
30186           if (event.altKey || isNote) return {};
30187
30188           var element;
30189           if (event.type === 'keydown') {
30190               element = _lastMouse && _lastMouse.target;
30191           } else {
30192               element = event.target;
30193           }
30194
30195           // When drawing, snap only to touch targets..
30196           // (this excludes area fills and active drawing elements)
30197           var d = element.__data__;
30198           return (d && d.properties && d.properties.target) ? d : {};
30199       }
30200
30201
30202       function mousedown() {
30203
30204           function point$$1() {
30205               var p = context.container().node();
30206               return touchId !== null ? d3_touches(p).filter(function(p) {
30207                   return p.identifier === touchId;
30208               })[0] : mouse(p);
30209           }
30210
30211           var element = select(this);
30212           var touchId = event.touches ? event.changedTouches[0].identifier : null;
30213           var t1 = +new Date();
30214           var p1 = point$$1();
30215
30216           element.on('mousemove.draw', null);
30217
30218           select(window).on('mouseup.draw', function() {
30219               var t2 = +new Date();
30220               var p2 = point$$1();
30221               var dist = geoVecLength(p1, p2);
30222
30223               element.on('mousemove.draw', mousemove);
30224               select(window).on('mouseup.draw', null);
30225
30226               if (dist < closeTolerance || (dist < tolerance && (t2 - t1) < 500)) {
30227                   // Prevent a quick second click
30228                   select(window).on('click.draw-block', function() {
30229                       event.stopPropagation();
30230                   }, true);
30231
30232                   context.map().dblclickEnable(false);
30233
30234                   window.setTimeout(function() {
30235                       context.map().dblclickEnable(true);
30236                       select(window).on('click.draw-block', null);
30237                   }, 500);
30238
30239                   click();
30240               }
30241           }, true);
30242       }
30243
30244
30245       function mousemove() {
30246           _lastMouse = event;
30247           dispatch$$1.call('move', this, datum());
30248       }
30249
30250
30251       function mouseenter() {
30252           _mouseLeave = false;
30253       }
30254
30255
30256       function mouseleave() {
30257           _mouseLeave = true;
30258       }
30259
30260
30261       // related code
30262       // - `mode/drag_node.js`     `doMode()`
30263       // - `behavior/draw.js`      `click()`
30264       // - `behavior/draw_way.js`  `move()`
30265       function click() {
30266           var d = datum();
30267           var target = d && d.properties && d.properties.entity;
30268
30269           if (target && target.type === 'node') {   // Snap to a node
30270               dispatch$$1.call('clickNode', this, target, d);
30271               return;
30272
30273           } else if (target && target.type === 'way') {   // Snap to a way
30274               var choice = geoChooseEdge(
30275                   context.childNodes(target), context.mouse(), context.projection, context.activeID()
30276               );
30277               if (choice) {
30278                   var edge = [target.nodes[choice.index - 1], target.nodes[choice.index]];
30279                   dispatch$$1.call('clickWay', this, choice.loc, edge, d);
30280                   return;
30281               }
30282           }
30283           dispatch$$1.call('click', this, context.map().mouseCoordinates(), d);
30284       }
30285
30286
30287       function space() {
30288           event.preventDefault();
30289           event.stopPropagation();
30290
30291           var currSpace = context.mouse();
30292           if (_disableSpace && _lastSpace) {
30293               var dist = geoVecLength(_lastSpace, currSpace);
30294               if (dist > tolerance) {
30295                   _disableSpace = false;
30296               }
30297           }
30298
30299           if (_disableSpace || _mouseLeave || !_lastMouse) return;
30300
30301           // user must move mouse or release space bar to allow another click
30302           _lastSpace = currSpace;
30303           _disableSpace = true;
30304
30305           select(window).on('keyup.space-block', function() {
30306               event.preventDefault();
30307               event.stopPropagation();
30308               _disableSpace = false;
30309               select(window).on('keyup.space-block', null);
30310           });
30311
30312           click();
30313       }
30314
30315
30316       function backspace() {
30317           event.preventDefault();
30318           dispatch$$1.call('undo');
30319       }
30320
30321
30322       function del() {
30323           event.preventDefault();
30324           dispatch$$1.call('cancel');
30325       }
30326
30327
30328       function ret() {
30329           event.preventDefault();
30330           dispatch$$1.call('finish');
30331       }
30332
30333
30334       function behavior(selection$$1) {
30335           context.install(hover);
30336           context.install(edit);
30337
30338           if (!context.inIntro() && !_usedTails[tail.text()]) {
30339               context.install(tail);
30340           }
30341
30342           keybinding
30343               .on('⌫', backspace)
30344               .on('⌦', del)
30345               .on('⎋', ret)
30346               .on('↩', ret)
30347               .on('space', space)
30348               .on('⌥space', space);
30349
30350           selection$$1
30351               .on('mouseenter.draw', mouseenter)
30352               .on('mouseleave.draw', mouseleave)
30353               .on('mousedown.draw', mousedown)
30354               .on('mousemove.draw', mousemove);
30355
30356           select(document)
30357               .call(keybinding);
30358
30359           return behavior;
30360       }
30361
30362
30363       behavior.off = function(selection$$1) {
30364           context.ui().sidebar.hover.cancel();
30365           context.uninstall(hover);
30366           context.uninstall(edit);
30367
30368           if (!context.inIntro() && !_usedTails[tail.text()]) {
30369               context.uninstall(tail);
30370               _usedTails[tail.text()] = true;
30371           }
30372
30373           selection$$1
30374               .on('mouseenter.draw', null)
30375               .on('mouseleave.draw', null)
30376               .on('mousedown.draw', null)
30377               .on('mousemove.draw', null);
30378
30379           select(window)
30380               .on('mouseup.draw', null);
30381               // note: keyup.space-block, click.draw-block should remain
30382
30383           select(document)
30384               .call(keybinding.unbind);
30385       };
30386
30387
30388       behavior.tail = function(_) {
30389           tail.text(_);
30390           return behavior;
30391       };
30392
30393
30394       return utilRebind(behavior, dispatch$$1, 'on');
30395   }
30396
30397   function modeAddArea$$1(context) {
30398       var mode = {
30399           id: 'add-area',
30400           button: 'area',
30401           title: t('modes.add_area.title'),
30402           description: t('modes.add_area.description'),
30403           key: '3'
30404       };
30405
30406       var behavior = behaviorAddWay(context)
30407           .tail(t('modes.add_area.tail'))
30408           .on('start', start)
30409           .on('startFromWay', startFromWay)
30410           .on('startFromNode', startFromNode);
30411
30412       var defaultTags = { area: 'yes' };
30413
30414
30415       function actionClose(wayId) {
30416           return function (graph) {
30417               return graph.replace(graph.entity(wayId).close());
30418           };
30419       }
30420
30421
30422       function start(loc) {
30423           var startGraph = context.graph();
30424           var node = osmNode({ loc: loc });
30425           var way = osmWay({ tags: defaultTags });
30426
30427           context.perform(
30428               actionAddEntity(node),
30429               actionAddEntity(way),
30430               actionAddVertex(way.id, node.id),
30431               actionClose(way.id)
30432           );
30433
30434           context.enter(modeDrawArea(context, way.id, startGraph));
30435       }
30436
30437
30438       function startFromWay(loc, edge) {
30439           var startGraph = context.graph();
30440           var node = osmNode({ loc: loc });
30441           var way = osmWay({ tags: defaultTags });
30442
30443           context.perform(
30444               actionAddEntity(node),
30445               actionAddEntity(way),
30446               actionAddVertex(way.id, node.id),
30447               actionClose(way.id),
30448               actionAddMidpoint({ loc: loc, edge: edge }, node)
30449           );
30450
30451           context.enter(modeDrawArea(context, way.id, startGraph));
30452       }
30453
30454
30455       function startFromNode(node) {
30456           var startGraph = context.graph();
30457           var way = osmWay({ tags: defaultTags });
30458
30459           context.perform(
30460               actionAddEntity(way),
30461               actionAddVertex(way.id, node.id),
30462               actionClose(way.id)
30463           );
30464
30465           context.enter(modeDrawArea(context, way.id, startGraph));
30466       }
30467
30468
30469       mode.enter = function() {
30470           context.install(behavior);
30471       };
30472
30473
30474       mode.exit = function() {
30475           context.uninstall(behavior);
30476       };
30477
30478
30479       return mode;
30480   }
30481
30482   function modeAddLine$$1(context) {
30483       var mode = {
30484           id: 'add-line',
30485           button: 'line',
30486           title: t('modes.add_line.title'),
30487           description: t('modes.add_line.description'),
30488           key: '2'
30489       };
30490
30491       var behavior = behaviorAddWay(context)
30492           .tail(t('modes.add_line.tail'))
30493           .on('start', start)
30494           .on('startFromWay', startFromWay)
30495           .on('startFromNode', startFromNode);
30496
30497
30498       function start(loc) {
30499           var startGraph = context.graph();
30500           var node = osmNode({ loc: loc });
30501           var way = osmWay();
30502
30503           context.perform(
30504               actionAddEntity(node),
30505               actionAddEntity(way),
30506               actionAddVertex(way.id, node.id)
30507           );
30508
30509           context.enter(modeDrawLine(context, way.id, startGraph));
30510       }
30511
30512
30513       function startFromWay(loc, edge) {
30514           var startGraph = context.graph();
30515           var node = osmNode({ loc: loc });
30516           var way = osmWay();
30517
30518           context.perform(
30519               actionAddEntity(node),
30520               actionAddEntity(way),
30521               actionAddVertex(way.id, node.id),
30522               actionAddMidpoint({ loc: loc, edge: edge }, node)
30523           );
30524
30525           context.enter(modeDrawLine(context, way.id, startGraph));
30526       }
30527
30528
30529       function startFromNode(node) {
30530           var startGraph = context.graph();
30531           var way = osmWay();
30532
30533           context.perform(
30534               actionAddEntity(way),
30535               actionAddVertex(way.id, node.id)
30536           );
30537
30538           context.enter(modeDrawLine(context, way.id, startGraph));
30539       }
30540
30541
30542       mode.enter = function() {
30543           context.install(behavior);
30544       };
30545
30546
30547       mode.exit = function() {
30548           context.uninstall(behavior);
30549       };
30550
30551       return mode;
30552   }
30553
30554   function modeAddPoint$$1(context) {
30555       var mode = {
30556           id: 'add-point',
30557           button: 'point',
30558           title: t('modes.add_point.title'),
30559           description: t('modes.add_point.description'),
30560           key: '1'
30561       };
30562
30563       var behavior = behaviorDraw(context)
30564           .tail(t('modes.add_point.tail'))
30565           .on('click', add)
30566           .on('clickWay', addWay)
30567           .on('clickNode', addNode)
30568           .on('cancel', cancel)
30569           .on('finish', cancel);
30570
30571
30572       function add(loc) {
30573           var node = osmNode({ loc: loc });
30574
30575           context.perform(
30576               actionAddEntity(node),
30577               t('operations.add.annotation.point')
30578           );
30579
30580           context.enter(
30581               modeSelect(context, [node.id]).newFeature(true)
30582           );
30583       }
30584
30585
30586       function addWay(loc, edge) {
30587           var node =  osmNode();
30588
30589           context.perform(
30590               actionAddMidpoint({loc: loc, edge: edge}, node),
30591               t('operations.add.annotation.vertex')
30592           );
30593
30594           context.enter(
30595               modeSelect(context, [node.id]).newFeature(true)
30596           );
30597       }
30598
30599
30600       function addNode(node) {
30601           add(node.loc);
30602       }
30603
30604
30605       function cancel() {
30606           context.enter(modeBrowse(context));
30607       }
30608
30609
30610       mode.enter = function() {
30611           context.install(behavior);
30612       };
30613
30614
30615       mode.exit = function() {
30616           context.uninstall(behavior);
30617       };
30618
30619
30620       return mode;
30621   }
30622
30623   function svgAreas$$1(projection, context) {
30624       // Patterns only work in Firefox when set directly on element.
30625       // (This is not a bug: https://bugzilla.mozilla.org/show_bug.cgi?id=750632)
30626       var patterns = {
30627           // tag - value - pattern name
30628           // -or-
30629           // tag - value - rules (optional tag-values, pattern name)
30630           // (matches earlier rules first, so fallback should be last entry)
30631           amenity: {
30632               grave_yard: 'cemetery'
30633           },
30634           landuse: {
30635               cemetery: [
30636                   { religion: 'christian', pattern: 'cemetery_christian' },
30637                   { religion: 'buddhist', pattern: 'cemetery_buddhist' },
30638                   { religion: 'muslim', pattern: 'cemetery_muslim' },
30639                   { religion: 'jewish', pattern: 'cemetery_jewish' },
30640                   { pattern: 'cemetery' }
30641               ],
30642               construction: 'construction',
30643               farmland: 'farmland',
30644               farmyard: 'farmyard',
30645               forest: [
30646                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
30647                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
30648                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
30649                   { pattern: 'forest' } // same as 'leaf_type:mixed'
30650               ],
30651               grave_yard: 'cemetery',
30652               grass: 'grass',
30653               landfill: 'landfill',
30654               meadow: 'meadow',
30655               military: 'construction',
30656               orchard: 'orchard',
30657               quarry: 'quarry',
30658               vineyard: 'vineyard'
30659           },
30660           natural: {
30661               beach: 'beach',
30662               grassland: 'grass',
30663               sand: 'beach',
30664               scrub: 'scrub',
30665               water: [
30666                   { water: 'pond', pattern: 'pond' },
30667                   { pattern: 'waves' }
30668               ],
30669               wetland: [
30670                   { wetland: 'marsh', pattern: 'wetland_marsh' },
30671                   { wetland: 'swamp', pattern: 'wetland_swamp' },
30672                   { wetland: 'bog', pattern: 'wetland_bog' },
30673                   { wetland: 'reedbed', pattern: 'wetland_reedbed' },
30674                   { pattern: 'wetland' }
30675               ],
30676               wood: [
30677                   { leaf_type: 'broadleaved', pattern: 'forest_broadleaved' },
30678                   { leaf_type: 'needleleaved', pattern: 'forest_needleleaved' },
30679                   { leaf_type: 'leafless', pattern: 'forest_leafless' },
30680                   { pattern: 'forest' } // same as 'leaf_type:mixed'
30681               ]
30682           }
30683       };
30684
30685       function setPattern(entity) {
30686           // Skip pattern filling if this is a building (buildings don't get patterns applied)
30687           if (entity.tags.building && entity.tags.building !== 'no') {
30688               this.style.fill = this.style.stroke = '';
30689               return;
30690           }
30691
30692           for (var tag in patterns) {
30693               if (patterns.hasOwnProperty(tag)) {
30694                   var entityValue = entity.tags[tag];
30695                   if (entityValue) {
30696
30697                       var values = patterns[tag];
30698                       for (var value in values) {
30699                           if (entityValue === value) {
30700
30701                               var rules = values[value];
30702                               if (typeof rules === 'string') { // short syntax - pattern name
30703                                   this.style.fill = this.style.stroke = 'url("#pattern-' + rules + '")';
30704                                   return;
30705                               } else { // long syntax - rule array
30706                                   for (var ruleKey in rules) {
30707                                       var rule = rules[ruleKey];
30708
30709                                       var pass = true;
30710                                       for (var criterion in rule) {
30711                                           if (criterion !== 'pattern') { // reserved for pattern name
30712                                               // The only rule is a required tag-value pair
30713                                               var v = entity.tags[criterion];
30714                                               if (!v || v !== rule[criterion]) {
30715                                                   pass = false;
30716                                                   break;
30717                                               }
30718                                           }
30719                                       }
30720
30721                                       if (pass) {
30722                                           this.style.fill = this.style.stroke = 'url("#pattern-' + rule.pattern + '")';
30723                                           return;
30724                                       }
30725                                   }
30726                               }
30727                           }
30728                       }
30729                   }
30730               }
30731           }
30732
30733           this.style.fill = this.style.stroke = '';
30734       }
30735
30736
30737       function drawTargets(selection, graph, entities, filter) {
30738           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
30739           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
30740           var getPath = svgPath(projection).geojson;
30741           var activeID = context.activeID();
30742
30743           // The targets and nopes will be MultiLineString sub-segments of the ways
30744           var data = { targets: [], nopes: [] };
30745
30746           entities.forEach(function(way) {
30747               var features = svgSegmentWay(way, graph, activeID);
30748               data.targets.push.apply(data.targets, features.passive);
30749               data.nopes.push.apply(data.nopes, features.active);
30750           });
30751
30752
30753           // Targets allow hover and vertex snapping
30754           var targetData = data.targets.filter(getPath);
30755           var targets = selection.selectAll('.area.target-allowed')
30756               .filter(function(d) { return filter(d.properties.entity); })
30757               .data(targetData, function key(d) { return d.id; });
30758
30759           // exit
30760           targets.exit()
30761               .remove();
30762
30763           // enter/update
30764           targets.enter()
30765               .append('path')
30766               .merge(targets)
30767               .attr('d', getPath)
30768               .attr('class', function(d) { return 'way area target target-allowed ' + targetClass + d.id; });
30769
30770
30771           // NOPE
30772           var nopeData = data.nopes.filter(getPath);
30773           var nopes = selection.selectAll('.area.target-nope')
30774               .filter(function(d) { return filter(d.properties.entity); })
30775               .data(nopeData, function key(d) { return d.id; });
30776
30777           // exit
30778           nopes.exit()
30779               .remove();
30780
30781           // enter/update
30782           nopes.enter()
30783               .append('path')
30784               .merge(nopes)
30785               .attr('d', getPath)
30786               .attr('class', function(d) { return 'way area target target-nope ' + nopeClass + d.id; });
30787       }
30788
30789
30790       function drawAreas(selection, graph, entities, filter) {
30791           var path = svgPath(projection, graph, true),
30792               areas = {},
30793               multipolygon;
30794
30795           for (var i = 0; i < entities.length; i++) {
30796               var entity = entities[i];
30797               if (entity.geometry(graph) !== 'area') continue;
30798
30799               multipolygon = osmIsSimpleMultipolygonOuterMember(entity, graph);
30800               if (multipolygon) {
30801                   areas[multipolygon.id] = {
30802                       entity: multipolygon.mergeTags(entity.tags),
30803                       area: Math.abs(entity.area(graph))
30804                   };
30805               } else if (!areas[entity.id]) {
30806                   areas[entity.id] = {
30807                       entity: entity,
30808                       area: Math.abs(entity.area(graph))
30809                   };
30810               }
30811           }
30812
30813           areas = values$1(areas).filter(function hasPath(a) { return path(a.entity); });
30814           areas.sort(function areaSort(a, b) { return b.area - a.area; });
30815           areas = map$3(areas, 'entity');
30816
30817           var strokes = areas.filter(function(area) {
30818               return area.type === 'way';
30819           });
30820
30821           var data = {
30822               clip: areas,
30823               shadow: strokes,
30824               stroke: strokes,
30825               fill: areas
30826           };
30827
30828           var clipPaths = context.surface().selectAll('defs').selectAll('.clipPath-osm')
30829              .filter(filter)
30830              .data(data.clip, osmEntity$$1.key);
30831
30832           clipPaths.exit()
30833              .remove();
30834
30835           var clipPathsEnter = clipPaths.enter()
30836              .append('clipPath')
30837              .attr('class', 'clipPath-osm')
30838              .attr('id', function(entity) { return entity.id + '-clippath'; });
30839
30840           clipPathsEnter
30841              .append('path');
30842
30843           clipPaths.merge(clipPathsEnter)
30844              .selectAll('path')
30845              .attr('d', path);
30846
30847
30848           var drawLayer = selection.selectAll('.layer-osm.areas');
30849           var touchLayer = selection.selectAll('.layer-touch.areas');
30850
30851           // Draw areas..
30852           var areagroup = drawLayer
30853               .selectAll('g.areagroup')
30854               .data(['fill', 'shadow', 'stroke']);
30855
30856           areagroup = areagroup.enter()
30857               .append('g')
30858               .attr('class', function(d) { return 'areagroup area-' + d; })
30859               .merge(areagroup);
30860
30861           var paths = areagroup
30862               .selectAll('path')
30863               .filter(filter)
30864               .data(function(layer) { return data[layer]; }, osmEntity$$1.key);
30865
30866           paths.exit()
30867               .remove();
30868
30869           var fills = selection.selectAll('.area-fill path.area').nodes();
30870
30871           var bisect = bisector(function(node) {
30872               return -node.__data__.area(graph);
30873           }).left;
30874
30875           function sortedByArea(entity) {
30876               if (this._parent.__data__ === 'fill') {
30877                   return fills[bisect(fills, -entity.area(graph))];
30878               }
30879           }
30880
30881           paths = paths.enter()
30882               .insert('path', sortedByArea)
30883               .merge(paths)
30884               .each(function(entity) {
30885                   var layer = this.parentNode.__data__;
30886                   this.setAttribute('class', entity.type + ' area ' + layer + ' ' + entity.id);
30887
30888                   if (layer === 'fill') {
30889                       this.setAttribute('clip-path', 'url(#' + entity.id + '-clippath)');
30890                       setPattern.call(this, entity);
30891                   }
30892               })
30893               .call(svgTagClasses())
30894               .attr('d', path);
30895
30896
30897           // Draw touch targets..
30898           touchLayer
30899               .call(drawTargets, graph, data.stroke, filter);
30900       }
30901
30902       return drawAreas;
30903   }
30904
30905   /**
30906    * A specialized version of `_.reduce` for arrays without support for
30907    * iteratee shorthands.
30908    *
30909    * @private
30910    * @param {Array} [array] The array to iterate over.
30911    * @param {Function} iteratee The function invoked per iteration.
30912    * @param {*} [accumulator] The initial value.
30913    * @param {boolean} [initAccum] Specify using the first element of `array` as
30914    *  the initial value.
30915    * @returns {*} Returns the accumulated value.
30916    */
30917   function arrayReduce(array, iteratee, accumulator, initAccum) {
30918     var index = -1,
30919         length = array == null ? 0 : array.length;
30920
30921     if (initAccum && length) {
30922       accumulator = array[++index];
30923     }
30924     while (++index < length) {
30925       accumulator = iteratee(accumulator, array[index], index, array);
30926     }
30927     return accumulator;
30928   }
30929
30930   /**
30931    * The base implementation of `_.reduce` and `_.reduceRight`, without support
30932    * for iteratee shorthands, which iterates over `collection` using `eachFunc`.
30933    *
30934    * @private
30935    * @param {Array|Object} collection The collection to iterate over.
30936    * @param {Function} iteratee The function invoked per iteration.
30937    * @param {*} accumulator The initial value.
30938    * @param {boolean} initAccum Specify using the first or last element of
30939    *  `collection` as the initial value.
30940    * @param {Function} eachFunc The function to iterate over `collection`.
30941    * @returns {*} Returns the accumulated value.
30942    */
30943   function baseReduce(collection, iteratee, accumulator, initAccum, eachFunc) {
30944     eachFunc(collection, function(value, index, collection) {
30945       accumulator = initAccum
30946         ? (initAccum = false, value)
30947         : iteratee(accumulator, value, index, collection);
30948     });
30949     return accumulator;
30950   }
30951
30952   /**
30953    * Reduces `collection` to a value which is the accumulated result of running
30954    * each element in `collection` thru `iteratee`, where each successive
30955    * invocation is supplied the return value of the previous. If `accumulator`
30956    * is not given, the first element of `collection` is used as the initial
30957    * value. The iteratee is invoked with four arguments:
30958    * (accumulator, value, index|key, collection).
30959    *
30960    * Many lodash methods are guarded to work as iteratees for methods like
30961    * `_.reduce`, `_.reduceRight`, and `_.transform`.
30962    *
30963    * The guarded methods are:
30964    * `assign`, `defaults`, `defaultsDeep`, `includes`, `merge`, `orderBy`,
30965    * and `sortBy`
30966    *
30967    * @static
30968    * @memberOf _
30969    * @since 0.1.0
30970    * @category Collection
30971    * @param {Array|Object} collection The collection to iterate over.
30972    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
30973    * @param {*} [accumulator] The initial value.
30974    * @returns {*} Returns the accumulated value.
30975    * @see _.reduceRight
30976    * @example
30977    *
30978    * _.reduce([1, 2], function(sum, n) {
30979    *   return sum + n;
30980    * }, 0);
30981    * // => 3
30982    *
30983    * _.reduce({ 'a': 1, 'b': 2, 'c': 1 }, function(result, value, key) {
30984    *   (result[value] || (result[value] = [])).push(key);
30985    *   return result;
30986    * }, {});
30987    * // => { '1': ['a', 'c'], '2': ['b'] } (iteration order is not guaranteed)
30988    */
30989   function reduce(collection, iteratee, accumulator) {
30990     var func = isArray(collection) ? arrayReduce : baseReduce,
30991         initAccum = arguments.length < 3;
30992
30993     return func(collection, baseIteratee(iteratee, 4), accumulator, initAccum, baseEach);
30994   }
30995
30996   /** Error message constants. */
30997   var FUNC_ERROR_TEXT$3 = 'Expected a function';
30998
30999   /**
31000    * Creates a throttled function that only invokes `func` at most once per
31001    * every `wait` milliseconds. The throttled function comes with a `cancel`
31002    * method to cancel delayed `func` invocations and a `flush` method to
31003    * immediately invoke them. Provide `options` to indicate whether `func`
31004    * should be invoked on the leading and/or trailing edge of the `wait`
31005    * timeout. The `func` is invoked with the last arguments provided to the
31006    * throttled function. Subsequent calls to the throttled function return the
31007    * result of the last `func` invocation.
31008    *
31009    * **Note:** If `leading` and `trailing` options are `true`, `func` is
31010    * invoked on the trailing edge of the timeout only if the throttled function
31011    * is invoked more than once during the `wait` timeout.
31012    *
31013    * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred
31014    * until to the next tick, similar to `setTimeout` with a timeout of `0`.
31015    *
31016    * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)
31017    * for details over the differences between `_.throttle` and `_.debounce`.
31018    *
31019    * @static
31020    * @memberOf _
31021    * @since 0.1.0
31022    * @category Function
31023    * @param {Function} func The function to throttle.
31024    * @param {number} [wait=0] The number of milliseconds to throttle invocations to.
31025    * @param {Object} [options={}] The options object.
31026    * @param {boolean} [options.leading=true]
31027    *  Specify invoking on the leading edge of the timeout.
31028    * @param {boolean} [options.trailing=true]
31029    *  Specify invoking on the trailing edge of the timeout.
31030    * @returns {Function} Returns the new throttled function.
31031    * @example
31032    *
31033    * // Avoid excessively updating the position while scrolling.
31034    * jQuery(window).on('scroll', _.throttle(updatePosition, 100));
31035    *
31036    * // Invoke `renewToken` when the click event is fired, but not more than once every 5 minutes.
31037    * var throttled = _.throttle(renewToken, 300000, { 'trailing': false });
31038    * jQuery(element).on('click', throttled);
31039    *
31040    * // Cancel the trailing throttled invocation.
31041    * jQuery(window).on('popstate', throttled.cancel);
31042    */
31043   function throttle(func, wait, options) {
31044     var leading = true,
31045         trailing = true;
31046
31047     if (typeof func != 'function') {
31048       throw new TypeError(FUNC_ERROR_TEXT$3);
31049     }
31050     if (isObject(options)) {
31051       leading = 'leading' in options ? !!options.leading : leading;
31052       trailing = 'trailing' in options ? !!options.trailing : trailing;
31053     }
31054     return debounce(func, wait, {
31055       'leading': leading,
31056       'maxWait': wait,
31057       'trailing': trailing
31058     });
31059   }
31060
31061   var fastJsonStableStringify = function (data, opts) {
31062       if (!opts) opts = {};
31063       if (typeof opts === 'function') opts = { cmp: opts };
31064       var cycles = (typeof opts.cycles === 'boolean') ? opts.cycles : false;
31065
31066       var cmp = opts.cmp && (function (f) {
31067           return function (node) {
31068               return function (a, b) {
31069                   var aobj = { key: a, value: node[a] };
31070                   var bobj = { key: b, value: node[b] };
31071                   return f(aobj, bobj);
31072               };
31073           };
31074       })(opts.cmp);
31075
31076       var seen = [];
31077       return (function stringify (node) {
31078           if (node && node.toJSON && typeof node.toJSON === 'function') {
31079               node = node.toJSON();
31080           }
31081
31082           if (node === undefined) return;
31083           if (typeof node == 'number') return isFinite(node) ? '' + node : 'null';
31084           if (typeof node !== 'object') return JSON.stringify(node);
31085
31086           var i, out;
31087           if (Array.isArray(node)) {
31088               out = '[';
31089               for (i = 0; i < node.length; i++) {
31090                   if (i) out += ',';
31091                   out += stringify(node[i]) || 'null';
31092               }
31093               return out + ']';
31094           }
31095
31096           if (node === null) return 'null';
31097
31098           if (seen.indexOf(node) !== -1) {
31099               if (cycles) return JSON.stringify('__cycle__');
31100               throw new TypeError('Converting circular structure to JSON');
31101           }
31102
31103           var seenIndex = seen.push(node) - 1;
31104           var keys = Object.keys(node).sort(cmp && cmp(node));
31105           out = '';
31106           for (i = 0; i < keys.length; i++) {
31107               var key = keys[i];
31108               var value = stringify(node[key]);
31109
31110               if (!value) continue;
31111               if (out) out += ',';
31112               out += JSON.stringify(key) + ':' + value;
31113           }
31114           seen.splice(seenIndex, 1);
31115           return '{' + out + '}';
31116       })(data);
31117   };
31118
31119   var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
31120
31121   function unwrapExports (x) {
31122         return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
31123   }
31124
31125   function createCommonjsModule(fn, module) {
31126         return module = { exports: {} }, fn(module, module.exports), module.exports;
31127   }
31128
31129   //[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]
31130   //[4a]        NameChar           ::=          NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040]
31131   //[5]         Name       ::=          NameStartChar (NameChar)*
31132   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
31133   var nameChar = new RegExp("[\\-\\.0-9"+nameStartChar.source.slice(1,-1)+"\\u00B7\\u0300-\\u036F\\u203F-\\u2040]");
31134   var tagNamePattern = new RegExp('^'+nameStartChar.source+nameChar.source+'*(?:\:'+nameStartChar.source+nameChar.source+'*)?$');
31135   //var tagNamePattern = /^[a-zA-Z_][\w\-\.]*(?:\:[a-zA-Z_][\w\-\.]*)?$/
31136   //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(',')
31137
31138   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
31139   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
31140   var S_TAG = 0;//tag name offerring
31141   var S_ATTR = 1;//attr name offerring 
31142   var S_ATTR_SPACE=2;//attr name end and space offer
31143   var S_EQ = 3;//=space?
31144   var S_ATTR_NOQUOT_VALUE = 4;//attr value(no quot value only)
31145   var S_ATTR_END = 5;//attr value end and no space(quot end)
31146   var S_TAG_SPACE = 6;//(attr value end || tag end ) && (space offer)
31147   var S_TAG_CLOSE = 7;//closed el<el />
31148
31149   function XMLReader(){
31150         
31151   }
31152
31153   XMLReader.prototype = {
31154         parse:function(source,defaultNSMap,entityMap){
31155                 var domBuilder = this.domBuilder;
31156                 domBuilder.startDocument();
31157                 _copy(defaultNSMap ,defaultNSMap = {});
31158                 parse(source,defaultNSMap,entityMap,
31159                                 domBuilder,this.errorHandler);
31160                 domBuilder.endDocument();
31161         }
31162   };
31163   function parse(source,defaultNSMapCopy,entityMap,domBuilder,errorHandler){
31164         function fixedFromCharCode(code) {
31165                 // String.prototype.fromCharCode does not supports
31166                 // > 2 bytes unicode chars directly
31167                 if (code > 0xffff) {
31168                         code -= 0x10000;
31169                         var surrogate1 = 0xd800 + (code >> 10)
31170                                 , surrogate2 = 0xdc00 + (code & 0x3ff);
31171
31172                         return String.fromCharCode(surrogate1, surrogate2);
31173                 } else {
31174                         return String.fromCharCode(code);
31175                 }
31176         }
31177         function entityReplacer(a){
31178                 var k = a.slice(1,-1);
31179                 if(k in entityMap){
31180                         return entityMap[k]; 
31181                 }else if(k.charAt(0) === '#'){
31182                         return fixedFromCharCode(parseInt(k.substr(1).replace('x','0x')))
31183                 }else{
31184                         errorHandler.error('entity not found:'+a);
31185                         return a;
31186                 }
31187         }
31188         function appendText(end){//has some bugs
31189                 if(end>start){
31190                         var xt = source.substring(start,end).replace(/&#?\w+;/g,entityReplacer);
31191                         locator&&position(start);
31192                         domBuilder.characters(xt,0,end-start);
31193                         start = end;
31194                 }
31195         }
31196         function position(p,m){
31197                 while(p>=lineEnd && (m = linePattern.exec(source))){
31198                         lineStart = m.index;
31199                         lineEnd = lineStart + m[0].length;
31200                         locator.lineNumber++;
31201                         //console.log('line++:',locator,startPos,endPos)
31202                 }
31203                 locator.columnNumber = p-lineStart+1;
31204         }
31205         var lineStart = 0;
31206         var lineEnd = 0;
31207         var linePattern = /.*(?:\r\n?|\n)|.*$/g;
31208         var locator = domBuilder.locator;
31209         
31210         var parseStack = [{currentNSMap:defaultNSMapCopy}];
31211         var closeMap = {};
31212         var start = 0;
31213         while(true){
31214                 try{
31215                         var tagStart = source.indexOf('<',start);
31216                         if(tagStart<0){
31217                                 if(!source.substr(start).match(/^\s*$/)){
31218                                         var doc = domBuilder.doc;
31219                                 var text = doc.createTextNode(source.substr(start));
31220                                 doc.appendChild(text);
31221                                 domBuilder.currentElement = text;
31222                                 }
31223                                 return;
31224                         }
31225                         if(tagStart>start){
31226                                 appendText(tagStart);
31227                         }
31228                         switch(source.charAt(tagStart+1)){
31229                         case '/':
31230                                 var end = source.indexOf('>',tagStart+3);
31231                                 var tagName = source.substring(tagStart+2,end);
31232                                 var config = parseStack.pop();
31233                                 if(end<0){
31234                                         
31235                                 tagName = source.substring(tagStart+2).replace(/[\s<].*/,'');
31236                                 //console.error('#@@@@@@'+tagName)
31237                                 errorHandler.error("end tag name: "+tagName+' is not complete:'+config.tagName);
31238                                 end = tagStart+1+tagName.length;
31239                         }else if(tagName.match(/\s</)){
31240                                 tagName = tagName.replace(/[\s<].*/,'');
31241                                 errorHandler.error("end tag name: "+tagName+' maybe not complete');
31242                                 end = tagStart+1+tagName.length;
31243                                 }
31244                                 //console.error(parseStack.length,parseStack)
31245                                 //console.error(config);
31246                                 var localNSMap = config.localNSMap;
31247                                 var endMatch = config.tagName == tagName;
31248                                 var endIgnoreCaseMach = endMatch || config.tagName&&config.tagName.toLowerCase() == tagName.toLowerCase();
31249                         if(endIgnoreCaseMach){
31250                                 domBuilder.endElement(config.uri,config.localName,tagName);
31251                                         if(localNSMap){
31252                                                 for(var prefix in localNSMap){
31253                                                         domBuilder.endPrefixMapping(prefix) ;
31254                                                 }
31255                                         }
31256                                         if(!endMatch){
31257                                 errorHandler.fatalError("end tag name: "+tagName+' is not match the current start tagName:'+config.tagName );
31258                                         }
31259                         }else{
31260                                 parseStack.push(config);
31261                         }
31262                                 
31263                                 end++;
31264                                 break;
31265                                 // end elment
31266                         case '?':// <?...?>
31267                                 locator&&position(tagStart);
31268                                 end = parseInstruction(source,tagStart,domBuilder);
31269                                 break;
31270                         case '!':// <!doctype,<![CDATA,<!--
31271                                 locator&&position(tagStart);
31272                                 end = parseDCC(source,tagStart,domBuilder,errorHandler);
31273                                 break;
31274                         default:
31275                                 locator&&position(tagStart);
31276                                 var el = new ElementAttributes();
31277                                 var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
31278                                 //elStartEnd
31279                                 var end = parseElementStartPart(source,tagStart,el,currentNSMap,entityReplacer,errorHandler);
31280                                 var len = el.length;
31281                                 
31282                                 
31283                                 if(!el.closed && fixSelfClosed(source,end,el.tagName,closeMap)){
31284                                         el.closed = true;
31285                                         if(!entityMap.nbsp){
31286                                                 errorHandler.warning('unclosed xml attribute');
31287                                         }
31288                                 }
31289                                 if(locator && len){
31290                                         var locator2 = copyLocator(locator,{});
31291                                         //try{//attribute position fixed
31292                                         for(var i = 0;i<len;i++){
31293                                                 var a = el[i];
31294                                                 position(a.offset);
31295                                                 a.locator = copyLocator(locator,{});
31296                                         }
31297                                         //}catch(e){console.error('@@@@@'+e)}
31298                                         domBuilder.locator = locator2;
31299                                         if(appendElement(el,domBuilder,currentNSMap)){
31300                                                 parseStack.push(el);
31301                                         }
31302                                         domBuilder.locator = locator;
31303                                 }else{
31304                                         if(appendElement(el,domBuilder,currentNSMap)){
31305                                                 parseStack.push(el);
31306                                         }
31307                                 }
31308                                 
31309                                 
31310                                 
31311                                 if(el.uri === 'http://www.w3.org/1999/xhtml' && !el.closed){
31312                                         end = parseHtmlSpecialContent(source,end,el.tagName,entityReplacer,domBuilder);
31313                                 }else{
31314                                         end++;
31315                                 }
31316                         }
31317                 }catch(e){
31318                         errorHandler.error('element parse error: '+e);
31319                         //errorHandler.error('element parse error: '+e);
31320                         end = -1;
31321                         //throw e;
31322                 }
31323                 if(end>start){
31324                         start = end;
31325                 }else{
31326                         //TODO: 这里有可能sax回退,有位置错误风险
31327                         appendText(Math.max(tagStart,start)+1);
31328                 }
31329         }
31330   }
31331   function copyLocator(f,t){
31332         t.lineNumber = f.lineNumber;
31333         t.columnNumber = f.columnNumber;
31334         return t;
31335   }
31336
31337   /**
31338    * @see #appendElement(source,elStartEnd,el,selfClosed,entityReplacer,domBuilder,parseStack);
31339    * @return end of the elementStartPart(end of elementEndPart for selfClosed el)
31340    */
31341   function parseElementStartPart(source,start,el,currentNSMap,entityReplacer,errorHandler){
31342         var attrName;
31343         var value;
31344         var p = ++start;
31345         var s = S_TAG;//status
31346         while(true){
31347                 var c = source.charAt(p);
31348                 switch(c){
31349                 case '=':
31350                         if(s === S_ATTR){//attrName
31351                                 attrName = source.slice(start,p);
31352                                 s = S_EQ;
31353                         }else if(s === S_ATTR_SPACE){
31354                                 s = S_EQ;
31355                         }else{
31356                                 //fatalError: equal must after attrName or space after attrName
31357                                 throw new Error('attribute equal must after attrName');
31358                         }
31359                         break;
31360                 case '\'':
31361                 case '"':
31362                         if(s === S_EQ || s === S_ATTR //|| s == S_ATTR_SPACE
31363                                 ){//equal
31364                                 if(s === S_ATTR){
31365                                         errorHandler.warning('attribute value must after "="');
31366                                         attrName = source.slice(start,p);
31367                                 }
31368                                 start = p+1;
31369                                 p = source.indexOf(c,start);
31370                                 if(p>0){
31371                                         value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31372                                         el.add(attrName,value,start-1);
31373                                         s = S_ATTR_END;
31374                                 }else{
31375                                         //fatalError: no end quot match
31376                                         throw new Error('attribute value no end \''+c+'\' match');
31377                                 }
31378                         }else if(s == S_ATTR_NOQUOT_VALUE){
31379                                 value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31380                                 //console.log(attrName,value,start,p)
31381                                 el.add(attrName,value,start);
31382                                 //console.dir(el)
31383                                 errorHandler.warning('attribute "'+attrName+'" missed start quot('+c+')!!');
31384                                 start = p+1;
31385                                 s = S_ATTR_END;
31386                         }else{
31387                                 //fatalError: no equal before
31388                                 throw new Error('attribute value must after "="');
31389                         }
31390                         break;
31391                 case '/':
31392                         switch(s){
31393                         case S_TAG:
31394                                 el.setTagName(source.slice(start,p));
31395                         case S_ATTR_END:
31396                         case S_TAG_SPACE:
31397                         case S_TAG_CLOSE:
31398                                 s =S_TAG_CLOSE;
31399                                 el.closed = true;
31400                         case S_ATTR_NOQUOT_VALUE:
31401                         case S_ATTR:
31402                         case S_ATTR_SPACE:
31403                                 break;
31404                         //case S_EQ:
31405                         default:
31406                                 throw new Error("attribute invalid close char('/')")
31407                         }
31408                         break;
31409                 case ''://end document
31410                         //throw new Error('unexpected end of input')
31411                         errorHandler.error('unexpected end of input');
31412                         if(s == S_TAG){
31413                                 el.setTagName(source.slice(start,p));
31414                         }
31415                         return p;
31416                 case '>':
31417                         switch(s){
31418                         case S_TAG:
31419                                 el.setTagName(source.slice(start,p));
31420                         case S_ATTR_END:
31421                         case S_TAG_SPACE:
31422                         case S_TAG_CLOSE:
31423                                 break;//normal
31424                         case S_ATTR_NOQUOT_VALUE://Compatible state
31425                         case S_ATTR:
31426                                 value = source.slice(start,p);
31427                                 if(value.slice(-1) === '/'){
31428                                         el.closed  = true;
31429                                         value = value.slice(0,-1);
31430                                 }
31431                         case S_ATTR_SPACE:
31432                                 if(s === S_ATTR_SPACE){
31433                                         value = attrName;
31434                                 }
31435                                 if(s == S_ATTR_NOQUOT_VALUE){
31436                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
31437                                         el.add(attrName,value.replace(/&#?\w+;/g,entityReplacer),start);
31438                                 }else{
31439                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !value.match(/^(?:disabled|checked|selected)$/i)){
31440                                                 errorHandler.warning('attribute "'+value+'" missed value!! "'+value+'" instead!!');
31441                                         }
31442                                         el.add(value,value,start);
31443                                 }
31444                                 break;
31445                         case S_EQ:
31446                                 throw new Error('attribute value missed!!');
31447                         }
31448   //                    console.log(tagName,tagNamePattern,tagNamePattern.test(tagName))
31449                         return p;
31450                 /*xml space '\x20' | #x9 | #xD | #xA; */
31451                 case '\u0080':
31452                         c = ' ';
31453                 default:
31454                         if(c<= ' '){//space
31455                                 switch(s){
31456                                 case S_TAG:
31457                                         el.setTagName(source.slice(start,p));//tagName
31458                                         s = S_TAG_SPACE;
31459                                         break;
31460                                 case S_ATTR:
31461                                         attrName = source.slice(start,p);
31462                                         s = S_ATTR_SPACE;
31463                                         break;
31464                                 case S_ATTR_NOQUOT_VALUE:
31465                                         var value = source.slice(start,p).replace(/&#?\w+;/g,entityReplacer);
31466                                         errorHandler.warning('attribute "'+value+'" missed quot(")!!');
31467                                         el.add(attrName,value,start);
31468                                 case S_ATTR_END:
31469                                         s = S_TAG_SPACE;
31470                                         break;
31471                                 //case S_TAG_SPACE:
31472                                 //case S_EQ:
31473                                 //case S_ATTR_SPACE:
31474                                 //      void();break;
31475                                 //case S_TAG_CLOSE:
31476                                         //ignore warning
31477                                 }
31478                         }else{//not space
31479   //S_TAG,      S_ATTR, S_EQ,   S_ATTR_NOQUOT_VALUE
31480   //S_ATTR_SPACE,       S_ATTR_END,     S_TAG_SPACE, S_TAG_CLOSE
31481                                 switch(s){
31482                                 //case S_TAG:void();break;
31483                                 //case S_ATTR:void();break;
31484                                 //case S_ATTR_NOQUOT_VALUE:void();break;
31485                                 case S_ATTR_SPACE:
31486                                         var tagName =  el.tagName;
31487                                         if(currentNSMap[''] !== 'http://www.w3.org/1999/xhtml' || !attrName.match(/^(?:disabled|checked|selected)$/i)){
31488                                                 errorHandler.warning('attribute "'+attrName+'" missed value!! "'+attrName+'" instead2!!');
31489                                         }
31490                                         el.add(attrName,attrName,start);
31491                                         start = p;
31492                                         s = S_ATTR;
31493                                         break;
31494                                 case S_ATTR_END:
31495                                         errorHandler.warning('attribute space is required"'+attrName+'"!!');
31496                                 case S_TAG_SPACE:
31497                                         s = S_ATTR;
31498                                         start = p;
31499                                         break;
31500                                 case S_EQ:
31501                                         s = S_ATTR_NOQUOT_VALUE;
31502                                         start = p;
31503                                         break;
31504                                 case S_TAG_CLOSE:
31505                                         throw new Error("elements closed character '/' and '>' must be connected to");
31506                                 }
31507                         }
31508                 }//end outer switch
31509                 //console.log('p++',p)
31510                 p++;
31511         }
31512   }
31513   /**
31514    * @return true if has new namespace define
31515    */
31516   function appendElement(el,domBuilder,currentNSMap){
31517         var tagName = el.tagName;
31518         var localNSMap = null;
31519         //var currentNSMap = parseStack[parseStack.length-1].currentNSMap;
31520         var i = el.length;
31521         while(i--){
31522                 var a = el[i];
31523                 var qName = a.qName;
31524                 var value = a.value;
31525                 var nsp = qName.indexOf(':');
31526                 if(nsp>0){
31527                         var prefix = a.prefix = qName.slice(0,nsp);
31528                         var localName = qName.slice(nsp+1);
31529                         var nsPrefix = prefix === 'xmlns' && localName;
31530                 }else{
31531                         localName = qName;
31532                         prefix = null;
31533                         nsPrefix = qName === 'xmlns' && '';
31534                 }
31535                 //can not set prefix,because prefix !== ''
31536                 a.localName = localName ;
31537                 //prefix == null for no ns prefix attribute 
31538                 if(nsPrefix !== false){//hack!!
31539                         if(localNSMap == null){
31540                                 localNSMap = {};
31541                                 //console.log(currentNSMap,0)
31542                                 _copy(currentNSMap,currentNSMap={});
31543                                 //console.log(currentNSMap,1)
31544                         }
31545                         currentNSMap[nsPrefix] = localNSMap[nsPrefix] = value;
31546                         a.uri = 'http://www.w3.org/2000/xmlns/';
31547                         domBuilder.startPrefixMapping(nsPrefix, value); 
31548                 }
31549         }
31550         var i = el.length;
31551         while(i--){
31552                 a = el[i];
31553                 var prefix = a.prefix;
31554                 if(prefix){//no prefix attribute has no namespace
31555                         if(prefix === 'xml'){
31556                                 a.uri = 'http://www.w3.org/XML/1998/namespace';
31557                         }if(prefix !== 'xmlns'){
31558                                 a.uri = currentNSMap[prefix || ''];
31559                                 
31560                                 //{console.log('###'+a.qName,domBuilder.locator.systemId+'',currentNSMap,a.uri)}
31561                         }
31562                 }
31563         }
31564         var nsp = tagName.indexOf(':');
31565         if(nsp>0){
31566                 prefix = el.prefix = tagName.slice(0,nsp);
31567                 localName = el.localName = tagName.slice(nsp+1);
31568         }else{
31569                 prefix = null;//important!!
31570                 localName = el.localName = tagName;
31571         }
31572         //no prefix element has default namespace
31573         var ns = el.uri = currentNSMap[prefix || ''];
31574         domBuilder.startElement(ns,localName,tagName,el);
31575         //endPrefixMapping and startPrefixMapping have not any help for dom builder
31576         //localNSMap = null
31577         if(el.closed){
31578                 domBuilder.endElement(ns,localName,tagName);
31579                 if(localNSMap){
31580                         for(prefix in localNSMap){
31581                                 domBuilder.endPrefixMapping(prefix); 
31582                         }
31583                 }
31584         }else{
31585                 el.currentNSMap = currentNSMap;
31586                 el.localNSMap = localNSMap;
31587                 //parseStack.push(el);
31588                 return true;
31589         }
31590   }
31591   function parseHtmlSpecialContent(source,elStartEnd,tagName,entityReplacer,domBuilder){
31592         if(/^(?:script|textarea)$/i.test(tagName)){
31593                 var elEndStart =  source.indexOf('</'+tagName+'>',elStartEnd);
31594                 var text = source.substring(elStartEnd+1,elEndStart);
31595                 if(/[&<]/.test(text)){
31596                         if(/^script$/i.test(tagName)){
31597                                 //if(!/\]\]>/.test(text)){
31598                                         //lexHandler.startCDATA();
31599                                         domBuilder.characters(text,0,text.length);
31600                                         //lexHandler.endCDATA();
31601                                         return elEndStart;
31602                                 //}
31603                         }//}else{//text area
31604                                 text = text.replace(/&#?\w+;/g,entityReplacer);
31605                                 domBuilder.characters(text,0,text.length);
31606                                 return elEndStart;
31607                         //}
31608                         
31609                 }
31610         }
31611         return elStartEnd+1;
31612   }
31613   function fixSelfClosed(source,elStartEnd,tagName,closeMap){
31614         //if(tagName in closeMap){
31615         var pos = closeMap[tagName];
31616         if(pos == null){
31617                 //console.log(tagName)
31618                 pos =  source.lastIndexOf('</'+tagName+'>');
31619                 if(pos<elStartEnd){//忘记闭合
31620                         pos = source.lastIndexOf('</'+tagName);
31621                 }
31622                 closeMap[tagName] =pos;
31623         }
31624         return pos<elStartEnd;
31625         //} 
31626   }
31627   function _copy(source,target){
31628         for(var n in source){target[n] = source[n];}
31629   }
31630   function parseDCC(source,start,domBuilder,errorHandler){//sure start with '<!'
31631         var next= source.charAt(start+2);
31632         switch(next){
31633         case '-':
31634                 if(source.charAt(start + 3) === '-'){
31635                         var end = source.indexOf('-->',start+4);
31636                         //append comment source.substring(4,end)//<!--
31637                         if(end>start){
31638                                 domBuilder.comment(source,start+4,end-start-4);
31639                                 return end+3;
31640                         }else{
31641                                 errorHandler.error("Unclosed comment");
31642                                 return -1;
31643                         }
31644                 }else{
31645                         //error
31646                         return -1;
31647                 }
31648         default:
31649                 if(source.substr(start+3,6) == 'CDATA['){
31650                         var end = source.indexOf(']]>',start+9);
31651                         domBuilder.startCDATA();
31652                         domBuilder.characters(source,start+9,end-start-9);
31653                         domBuilder.endCDATA(); 
31654                         return end+3;
31655                 }
31656                 //<!DOCTYPE
31657                 //startDTD(java.lang.String name, java.lang.String publicId, java.lang.String systemId) 
31658                 var matchs = split(source,start);
31659                 var len = matchs.length;
31660                 if(len>1 && /!doctype/i.test(matchs[0][0])){
31661                         var name = matchs[1][0];
31662                         var pubid = len>3 && /^public$/i.test(matchs[2][0]) && matchs[3][0];
31663                         var sysid = len>4 && matchs[4][0];
31664                         var lastMatch = matchs[len-1];
31665                         domBuilder.startDTD(name,pubid && pubid.replace(/^(['"])(.*?)\1$/,'$2'),
31666                                         sysid && sysid.replace(/^(['"])(.*?)\1$/,'$2'));
31667                         domBuilder.endDTD();
31668                         
31669                         return lastMatch.index+lastMatch[0].length
31670                 }
31671         }
31672         return -1;
31673   }
31674
31675
31676
31677   function parseInstruction(source,start,domBuilder){
31678         var end = source.indexOf('?>',start);
31679         if(end){
31680                 var match = source.substring(start,end).match(/^<\?(\S*)\s*([\s\S]*?)\s*$/);
31681                 if(match){
31682                         var len = match[0].length;
31683                         domBuilder.processingInstruction(match[1], match[2]) ;
31684                         return end+2;
31685                 }else{//error
31686                         return -1;
31687                 }
31688         }
31689         return -1;
31690   }
31691
31692   /**
31693    * @param source
31694    */
31695   function ElementAttributes(source){
31696         
31697   }
31698   ElementAttributes.prototype = {
31699         setTagName:function(tagName){
31700                 if(!tagNamePattern.test(tagName)){
31701                         throw new Error('invalid tagName:'+tagName)
31702                 }
31703                 this.tagName = tagName;
31704         },
31705         add:function(qName,value,offset){
31706                 if(!tagNamePattern.test(qName)){
31707                         throw new Error('invalid attribute:'+qName)
31708                 }
31709                 this[this.length++] = {qName:qName,value:value,offset:offset};
31710         },
31711         length:0,
31712         getLocalName:function(i){return this[i].localName},
31713         getLocator:function(i){return this[i].locator},
31714         getQName:function(i){return this[i].qName},
31715         getURI:function(i){return this[i].uri},
31716         getValue:function(i){return this[i].value}
31717   //    ,getIndex:function(uri, localName)){
31718   //            if(localName){
31719   //                    
31720   //            }else{
31721   //                    var qName = uri
31722   //            }
31723   //    },
31724   //    getValue:function(){return this.getValue(this.getIndex.apply(this,arguments))},
31725   //    getType:function(uri,localName){}
31726   //    getType:function(i){},
31727   };
31728
31729
31730
31731
31732   function _set_proto_(thiz,parent){
31733         thiz.__proto__ = parent;
31734         return thiz;
31735   }
31736   if(!(_set_proto_({},_set_proto_.prototype) instanceof _set_proto_)){
31737         _set_proto_ = function(thiz,parent){
31738                 function p(){}          p.prototype = parent;
31739                 p = new p();
31740                 for(parent in thiz){
31741                         p[parent] = thiz[parent];
31742                 }
31743                 return p;
31744         };
31745   }
31746
31747   function split(source,start){
31748         var match;
31749         var buf = [];
31750         var reg = /'[^']+'|"[^"]+"|[^\s<>\/=]+=?|(\/?\s*>|<)/g;
31751         reg.lastIndex = start;
31752         reg.exec(source);//skip <
31753         while(match = reg.exec(source)){
31754                 buf.push(match);
31755                 if(match[1])return buf;
31756         }
31757   }
31758
31759   var XMLReader_1 = XMLReader;
31760
31761   var sax = {
31762         XMLReader: XMLReader_1
31763   };
31764
31765   /*
31766    * DOM Level 2
31767    * Object DOMException
31768    * @see http://www.w3.org/TR/REC-DOM-Level-1/ecma-script-language-binding.html
31769    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/ecma-script-binding.html
31770    */
31771
31772   function copy$1(src,dest){
31773         for(var p in src){
31774                 dest[p] = src[p];
31775         }
31776   }
31777   /**
31778   ^\w+\.prototype\.([_\w]+)\s*=\s*((?:.*\{\s*?[\r\n][\s\S]*?^})|\S.*?(?=[;\r\n]));?
31779   ^\w+\.prototype\.([_\w]+)\s*=\s*(\S.*?(?=[;\r\n]));?
31780    */
31781   function _extends(Class,Super){
31782         var pt = Class.prototype;
31783         if(Object.create){
31784                 var ppt = Object.create(Super.prototype);
31785                 pt.__proto__ = ppt;
31786         }
31787         if(!(pt instanceof Super)){
31788                 function t(){}          t.prototype = Super.prototype;
31789                 t = new t();
31790                 copy$1(pt,t);
31791                 Class.prototype = pt = t;
31792         }
31793         if(pt.constructor != Class){
31794                 if(typeof Class != 'function'){
31795                         console.error("unknow Class:"+Class);
31796                 }
31797                 pt.constructor = Class;
31798         }
31799   }
31800   var htmlns = 'http://www.w3.org/1999/xhtml' ;
31801   // Node Types
31802   var NodeType = {};
31803   var ELEMENT_NODE                = NodeType.ELEMENT_NODE                = 1;
31804   var ATTRIBUTE_NODE              = NodeType.ATTRIBUTE_NODE              = 2;
31805   var TEXT_NODE                   = NodeType.TEXT_NODE                   = 3;
31806   var CDATA_SECTION_NODE          = NodeType.CDATA_SECTION_NODE          = 4;
31807   var ENTITY_REFERENCE_NODE       = NodeType.ENTITY_REFERENCE_NODE       = 5;
31808   var ENTITY_NODE                 = NodeType.ENTITY_NODE                 = 6;
31809   var PROCESSING_INSTRUCTION_NODE = NodeType.PROCESSING_INSTRUCTION_NODE = 7;
31810   var COMMENT_NODE                = NodeType.COMMENT_NODE                = 8;
31811   var DOCUMENT_NODE               = NodeType.DOCUMENT_NODE               = 9;
31812   var DOCUMENT_TYPE_NODE          = NodeType.DOCUMENT_TYPE_NODE          = 10;
31813   var DOCUMENT_FRAGMENT_NODE      = NodeType.DOCUMENT_FRAGMENT_NODE      = 11;
31814   var NOTATION_NODE               = NodeType.NOTATION_NODE               = 12;
31815
31816   // ExceptionCode
31817   var ExceptionCode = {};
31818   var ExceptionMessage = {};
31819   var INDEX_SIZE_ERR              = ExceptionCode.INDEX_SIZE_ERR              = ((ExceptionMessage[1]="Index size error"),1);
31820   var DOMSTRING_SIZE_ERR          = ExceptionCode.DOMSTRING_SIZE_ERR          = ((ExceptionMessage[2]="DOMString size error"),2);
31821   var HIERARCHY_REQUEST_ERR       = ExceptionCode.HIERARCHY_REQUEST_ERR       = ((ExceptionMessage[3]="Hierarchy request error"),3);
31822   var WRONG_DOCUMENT_ERR          = ExceptionCode.WRONG_DOCUMENT_ERR          = ((ExceptionMessage[4]="Wrong document"),4);
31823   var INVALID_CHARACTER_ERR       = ExceptionCode.INVALID_CHARACTER_ERR       = ((ExceptionMessage[5]="Invalid character"),5);
31824   var NO_DATA_ALLOWED_ERR         = ExceptionCode.NO_DATA_ALLOWED_ERR         = ((ExceptionMessage[6]="No data allowed"),6);
31825   var NO_MODIFICATION_ALLOWED_ERR = ExceptionCode.NO_MODIFICATION_ALLOWED_ERR = ((ExceptionMessage[7]="No modification allowed"),7);
31826   var NOT_FOUND_ERR               = ExceptionCode.NOT_FOUND_ERR               = ((ExceptionMessage[8]="Not found"),8);
31827   var NOT_SUPPORTED_ERR           = ExceptionCode.NOT_SUPPORTED_ERR           = ((ExceptionMessage[9]="Not supported"),9);
31828   var INUSE_ATTRIBUTE_ERR         = ExceptionCode.INUSE_ATTRIBUTE_ERR         = ((ExceptionMessage[10]="Attribute in use"),10);
31829   //level2
31830   var INVALID_STATE_ERR         = ExceptionCode.INVALID_STATE_ERR               = ((ExceptionMessage[11]="Invalid state"),11);
31831   var SYNTAX_ERR                = ExceptionCode.SYNTAX_ERR                      = ((ExceptionMessage[12]="Syntax error"),12);
31832   var INVALID_MODIFICATION_ERR  = ExceptionCode.INVALID_MODIFICATION_ERR        = ((ExceptionMessage[13]="Invalid modification"),13);
31833   var NAMESPACE_ERR             = ExceptionCode.NAMESPACE_ERR                   = ((ExceptionMessage[14]="Invalid namespace"),14);
31834   var INVALID_ACCESS_ERR        = ExceptionCode.INVALID_ACCESS_ERR              = ((ExceptionMessage[15]="Invalid access"),15);
31835
31836
31837   function DOMException(code, message) {
31838         if(message instanceof Error){
31839                 var error = message;
31840         }else{
31841                 error = this;
31842                 Error.call(this, ExceptionMessage[code]);
31843                 this.message = ExceptionMessage[code];
31844                 if(Error.captureStackTrace) Error.captureStackTrace(this, DOMException);
31845         }
31846         error.code = code;
31847         if(message) this.message = this.message + ": " + message;
31848         return error;
31849   }DOMException.prototype = Error.prototype;
31850   copy$1(ExceptionCode,DOMException);
31851   /**
31852    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-536297177
31853    * 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.
31854    * The items in the NodeList are accessible via an integral index, starting from 0.
31855    */
31856   function NodeList() {
31857   }NodeList.prototype = {
31858         /**
31859          * The number of nodes in the list. The range of valid child node indices is 0 to length-1 inclusive.
31860          * @standard level1
31861          */
31862         length:0, 
31863         /**
31864          * 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.
31865          * @standard level1
31866          * @param index  unsigned long 
31867          *   Index into the collection.
31868          * @return Node
31869          *      The node at the indexth position in the NodeList, or null if that is not a valid index. 
31870          */
31871         item: function(index) {
31872                 return this[index] || null;
31873         },
31874         toString:function(isHTML,nodeFilter){
31875                 for(var buf = [], i = 0;i<this.length;i++){
31876                         serializeToString(this[i],buf,isHTML,nodeFilter);
31877                 }
31878                 return buf.join('');
31879         }
31880   };
31881   function LiveNodeList(node,refresh){
31882         this._node = node;
31883         this._refresh = refresh;
31884         _updateLiveList(this);
31885   }
31886   function _updateLiveList(list){
31887         var inc = list._node._inc || list._node.ownerDocument._inc;
31888         if(list._inc != inc){
31889                 var ls = list._refresh(list._node);
31890                 //console.log(ls.length)
31891                 __set__(list,'length',ls.length);
31892                 copy$1(ls,list);
31893                 list._inc = inc;
31894         }
31895   }
31896   LiveNodeList.prototype.item = function(i){
31897         _updateLiveList(this);
31898         return this[i];
31899   };
31900
31901   _extends(LiveNodeList,NodeList);
31902   /**
31903    * 
31904    * 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.
31905    * NamedNodeMap objects in the DOM are live.
31906    * used for attributes or DocumentType entities 
31907    */
31908   function NamedNodeMap() {
31909   }
31910   function _findNodeIndex(list,node){
31911         var i = list.length;
31912         while(i--){
31913                 if(list[i] === node){return i}
31914         }
31915   }
31916
31917   function _addNamedNode(el,list,newAttr,oldAttr){
31918         if(oldAttr){
31919                 list[_findNodeIndex(list,oldAttr)] = newAttr;
31920         }else{
31921                 list[list.length++] = newAttr;
31922         }
31923         if(el){
31924                 newAttr.ownerElement = el;
31925                 var doc = el.ownerDocument;
31926                 if(doc){
31927                         oldAttr && _onRemoveAttribute(doc,el,oldAttr);
31928                         _onAddAttribute(doc,el,newAttr);
31929                 }
31930         }
31931   }
31932   function _removeNamedNode(el,list,attr){
31933         //console.log('remove attr:'+attr)
31934         var i = _findNodeIndex(list,attr);
31935         if(i>=0){
31936                 var lastIndex = list.length-1;
31937                 while(i<lastIndex){
31938                         list[i] = list[++i];
31939                 }
31940                 list.length = lastIndex;
31941                 if(el){
31942                         var doc = el.ownerDocument;
31943                         if(doc){
31944                                 _onRemoveAttribute(doc,el,attr);
31945                                 attr.ownerElement = null;
31946                         }
31947                 }
31948         }else{
31949                 throw DOMException(NOT_FOUND_ERR,new Error(el.tagName+'@'+attr))
31950         }
31951   }
31952   NamedNodeMap.prototype = {
31953         length:0,
31954         item:NodeList.prototype.item,
31955         getNamedItem: function(key) {
31956   //            if(key.indexOf(':')>0 || key == 'xmlns'){
31957   //                    return null;
31958   //            }
31959                 //console.log()
31960                 var i = this.length;
31961                 while(i--){
31962                         var attr = this[i];
31963                         //console.log(attr.nodeName,key)
31964                         if(attr.nodeName == key){
31965                                 return attr;
31966                         }
31967                 }
31968         },
31969         setNamedItem: function(attr) {
31970                 var el = attr.ownerElement;
31971                 if(el && el!=this._ownerElement){
31972                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
31973                 }
31974                 var oldAttr = this.getNamedItem(attr.nodeName);
31975                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
31976                 return oldAttr;
31977         },
31978         /* returns Node */
31979         setNamedItemNS: function(attr) {// raises: WRONG_DOCUMENT_ERR,NO_MODIFICATION_ALLOWED_ERR,INUSE_ATTRIBUTE_ERR
31980                 var el = attr.ownerElement, oldAttr;
31981                 if(el && el!=this._ownerElement){
31982                         throw new DOMException(INUSE_ATTRIBUTE_ERR);
31983                 }
31984                 oldAttr = this.getNamedItemNS(attr.namespaceURI,attr.localName);
31985                 _addNamedNode(this._ownerElement,this,attr,oldAttr);
31986                 return oldAttr;
31987         },
31988
31989         /* returns Node */
31990         removeNamedItem: function(key) {
31991                 var attr = this.getNamedItem(key);
31992                 _removeNamedNode(this._ownerElement,this,attr);
31993                 return attr;
31994                 
31995                 
31996         },// raises: NOT_FOUND_ERR,NO_MODIFICATION_ALLOWED_ERR
31997         
31998         //for level2
31999         removeNamedItemNS:function(namespaceURI,localName){
32000                 var attr = this.getNamedItemNS(namespaceURI,localName);
32001                 _removeNamedNode(this._ownerElement,this,attr);
32002                 return attr;
32003         },
32004         getNamedItemNS: function(namespaceURI, localName) {
32005                 var i = this.length;
32006                 while(i--){
32007                         var node = this[i];
32008                         if(node.localName == localName && node.namespaceURI == namespaceURI){
32009                                 return node;
32010                         }
32011                 }
32012                 return null;
32013         }
32014   };
32015   /**
32016    * @see http://www.w3.org/TR/REC-DOM-Level-1/level-one-core.html#ID-102161490
32017    */
32018   function DOMImplementation(/* Object */ features) {
32019         this._features = {};
32020         if (features) {
32021                 for (var feature in features) {
32022                          this._features = features[feature];
32023                 }
32024         }
32025   }
32026   DOMImplementation.prototype = {
32027         hasFeature: function(/* string */ feature, /* string */ version) {
32028                 var versions = this._features[feature.toLowerCase()];
32029                 if (versions && (!version || version in versions)) {
32030                         return true;
32031                 } else {
32032                         return false;
32033                 }
32034         },
32035         // Introduced in DOM Level 2:
32036         createDocument:function(namespaceURI,  qualifiedName, doctype){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR,WRONG_DOCUMENT_ERR
32037                 var doc = new Document();
32038                 doc.implementation = this;
32039                 doc.childNodes = new NodeList();
32040                 doc.doctype = doctype;
32041                 if(doctype){
32042                         doc.appendChild(doctype);
32043                 }
32044                 if(qualifiedName){
32045                         var root = doc.createElementNS(namespaceURI,qualifiedName);
32046                         doc.appendChild(root);
32047                 }
32048                 return doc;
32049         },
32050         // Introduced in DOM Level 2:
32051         createDocumentType:function(qualifiedName, publicId, systemId){// raises:INVALID_CHARACTER_ERR,NAMESPACE_ERR
32052                 var node = new DocumentType();
32053                 node.name = qualifiedName;
32054                 node.nodeName = qualifiedName;
32055                 node.publicId = publicId;
32056                 node.systemId = systemId;
32057                 // Introduced in DOM Level 2:
32058                 //readonly attribute DOMString        internalSubset;
32059                 
32060                 //TODO:..
32061                 //  readonly attribute NamedNodeMap     entities;
32062                 //  readonly attribute NamedNodeMap     notations;
32063                 return node;
32064         }
32065   };
32066
32067
32068   /**
32069    * @see http://www.w3.org/TR/2000/REC-DOM-Level-2-Core-20001113/core.html#ID-1950641247
32070    */
32071
32072   function Node$2() {
32073   }
32074   Node$2.prototype = {
32075         firstChild : null,
32076         lastChild : null,
32077         previousSibling : null,
32078         nextSibling : null,
32079         attributes : null,
32080         parentNode : null,
32081         childNodes : null,
32082         ownerDocument : null,
32083         nodeValue : null,
32084         namespaceURI : null,
32085         prefix : null,
32086         localName : null,
32087         // Modified in DOM Level 2:
32088         insertBefore:function(newChild, refChild){//raises 
32089                 return _insertBefore(this,newChild,refChild);
32090         },
32091         replaceChild:function(newChild, oldChild){//raises 
32092                 this.insertBefore(newChild,oldChild);
32093                 if(oldChild){
32094                         this.removeChild(oldChild);
32095                 }
32096         },
32097         removeChild:function(oldChild){
32098                 return _removeChild(this,oldChild);
32099         },
32100         appendChild:function(newChild){
32101                 return this.insertBefore(newChild,null);
32102         },
32103         hasChildNodes:function(){
32104                 return this.firstChild != null;
32105         },
32106         cloneNode:function(deep){
32107                 return cloneNode(this.ownerDocument||this,this,deep);
32108         },
32109         // Modified in DOM Level 2:
32110         normalize:function(){
32111                 var child = this.firstChild;
32112                 while(child){
32113                         var next = child.nextSibling;
32114                         if(next && next.nodeType == TEXT_NODE && child.nodeType == TEXT_NODE){
32115                                 this.removeChild(next);
32116                                 child.appendData(next.data);
32117                         }else{
32118                                 child.normalize();
32119                                 child = next;
32120                         }
32121                 }
32122         },
32123         // Introduced in DOM Level 2:
32124         isSupported:function(feature, version){
32125                 return this.ownerDocument.implementation.hasFeature(feature,version);
32126         },
32127       // Introduced in DOM Level 2:
32128       hasAttributes:function(){
32129         return this.attributes.length>0;
32130       },
32131       lookupPrefix:function(namespaceURI){
32132         var el = this;
32133         while(el){
32134                 var map = el._nsMap;
32135                 //console.dir(map)
32136                 if(map){
32137                         for(var n in map){
32138                                 if(map[n] == namespaceURI){
32139                                         return n;
32140                                 }
32141                         }
32142                 }
32143                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
32144         }
32145         return null;
32146       },
32147       // Introduced in DOM Level 3:
32148       lookupNamespaceURI:function(prefix){
32149         var el = this;
32150         while(el){
32151                 var map = el._nsMap;
32152                 //console.dir(map)
32153                 if(map){
32154                         if(prefix in map){
32155                                 return map[prefix] ;
32156                         }
32157                 }
32158                 el = el.nodeType == ATTRIBUTE_NODE?el.ownerDocument : el.parentNode;
32159         }
32160         return null;
32161       },
32162       // Introduced in DOM Level 3:
32163       isDefaultNamespace:function(namespaceURI){
32164         var prefix = this.lookupPrefix(namespaceURI);
32165         return prefix == null;
32166       }
32167   };
32168
32169
32170   function _xmlEncoder(c){
32171         return c == '<' && '&lt;' ||
32172            c == '>' && '&gt;' ||
32173            c == '&' && '&amp;' ||
32174            c == '"' && '&quot;' ||
32175            '&#'+c.charCodeAt()+';'
32176   }
32177
32178
32179   copy$1(NodeType,Node$2);
32180   copy$1(NodeType,Node$2.prototype);
32181
32182   /**
32183    * @param callback return true for continue,false for break
32184    * @return boolean true: break visit;
32185    */
32186   function _visitNode(node,callback){
32187         if(callback(node)){
32188                 return true;
32189         }
32190         if(node = node.firstChild){
32191                 do{
32192                         if(_visitNode(node,callback)){return true}
32193           }while(node=node.nextSibling)
32194       }
32195   }
32196
32197
32198
32199   function Document(){
32200   }
32201   function _onAddAttribute(doc,el,newAttr){
32202         doc && doc._inc++;
32203         var ns = newAttr.namespaceURI ;
32204         if(ns == 'http://www.w3.org/2000/xmlns/'){
32205                 //update namespace
32206                 el._nsMap[newAttr.prefix?newAttr.localName:''] = newAttr.value;
32207         }
32208   }
32209   function _onRemoveAttribute(doc,el,newAttr,remove){
32210         doc && doc._inc++;
32211         var ns = newAttr.namespaceURI ;
32212         if(ns == 'http://www.w3.org/2000/xmlns/'){
32213                 //update namespace
32214                 delete el._nsMap[newAttr.prefix?newAttr.localName:''];
32215         }
32216   }
32217   function _onUpdateChild(doc,el,newChild){
32218         if(doc && doc._inc){
32219                 doc._inc++;
32220                 //update childNodes
32221                 var cs = el.childNodes;
32222                 if(newChild){
32223                         cs[cs.length++] = newChild;
32224                 }else{
32225                         //console.log(1)
32226                         var child = el.firstChild;
32227                         var i = 0;
32228                         while(child){
32229                                 cs[i++] = child;
32230                                 child =child.nextSibling;
32231                         }
32232                         cs.length = i;
32233                 }
32234         }
32235   }
32236
32237   /**
32238    * attributes;
32239    * children;
32240    * 
32241    * writeable properties:
32242    * nodeValue,Attr:value,CharacterData:data
32243    * prefix
32244    */
32245   function _removeChild(parentNode,child){
32246         var previous = child.previousSibling;
32247         var next = child.nextSibling;
32248         if(previous){
32249                 previous.nextSibling = next;
32250         }else{
32251                 parentNode.firstChild = next;
32252         }
32253         if(next){
32254                 next.previousSibling = previous;
32255         }else{
32256                 parentNode.lastChild = previous;
32257         }
32258         _onUpdateChild(parentNode.ownerDocument,parentNode);
32259         return child;
32260   }
32261   /**
32262    * preformance key(refChild == null)
32263    */
32264   function _insertBefore(parentNode,newChild,nextChild){
32265         var cp = newChild.parentNode;
32266         if(cp){
32267                 cp.removeChild(newChild);//remove and update
32268         }
32269         if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
32270                 var newFirst = newChild.firstChild;
32271                 if (newFirst == null) {
32272                         return newChild;
32273                 }
32274                 var newLast = newChild.lastChild;
32275         }else{
32276                 newFirst = newLast = newChild;
32277         }
32278         var pre = nextChild ? nextChild.previousSibling : parentNode.lastChild;
32279
32280         newFirst.previousSibling = pre;
32281         newLast.nextSibling = nextChild;
32282         
32283         
32284         if(pre){
32285                 pre.nextSibling = newFirst;
32286         }else{
32287                 parentNode.firstChild = newFirst;
32288         }
32289         if(nextChild == null){
32290                 parentNode.lastChild = newLast;
32291         }else{
32292                 nextChild.previousSibling = newLast;
32293         }
32294         do{
32295                 newFirst.parentNode = parentNode;
32296         }while(newFirst !== newLast && (newFirst= newFirst.nextSibling))
32297         _onUpdateChild(parentNode.ownerDocument||parentNode,parentNode);
32298         //console.log(parentNode.lastChild.nextSibling == null)
32299         if (newChild.nodeType == DOCUMENT_FRAGMENT_NODE) {
32300                 newChild.firstChild = newChild.lastChild = null;
32301         }
32302         return newChild;
32303   }
32304   function _appendSingleChild(parentNode,newChild){
32305         var cp = newChild.parentNode;
32306         if(cp){
32307                 var pre = parentNode.lastChild;
32308                 cp.removeChild(newChild);//remove and update
32309                 var pre = parentNode.lastChild;
32310         }
32311         var pre = parentNode.lastChild;
32312         newChild.parentNode = parentNode;
32313         newChild.previousSibling = pre;
32314         newChild.nextSibling = null;
32315         if(pre){
32316                 pre.nextSibling = newChild;
32317         }else{
32318                 parentNode.firstChild = newChild;
32319         }
32320         parentNode.lastChild = newChild;
32321         _onUpdateChild(parentNode.ownerDocument,parentNode,newChild);
32322         return newChild;
32323         //console.log("__aa",parentNode.lastChild.nextSibling == null)
32324   }
32325   Document.prototype = {
32326         //implementation : null,
32327         nodeName :  '#document',
32328         nodeType :  DOCUMENT_NODE,
32329         doctype :  null,
32330         documentElement :  null,
32331         _inc : 1,
32332         
32333         insertBefore :  function(newChild, refChild){//raises 
32334                 if(newChild.nodeType == DOCUMENT_FRAGMENT_NODE){
32335                         var child = newChild.firstChild;
32336                         while(child){
32337                                 var next = child.nextSibling;
32338                                 this.insertBefore(child,refChild);
32339                                 child = next;
32340                         }
32341                         return newChild;
32342                 }
32343                 if(this.documentElement == null && newChild.nodeType == ELEMENT_NODE){
32344                         this.documentElement = newChild;
32345                 }
32346                 
32347                 return _insertBefore(this,newChild,refChild),(newChild.ownerDocument = this),newChild;
32348         },
32349         removeChild :  function(oldChild){
32350                 if(this.documentElement == oldChild){
32351                         this.documentElement = null;
32352                 }
32353                 return _removeChild(this,oldChild);
32354         },
32355         // Introduced in DOM Level 2:
32356         importNode : function(importedNode,deep){
32357                 return importNode(this,importedNode,deep);
32358         },
32359         // Introduced in DOM Level 2:
32360         getElementById :        function(id){
32361                 var rtv = null;
32362                 _visitNode(this.documentElement,function(node){
32363                         if(node.nodeType == ELEMENT_NODE){
32364                                 if(node.getAttribute('id') == id){
32365                                         rtv = node;
32366                                         return true;
32367                                 }
32368                         }
32369                 });
32370                 return rtv;
32371         },
32372         
32373         //document factory method:
32374         createElement : function(tagName){
32375                 var node = new Element();
32376                 node.ownerDocument = this;
32377                 node.nodeName = tagName;
32378                 node.tagName = tagName;
32379                 node.childNodes = new NodeList();
32380                 var attrs       = node.attributes = new NamedNodeMap();
32381                 attrs._ownerElement = node;
32382                 return node;
32383         },
32384         createDocumentFragment :        function(){
32385                 var node = new DocumentFragment();
32386                 node.ownerDocument = this;
32387                 node.childNodes = new NodeList();
32388                 return node;
32389         },
32390         createTextNode :        function(data){
32391                 var node = new Text();
32392                 node.ownerDocument = this;
32393                 node.appendData(data);
32394                 return node;
32395         },
32396         createComment : function(data){
32397                 var node = new Comment();
32398                 node.ownerDocument = this;
32399                 node.appendData(data);
32400                 return node;
32401         },
32402         createCDATASection :    function(data){
32403                 var node = new CDATASection();
32404                 node.ownerDocument = this;
32405                 node.appendData(data);
32406                 return node;
32407         },
32408         createProcessingInstruction :   function(target,data){
32409                 var node = new ProcessingInstruction();
32410                 node.ownerDocument = this;
32411                 node.tagName = node.target = target;
32412                 node.nodeValue= node.data = data;
32413                 return node;
32414         },
32415         createAttribute :       function(name){
32416                 var node = new Attr();
32417                 node.ownerDocument      = this;
32418                 node.name = name;
32419                 node.nodeName   = name;
32420                 node.localName = name;
32421                 node.specified = true;
32422                 return node;
32423         },
32424         createEntityReference : function(name){
32425                 var node = new EntityReference();
32426                 node.ownerDocument      = this;
32427                 node.nodeName   = name;
32428                 return node;
32429         },
32430         // Introduced in DOM Level 2:
32431         createElementNS :       function(namespaceURI,qualifiedName){
32432                 var node = new Element();
32433                 var pl = qualifiedName.split(':');
32434                 var attrs       = node.attributes = new NamedNodeMap();
32435                 node.childNodes = new NodeList();
32436                 node.ownerDocument = this;
32437                 node.nodeName = qualifiedName;
32438                 node.tagName = qualifiedName;
32439                 node.namespaceURI = namespaceURI;
32440                 if(pl.length == 2){
32441                         node.prefix = pl[0];
32442                         node.localName = pl[1];
32443                 }else{
32444                         //el.prefix = null;
32445                         node.localName = qualifiedName;
32446                 }
32447                 attrs._ownerElement = node;
32448                 return node;
32449         },
32450         // Introduced in DOM Level 2:
32451         createAttributeNS :     function(namespaceURI,qualifiedName){
32452                 var node = new Attr();
32453                 var pl = qualifiedName.split(':');
32454                 node.ownerDocument = this;
32455                 node.nodeName = qualifiedName;
32456                 node.name = qualifiedName;
32457                 node.namespaceURI = namespaceURI;
32458                 node.specified = true;
32459                 if(pl.length == 2){
32460                         node.prefix = pl[0];
32461                         node.localName = pl[1];
32462                 }else{
32463                         //el.prefix = null;
32464                         node.localName = qualifiedName;
32465                 }
32466                 return node;
32467         }
32468   };
32469   _extends(Document,Node$2);
32470
32471
32472   function Element() {
32473         this._nsMap = {};
32474   }Element.prototype = {
32475         nodeType : ELEMENT_NODE,
32476         hasAttribute : function(name){
32477                 return this.getAttributeNode(name)!=null;
32478         },
32479         getAttribute : function(name){
32480                 var attr = this.getAttributeNode(name);
32481                 return attr && attr.value || '';
32482         },
32483         getAttributeNode : function(name){
32484                 return this.attributes.getNamedItem(name);
32485         },
32486         setAttribute : function(name, value){
32487                 var attr = this.ownerDocument.createAttribute(name);
32488                 attr.value = attr.nodeValue = "" + value;
32489                 this.setAttributeNode(attr);
32490         },
32491         removeAttribute : function(name){
32492                 var attr = this.getAttributeNode(name);
32493                 attr && this.removeAttributeNode(attr);
32494         },
32495         
32496         //four real opeartion method
32497         appendChild:function(newChild){
32498                 if(newChild.nodeType === DOCUMENT_FRAGMENT_NODE){
32499                         return this.insertBefore(newChild,null);
32500                 }else{
32501                         return _appendSingleChild(this,newChild);
32502                 }
32503         },
32504         setAttributeNode : function(newAttr){
32505                 return this.attributes.setNamedItem(newAttr);
32506         },
32507         setAttributeNodeNS : function(newAttr){
32508                 return this.attributes.setNamedItemNS(newAttr);
32509         },
32510         removeAttributeNode : function(oldAttr){
32511                 //console.log(this == oldAttr.ownerElement)
32512                 return this.attributes.removeNamedItem(oldAttr.nodeName);
32513         },
32514         //get real attribute name,and remove it by removeAttributeNode
32515         removeAttributeNS : function(namespaceURI, localName){
32516                 var old = this.getAttributeNodeNS(namespaceURI, localName);
32517                 old && this.removeAttributeNode(old);
32518         },
32519         
32520         hasAttributeNS : function(namespaceURI, localName){
32521                 return this.getAttributeNodeNS(namespaceURI, localName)!=null;
32522         },
32523         getAttributeNS : function(namespaceURI, localName){
32524                 var attr = this.getAttributeNodeNS(namespaceURI, localName);
32525                 return attr && attr.value || '';
32526         },
32527         setAttributeNS : function(namespaceURI, qualifiedName, value){
32528                 var attr = this.ownerDocument.createAttributeNS(namespaceURI, qualifiedName);
32529                 attr.value = attr.nodeValue = "" + value;
32530                 this.setAttributeNode(attr);
32531         },
32532         getAttributeNodeNS : function(namespaceURI, localName){
32533                 return this.attributes.getNamedItemNS(namespaceURI, localName);
32534         },
32535         
32536         getElementsByTagName : function(tagName){
32537                 return new LiveNodeList(this,function(base){
32538                         var ls = [];
32539                         _visitNode(base,function(node){
32540                                 if(node !== base && node.nodeType == ELEMENT_NODE && (tagName === '*' || node.tagName == tagName)){
32541                                         ls.push(node);
32542                                 }
32543                         });
32544                         return ls;
32545                 });
32546         },
32547         getElementsByTagNameNS : function(namespaceURI, localName){
32548                 return new LiveNodeList(this,function(base){
32549                         var ls = [];
32550                         _visitNode(base,function(node){
32551                                 if(node !== base && node.nodeType === ELEMENT_NODE && (namespaceURI === '*' || node.namespaceURI === namespaceURI) && (localName === '*' || node.localName == localName)){
32552                                         ls.push(node);
32553                                 }
32554                         });
32555                         return ls;
32556                         
32557                 });
32558         }
32559   };
32560   Document.prototype.getElementsByTagName = Element.prototype.getElementsByTagName;
32561   Document.prototype.getElementsByTagNameNS = Element.prototype.getElementsByTagNameNS;
32562
32563
32564   _extends(Element,Node$2);
32565   function Attr() {
32566   }Attr.prototype.nodeType = ATTRIBUTE_NODE;
32567   _extends(Attr,Node$2);
32568
32569
32570   function CharacterData() {
32571   }CharacterData.prototype = {
32572         data : '',
32573         substringData : function(offset, count) {
32574                 return this.data.substring(offset, offset+count);
32575         },
32576         appendData: function(text) {
32577                 text = this.data+text;
32578                 this.nodeValue = this.data = text;
32579                 this.length = text.length;
32580         },
32581         insertData: function(offset,text) {
32582                 this.replaceData(offset,0,text);
32583         
32584         },
32585         appendChild:function(newChild){
32586                 throw new Error(ExceptionMessage[HIERARCHY_REQUEST_ERR])
32587         },
32588         deleteData: function(offset, count) {
32589                 this.replaceData(offset,count,"");
32590         },
32591         replaceData: function(offset, count, text) {
32592                 var start = this.data.substring(0,offset);
32593                 var end = this.data.substring(offset+count);
32594                 text = start + text + end;
32595                 this.nodeValue = this.data = text;
32596                 this.length = text.length;
32597         }
32598   };
32599   _extends(CharacterData,Node$2);
32600   function Text() {
32601   }Text.prototype = {
32602         nodeName : "#text",
32603         nodeType : TEXT_NODE,
32604         splitText : function(offset) {
32605                 var text = this.data;
32606                 var newText = text.substring(offset);
32607                 text = text.substring(0, offset);
32608                 this.data = this.nodeValue = text;
32609                 this.length = text.length;
32610                 var newNode = this.ownerDocument.createTextNode(newText);
32611                 if(this.parentNode){
32612                         this.parentNode.insertBefore(newNode, this.nextSibling);
32613                 }
32614                 return newNode;
32615         }
32616   };
32617   _extends(Text,CharacterData);
32618   function Comment() {
32619   }Comment.prototype = {
32620         nodeName : "#comment",
32621         nodeType : COMMENT_NODE
32622   };
32623   _extends(Comment,CharacterData);
32624
32625   function CDATASection() {
32626   }CDATASection.prototype = {
32627         nodeName : "#cdata-section",
32628         nodeType : CDATA_SECTION_NODE
32629   };
32630   _extends(CDATASection,CharacterData);
32631
32632
32633   function DocumentType() {
32634   }DocumentType.prototype.nodeType = DOCUMENT_TYPE_NODE;
32635   _extends(DocumentType,Node$2);
32636
32637   function Notation() {
32638   }Notation.prototype.nodeType = NOTATION_NODE;
32639   _extends(Notation,Node$2);
32640
32641   function Entity() {
32642   }Entity.prototype.nodeType = ENTITY_NODE;
32643   _extends(Entity,Node$2);
32644
32645   function EntityReference() {
32646   }EntityReference.prototype.nodeType = ENTITY_REFERENCE_NODE;
32647   _extends(EntityReference,Node$2);
32648
32649   function DocumentFragment() {
32650   }DocumentFragment.prototype.nodeName =        "#document-fragment";
32651   DocumentFragment.prototype.nodeType = DOCUMENT_FRAGMENT_NODE;
32652   _extends(DocumentFragment,Node$2);
32653
32654
32655   function ProcessingInstruction() {
32656   }
32657   ProcessingInstruction.prototype.nodeType = PROCESSING_INSTRUCTION_NODE;
32658   _extends(ProcessingInstruction,Node$2);
32659   function XMLSerializer$1(){}
32660   XMLSerializer$1.prototype.serializeToString = function(node,isHtml,nodeFilter){
32661         return nodeSerializeToString.call(node,isHtml,nodeFilter);
32662   };
32663   Node$2.prototype.toString = nodeSerializeToString;
32664   function nodeSerializeToString(isHtml,nodeFilter){
32665         var buf = [];
32666         var refNode = this.nodeType == 9?this.documentElement:this;
32667         var prefix = refNode.prefix;
32668         var uri = refNode.namespaceURI;
32669         
32670         if(uri && prefix == null){
32671                 //console.log(prefix)
32672                 var prefix = refNode.lookupPrefix(uri);
32673                 if(prefix == null){
32674                         //isHTML = true;
32675                         var visibleNamespaces=[
32676                         {namespace:uri,prefix:null}
32677                         //{namespace:uri,prefix:''}
32678                         ];
32679                 }
32680         }
32681         serializeToString(this,buf,isHtml,nodeFilter,visibleNamespaces);
32682         //console.log('###',this.nodeType,uri,prefix,buf.join(''))
32683         return buf.join('');
32684   }
32685   function needNamespaceDefine(node,isHTML, visibleNamespaces) {
32686         var prefix = node.prefix||'';
32687         var uri = node.namespaceURI;
32688         if (!prefix && !uri){
32689                 return false;
32690         }
32691         if (prefix === "xml" && uri === "http://www.w3.org/XML/1998/namespace" 
32692                 || uri == 'http://www.w3.org/2000/xmlns/'){
32693                 return false;
32694         }
32695         
32696         var i = visibleNamespaces.length; 
32697         //console.log('@@@@',node.tagName,prefix,uri,visibleNamespaces)
32698         while (i--) {
32699                 var ns = visibleNamespaces[i];
32700                 // get namespace prefix
32701                 //console.log(node.nodeType,node.tagName,ns.prefix,prefix)
32702                 if (ns.prefix == prefix){
32703                         return ns.namespace != uri;
32704                 }
32705         }
32706         //console.log(isHTML,uri,prefix=='')
32707         //if(isHTML && prefix ==null && uri == 'http://www.w3.org/1999/xhtml'){
32708         //      return false;
32709         //}
32710         //node.flag = '11111'
32711         //console.error(3,true,node.flag,node.prefix,node.namespaceURI)
32712         return true;
32713   }
32714   function serializeToString(node,buf,isHTML,nodeFilter,visibleNamespaces){
32715         if(nodeFilter){
32716                 node = nodeFilter(node);
32717                 if(node){
32718                         if(typeof node == 'string'){
32719                                 buf.push(node);
32720                                 return;
32721                         }
32722                 }else{
32723                         return;
32724                 }
32725                 //buf.sort.apply(attrs, attributeSorter);
32726         }
32727         switch(node.nodeType){
32728         case ELEMENT_NODE:
32729                 if (!visibleNamespaces) visibleNamespaces = [];
32730                 var startVisibleNamespaces = visibleNamespaces.length;
32731                 var attrs = node.attributes;
32732                 var len = attrs.length;
32733                 var child = node.firstChild;
32734                 var nodeName = node.tagName;
32735                 
32736                 isHTML =  (htmlns === node.namespaceURI) ||isHTML; 
32737                 buf.push('<',nodeName);
32738                 
32739                 
32740                 
32741                 for(var i=0;i<len;i++){
32742                         // add namespaces for attributes
32743                         var attr = attrs.item(i);
32744                         if (attr.prefix == 'xmlns') {
32745                                 visibleNamespaces.push({ prefix: attr.localName, namespace: attr.value });
32746                         }else if(attr.nodeName == 'xmlns'){
32747                                 visibleNamespaces.push({ prefix: '', namespace: attr.value });
32748                         }
32749                 }
32750                 for(var i=0;i<len;i++){
32751                         var attr = attrs.item(i);
32752                         if (needNamespaceDefine(attr,isHTML, visibleNamespaces)) {
32753                                 var prefix = attr.prefix||'';
32754                                 var uri = attr.namespaceURI;
32755                                 var ns = prefix ? ' xmlns:' + prefix : " xmlns";
32756                                 buf.push(ns, '="' , uri , '"');
32757                                 visibleNamespaces.push({ prefix: prefix, namespace:uri });
32758                         }
32759                         serializeToString(attr,buf,isHTML,nodeFilter,visibleNamespaces);
32760                 }
32761                 // add namespace for current node               
32762                 if (needNamespaceDefine(node,isHTML, visibleNamespaces)) {
32763                         var prefix = node.prefix||'';
32764                         var uri = node.namespaceURI;
32765                         var ns = prefix ? ' xmlns:' + prefix : " xmlns";
32766                         buf.push(ns, '="' , uri , '"');
32767                         visibleNamespaces.push({ prefix: prefix, namespace:uri });
32768                 }
32769                 
32770                 if(child || isHTML && !/^(?:meta|link|img|br|hr|input)$/i.test(nodeName)){
32771                         buf.push('>');
32772                         //if is cdata child node
32773                         if(isHTML && /^script$/i.test(nodeName)){
32774                                 while(child){
32775                                         if(child.data){
32776                                                 buf.push(child.data);
32777                                         }else{
32778                                                 serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32779                                         }
32780                                         child = child.nextSibling;
32781                                 }
32782                         }else
32783                         {
32784                                 while(child){
32785                                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32786                                         child = child.nextSibling;
32787                                 }
32788                         }
32789                         buf.push('</',nodeName,'>');
32790                 }else{
32791                         buf.push('/>');
32792                 }
32793                 // remove added visible namespaces
32794                 //visibleNamespaces.length = startVisibleNamespaces;
32795                 return;
32796         case DOCUMENT_NODE:
32797         case DOCUMENT_FRAGMENT_NODE:
32798                 var child = node.firstChild;
32799                 while(child){
32800                         serializeToString(child,buf,isHTML,nodeFilter,visibleNamespaces);
32801                         child = child.nextSibling;
32802                 }
32803                 return;
32804         case ATTRIBUTE_NODE:
32805                 return buf.push(' ',node.name,'="',node.value.replace(/[<&"]/g,_xmlEncoder),'"');
32806         case TEXT_NODE:
32807                 return buf.push(node.data.replace(/[<&]/g,_xmlEncoder));
32808         case CDATA_SECTION_NODE:
32809                 return buf.push( '<![CDATA[',node.data,']]>');
32810         case COMMENT_NODE:
32811                 return buf.push( "<!--",node.data,"-->");
32812         case DOCUMENT_TYPE_NODE:
32813                 var pubid = node.publicId;
32814                 var sysid = node.systemId;
32815                 buf.push('<!DOCTYPE ',node.name);
32816                 if(pubid){
32817                         buf.push(' PUBLIC "',pubid);
32818                         if (sysid && sysid!='.') {
32819                                 buf.push( '" "',sysid);
32820                         }
32821                         buf.push('">');
32822                 }else if(sysid && sysid!='.'){
32823                         buf.push(' SYSTEM "',sysid,'">');
32824                 }else{
32825                         var sub = node.internalSubset;
32826                         if(sub){
32827                                 buf.push(" [",sub,"]");
32828                         }
32829                         buf.push(">");
32830                 }
32831                 return;
32832         case PROCESSING_INSTRUCTION_NODE:
32833                 return buf.push( "<?",node.target," ",node.data,"?>");
32834         case ENTITY_REFERENCE_NODE:
32835                 return buf.push( '&',node.nodeName,';');
32836         //case ENTITY_NODE:
32837         //case NOTATION_NODE:
32838         default:
32839                 buf.push('??',node.nodeName);
32840         }
32841   }
32842   function importNode(doc,node,deep){
32843         var node2;
32844         switch (node.nodeType) {
32845         case ELEMENT_NODE:
32846                 node2 = node.cloneNode(false);
32847                 node2.ownerDocument = doc;
32848                 //var attrs = node2.attributes;
32849                 //var len = attrs.length;
32850                 //for(var i=0;i<len;i++){
32851                         //node2.setAttributeNodeNS(importNode(doc,attrs.item(i),deep));
32852                 //}
32853         case DOCUMENT_FRAGMENT_NODE:
32854                 break;
32855         case ATTRIBUTE_NODE:
32856                 deep = true;
32857                 break;
32858         //case ENTITY_REFERENCE_NODE:
32859         //case PROCESSING_INSTRUCTION_NODE:
32860         ////case TEXT_NODE:
32861         //case CDATA_SECTION_NODE:
32862         //case COMMENT_NODE:
32863         //      deep = false;
32864         //      break;
32865         //case DOCUMENT_NODE:
32866         //case DOCUMENT_TYPE_NODE:
32867         //cannot be imported.
32868         //case ENTITY_NODE:
32869         //case NOTATION_NODE:
32870         //can not hit in level3
32871         //default:throw e;
32872         }
32873         if(!node2){
32874                 node2 = node.cloneNode(false);//false
32875         }
32876         node2.ownerDocument = doc;
32877         node2.parentNode = null;
32878         if(deep){
32879                 var child = node.firstChild;
32880                 while(child){
32881                         node2.appendChild(importNode(doc,child,deep));
32882                         child = child.nextSibling;
32883                 }
32884         }
32885         return node2;
32886   }
32887   //
32888   //var _relationMap = {firstChild:1,lastChild:1,previousSibling:1,nextSibling:1,
32889   //                                    attributes:1,childNodes:1,parentNode:1,documentElement:1,doctype,};
32890   function cloneNode(doc,node,deep){
32891         var node2 = new node.constructor();
32892         for(var n in node){
32893                 var v = node[n];
32894                 if(typeof v != 'object' ){
32895                         if(v != node2[n]){
32896                                 node2[n] = v;
32897                         }
32898                 }
32899         }
32900         if(node.childNodes){
32901                 node2.childNodes = new NodeList();
32902         }
32903         node2.ownerDocument = doc;
32904         switch (node2.nodeType) {
32905         case ELEMENT_NODE:
32906                 var attrs       = node.attributes;
32907                 var attrs2      = node2.attributes = new NamedNodeMap();
32908                 var len = attrs.length;
32909                 attrs2._ownerElement = node2;
32910                 for(var i=0;i<len;i++){
32911                         node2.setAttributeNode(cloneNode(doc,attrs.item(i),true));
32912                 }
32913                 break;
32914         case ATTRIBUTE_NODE:
32915                 deep = true;
32916         }
32917         if(deep){
32918                 var child = node.firstChild;
32919                 while(child){
32920                         node2.appendChild(cloneNode(doc,child,deep));
32921                         child = child.nextSibling;
32922                 }
32923         }
32924         return node2;
32925   }
32926
32927   function __set__(object,key,value){
32928         object[key] = value;
32929   }
32930   //do dynamic
32931   try{
32932         if(Object.defineProperty){
32933                 Object.defineProperty(LiveNodeList.prototype,'length',{
32934                         get:function(){
32935                                 _updateLiveList(this);
32936                                 return this.$$length;
32937                         }
32938                 });
32939                 Object.defineProperty(Node$2.prototype,'textContent',{
32940                         get:function(){
32941                                 return getTextContent(this);
32942                         },
32943                         set:function(data){
32944                                 switch(this.nodeType){
32945                                 case ELEMENT_NODE:
32946                                 case DOCUMENT_FRAGMENT_NODE:
32947                                         while(this.firstChild){
32948                                                 this.removeChild(this.firstChild);
32949                                         }
32950                                         if(data || String(data)){
32951                                                 this.appendChild(this.ownerDocument.createTextNode(data));
32952                                         }
32953                                         break;
32954                                 default:
32955                                         //TODO:
32956                                         this.data = data;
32957                                         this.value = data;
32958                                         this.nodeValue = data;
32959                                 }
32960                         }
32961                 });
32962                 
32963                 function getTextContent(node){
32964                         switch(node.nodeType){
32965                         case ELEMENT_NODE:
32966                         case DOCUMENT_FRAGMENT_NODE:
32967                                 var buf = [];
32968                                 node = node.firstChild;
32969                                 while(node){
32970                                         if(node.nodeType!==7 && node.nodeType !==8){
32971                                                 buf.push(getTextContent(node));
32972                                         }
32973                                         node = node.nextSibling;
32974                                 }
32975                                 return buf.join('');
32976                         default:
32977                                 return node.nodeValue;
32978                         }
32979                 }
32980                 __set__ = function(object,key,value){
32981                         //console.log(value)
32982                         object['$$'+key] = value;
32983                 };
32984         }
32985   }catch(e){//ie8
32986   }
32987
32988   //if(typeof require == 'function'){
32989         var DOMImplementation_1 = DOMImplementation;
32990         var XMLSerializer_1 = XMLSerializer$1;
32991   //}
32992
32993   var dom = {
32994         DOMImplementation: DOMImplementation_1,
32995         XMLSerializer: XMLSerializer_1
32996   };
32997
32998   var domParser = createCommonjsModule(function (module, exports) {
32999   function DOMParser(options){
33000         this.options = options ||{locator:{}};
33001         
33002   }
33003   DOMParser.prototype.parseFromString = function(source,mimeType){
33004         var options = this.options;
33005         var sax$$1 =  new XMLReader();
33006         var domBuilder = options.domBuilder || new DOMHandler();//contentHandler and LexicalHandler
33007         var errorHandler = options.errorHandler;
33008         var locator = options.locator;
33009         var defaultNSMap = options.xmlns||{};
33010         var entityMap = {'lt':'<','gt':'>','amp':'&','quot':'"','apos':"'"};
33011         if(locator){
33012                 domBuilder.setDocumentLocator(locator);
33013         }
33014         
33015         sax$$1.errorHandler = buildErrorHandler(errorHandler,domBuilder,locator);
33016         sax$$1.domBuilder = options.domBuilder || domBuilder;
33017         if(/\/x?html?$/.test(mimeType)){
33018                 entityMap.nbsp = '\xa0';
33019                 entityMap.copy = '\xa9';
33020                 defaultNSMap['']= 'http://www.w3.org/1999/xhtml';
33021         }
33022         defaultNSMap.xml = defaultNSMap.xml || 'http://www.w3.org/XML/1998/namespace';
33023         if(source){
33024                 sax$$1.parse(source,defaultNSMap,entityMap);
33025         }else{
33026                 sax$$1.errorHandler.error("invalid doc source");
33027         }
33028         return domBuilder.doc;
33029   };
33030   function buildErrorHandler(errorImpl,domBuilder,locator){
33031         if(!errorImpl){
33032                 if(domBuilder instanceof DOMHandler){
33033                         return domBuilder;
33034                 }
33035                 errorImpl = domBuilder ;
33036         }
33037         var errorHandler = {};
33038         var isCallback = errorImpl instanceof Function;
33039         locator = locator||{};
33040         function build(key){
33041                 var fn = errorImpl[key];
33042                 if(!fn && isCallback){
33043                         fn = errorImpl.length == 2?function(msg){errorImpl(key,msg);}:errorImpl;
33044                 }
33045                 errorHandler[key] = fn && function(msg){
33046                         fn('[xmldom '+key+']\t'+msg+_locator(locator));
33047                 }||function(){};
33048         }
33049         build('warning');
33050         build('error');
33051         build('fatalError');
33052         return errorHandler;
33053   }
33054
33055   //console.log('#\n\n\n\n\n\n\n####')
33056   /**
33057    * +ContentHandler+ErrorHandler
33058    * +LexicalHandler+EntityResolver2
33059    * -DeclHandler-DTDHandler 
33060    * 
33061    * DefaultHandler:EntityResolver, DTDHandler, ContentHandler, ErrorHandler
33062    * DefaultHandler2:DefaultHandler,LexicalHandler, DeclHandler, EntityResolver2
33063    * @link http://www.saxproject.org/apidoc/org/xml/sax/helpers/DefaultHandler.html
33064    */
33065   function DOMHandler() {
33066       this.cdata = false;
33067   }
33068   function position(locator,node){
33069         node.lineNumber = locator.lineNumber;
33070         node.columnNumber = locator.columnNumber;
33071   }
33072   /**
33073    * @see org.xml.sax.ContentHandler#startDocument
33074    * @link http://www.saxproject.org/apidoc/org/xml/sax/ContentHandler.html
33075    */ 
33076   DOMHandler.prototype = {
33077         startDocument : function() {
33078         this.doc = new DOMImplementation().createDocument(null, null, null);
33079         if (this.locator) {
33080                 this.doc.documentURI = this.locator.systemId;
33081         }
33082         },
33083         startElement:function(namespaceURI, localName, qName, attrs) {
33084                 var doc = this.doc;
33085             var el = doc.createElementNS(namespaceURI, qName||localName);
33086             var len = attrs.length;
33087             appendElement(this, el);
33088             this.currentElement = el;
33089             
33090                 this.locator && position(this.locator,el);
33091             for (var i = 0 ; i < len; i++) {
33092                 var namespaceURI = attrs.getURI(i);
33093                 var value = attrs.getValue(i);
33094                 var qName = attrs.getQName(i);
33095                         var attr = doc.createAttributeNS(namespaceURI, qName);
33096                         this.locator &&position(attrs.getLocator(i),attr);
33097                         attr.value = attr.nodeValue = value;
33098                         el.setAttributeNode(attr);
33099             }
33100         },
33101         endElement:function(namespaceURI, localName, qName) {
33102                 var current = this.currentElement;
33103                 var tagName = current.tagName;
33104                 this.currentElement = current.parentNode;
33105         },
33106         startPrefixMapping:function(prefix, uri) {
33107         },
33108         endPrefixMapping:function(prefix) {
33109         },
33110         processingInstruction:function(target, data) {
33111             var ins = this.doc.createProcessingInstruction(target, data);
33112             this.locator && position(this.locator,ins);
33113             appendElement(this, ins);
33114         },
33115         ignorableWhitespace:function(ch, start, length) {
33116         },
33117         characters:function(chars, start, length) {
33118                 chars = _toString.apply(this,arguments);
33119                 //console.log(chars)
33120                 if(chars){
33121                         if (this.cdata) {
33122                                 var charNode = this.doc.createCDATASection(chars);
33123                         } else {
33124                                 var charNode = this.doc.createTextNode(chars);
33125                         }
33126                         if(this.currentElement){
33127                                 this.currentElement.appendChild(charNode);
33128                         }else if(/^\s*$/.test(chars)){
33129                                 this.doc.appendChild(charNode);
33130                                 //process xml
33131                         }
33132                         this.locator && position(this.locator,charNode);
33133                 }
33134         },
33135         skippedEntity:function(name) {
33136         },
33137         endDocument:function() {
33138                 this.doc.normalize();
33139         },
33140         setDocumentLocator:function (locator) {
33141             if(this.locator = locator){// && !('lineNumber' in locator)){
33142                 locator.lineNumber = 0;
33143             }
33144         },
33145         //LexicalHandler
33146         comment:function(chars, start, length) {
33147                 chars = _toString.apply(this,arguments);
33148             var comm = this.doc.createComment(chars);
33149             this.locator && position(this.locator,comm);
33150             appendElement(this, comm);
33151         },
33152         
33153         startCDATA:function() {
33154             //used in characters() methods
33155             this.cdata = true;
33156         },
33157         endCDATA:function() {
33158             this.cdata = false;
33159         },
33160         
33161         startDTD:function(name, publicId, systemId) {
33162                 var impl = this.doc.implementation;
33163             if (impl && impl.createDocumentType) {
33164                 var dt = impl.createDocumentType(name, publicId, systemId);
33165                 this.locator && position(this.locator,dt);
33166                 appendElement(this, dt);
33167             }
33168         },
33169         /**
33170          * @see org.xml.sax.ErrorHandler
33171          * @link http://www.saxproject.org/apidoc/org/xml/sax/ErrorHandler.html
33172          */
33173         warning:function(error) {
33174                 console.warn('[xmldom warning]\t'+error,_locator(this.locator));
33175         },
33176         error:function(error) {
33177                 console.error('[xmldom error]\t'+error,_locator(this.locator));
33178         },
33179         fatalError:function(error) {
33180                 console.error('[xmldom fatalError]\t'+error,_locator(this.locator));
33181             throw error;
33182         }
33183   };
33184   function _locator(l){
33185         if(l){
33186                 return '\n@'+(l.systemId ||'')+'#[line:'+l.lineNumber+',col:'+l.columnNumber+']'
33187         }
33188   }
33189   function _toString(chars,start,length){
33190         if(typeof chars == 'string'){
33191                 return chars.substr(start,length)
33192         }else{//java sax connect width xmldom on rhino(what about: "? && !(chars instanceof String)")
33193                 if(chars.length >= start+length || start){
33194                         return new java.lang.String(chars,start,length)+'';
33195                 }
33196                 return chars;
33197         }
33198   }
33199
33200   /*
33201    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/LexicalHandler.html
33202    * used method of org.xml.sax.ext.LexicalHandler:
33203    *  #comment(chars, start, length)
33204    *  #startCDATA()
33205    *  #endCDATA()
33206    *  #startDTD(name, publicId, systemId)
33207    *
33208    *
33209    * IGNORED method of org.xml.sax.ext.LexicalHandler:
33210    *  #endDTD()
33211    *  #startEntity(name)
33212    *  #endEntity(name)
33213    *
33214    *
33215    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/DeclHandler.html
33216    * IGNORED method of org.xml.sax.ext.DeclHandler
33217    *    #attributeDecl(eName, aName, type, mode, value)
33218    *  #elementDecl(name, model)
33219    *  #externalEntityDecl(name, publicId, systemId)
33220    *  #internalEntityDecl(name, value)
33221    * @link http://www.saxproject.org/apidoc/org/xml/sax/ext/EntityResolver2.html
33222    * IGNORED method of org.xml.sax.EntityResolver2
33223    *  #resolveEntity(String name,String publicId,String baseURI,String systemId)
33224    *  #resolveEntity(publicId, systemId)
33225    *  #getExternalSubset(name, baseURI)
33226    * @link http://www.saxproject.org/apidoc/org/xml/sax/DTDHandler.html
33227    * IGNORED method of org.xml.sax.DTDHandler
33228    *  #notationDecl(name, publicId, systemId) {};
33229    *  #unparsedEntityDecl(name, publicId, systemId, notationName) {};
33230    */
33231   "endDTD,startEntity,endEntity,attributeDecl,elementDecl,externalEntityDecl,internalEntityDecl,resolveEntity,getExternalSubset,notationDecl,unparsedEntityDecl".replace(/\w+/g,function(key){
33232         DOMHandler.prototype[key] = function(){return null};
33233   });
33234
33235   /* 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 */
33236   function appendElement (hander,node) {
33237       if (!hander.currentElement) {
33238           hander.doc.appendChild(node);
33239       } else {
33240           hander.currentElement.appendChild(node);
33241       }
33242   }//appendChild and setAttributeNS are preformance key
33243
33244   //if(typeof require == 'function'){
33245         var XMLReader = sax.XMLReader;
33246         var DOMImplementation = exports.DOMImplementation = dom.DOMImplementation;
33247         exports.XMLSerializer = dom.XMLSerializer ;
33248         exports.DOMParser = DOMParser;
33249   //}
33250   });
33251   var domParser_1 = domParser.DOMImplementation;
33252   var domParser_2 = domParser.XMLSerializer;
33253   var domParser_3 = domParser.DOMParser;
33254
33255   var togeojson = createCommonjsModule(function (module, exports) {
33256   var toGeoJSON = (function() {
33257
33258       var removeSpace = /\s*/g,
33259           trimSpace = /^\s*|\s*$/g,
33260           splitSpace = /\s+/;
33261       // generate a short, numeric hash of a string
33262       function okhash(x) {
33263           if (!x || !x.length) return 0;
33264           for (var i = 0, h = 0; i < x.length; i++) {
33265               h = ((h << 5) - h) + x.charCodeAt(i) | 0;
33266           } return h;
33267       }
33268       // all Y children of X
33269       function get(x, y) { return x.getElementsByTagName(y); }
33270       function attr(x, y) { return x.getAttribute(y); }
33271       function attrf(x, y) { return parseFloat(attr(x, y)); }
33272       // one Y child of X, if any, otherwise null
33273       function get1(x, y) { var n = get(x, y); return n.length ? n[0] : null; }
33274       // https://developer.mozilla.org/en-US/docs/Web/API/Node.normalize
33275       function norm(el) { if (el.normalize) { el.normalize(); } return el; }
33276       // cast array x into numbers
33277       function numarray(x) {
33278           for (var j = 0, o = []; j < x.length; j++) { o[j] = parseFloat(x[j]); }
33279           return o;
33280       }
33281       // get the content of a text node, if any
33282       function nodeVal(x) {
33283           if (x) { norm(x); }
33284           return (x && x.textContent) || '';
33285       }
33286       // get the contents of multiple text nodes, if present
33287       function getMulti(x, ys) {
33288           var o = {}, n, k;
33289           for (k = 0; k < ys.length; k++) {
33290               n = get1(x, ys[k]);
33291               if (n) o[ys[k]] = nodeVal(n);
33292           }
33293           return o;
33294       }
33295       // add properties of Y to X, overwriting if present in both
33296       function extend(x, y) { for (var k in y) x[k] = y[k]; }
33297       // get one coordinate from a coordinate array, if any
33298       function coord1(v) { return numarray(v.replace(removeSpace, '').split(',')); }
33299       // get all coordinates from a coordinate array as [[],[]]
33300       function coord(v) {
33301           var coords = v.replace(trimSpace, '').split(splitSpace),
33302               o = [];
33303           for (var i = 0; i < coords.length; i++) {
33304               o.push(coord1(coords[i]));
33305           }
33306           return o;
33307       }
33308       function coordPair(x) {
33309           var ll = [attrf(x, 'lon'), attrf(x, 'lat')],
33310               ele = get1(x, 'ele'),
33311               // handle namespaced attribute in browser
33312               heartRate = get1(x, 'gpxtpx:hr') || get1(x, 'hr'),
33313               time = get1(x, 'time'),
33314               e;
33315           if (ele) {
33316               e = parseFloat(nodeVal(ele));
33317               if (!isNaN(e)) {
33318                   ll.push(e);
33319               }
33320           }
33321           return {
33322               coordinates: ll,
33323               time: time ? nodeVal(time) : null,
33324               heartRate: heartRate ? parseFloat(nodeVal(heartRate)) : null
33325           };
33326       }
33327
33328       // create a new feature collection parent object
33329       function fc() {
33330           return {
33331               type: 'FeatureCollection',
33332               features: []
33333           };
33334       }
33335
33336       var serializer;
33337       if (typeof XMLSerializer !== 'undefined') {
33338           /* istanbul ignore next */
33339           serializer = new XMLSerializer();
33340       // only require xmldom in a node environment
33341       } else if (typeof process === 'object' && !process.browser) {
33342           serializer = new (domParser.XMLSerializer)();
33343       }
33344       function xml2str(str) {
33345           // IE9 will create a new XMLSerializer but it'll crash immediately.
33346           // This line is ignored because we don't run coverage tests in IE9
33347           /* istanbul ignore next */
33348           if (str.xml !== undefined) return str.xml;
33349           return serializer.serializeToString(str);
33350       }
33351
33352       var t = {
33353           kml: function(doc) {
33354
33355               var gj = fc(),
33356                   // styleindex keeps track of hashed styles in order to match features
33357                   styleIndex = {}, styleByHash = {},
33358                   // stylemapindex keeps track of style maps to expose in properties
33359                   styleMapIndex = {},
33360                   // atomic geospatial types supported by KML - MultiGeometry is
33361                   // handled separately
33362                   geotypes = ['Polygon', 'LineString', 'Point', 'Track', 'gx:Track'],
33363                   // all root placemarks in the file
33364                   placemarks = get(doc, 'Placemark'),
33365                   styles = get(doc, 'Style'),
33366                   styleMaps = get(doc, 'StyleMap');
33367
33368               for (var k = 0; k < styles.length; k++) {
33369                   var hash = okhash(xml2str(styles[k])).toString(16);
33370                   styleIndex['#' + attr(styles[k], 'id')] = hash;
33371                   styleByHash[hash] = styles[k];
33372               }
33373               for (var l = 0; l < styleMaps.length; l++) {
33374                   styleIndex['#' + attr(styleMaps[l], 'id')] = okhash(xml2str(styleMaps[l])).toString(16);
33375                   var pairs = get(styleMaps[l], 'Pair');
33376                   var pairsMap = {};
33377                   for (var m = 0; m < pairs.length; m++) {
33378                       pairsMap[nodeVal(get1(pairs[m], 'key'))] = nodeVal(get1(pairs[m], 'styleUrl'));
33379                   }
33380                   styleMapIndex['#' + attr(styleMaps[l], 'id')] = pairsMap;
33381
33382               }
33383               for (var j = 0; j < placemarks.length; j++) {
33384                   gj.features = gj.features.concat(getPlacemark(placemarks[j]));
33385               }
33386               function kmlColor(v) {
33387                   var color, opacity;
33388                   v = v || '';
33389                   if (v.substr(0, 1) === '#') { v = v.substr(1); }
33390                   if (v.length === 6 || v.length === 3) { color = v; }
33391                   if (v.length === 8) {
33392                       opacity = parseInt(v.substr(0, 2), 16) / 255;
33393                       color = '#' + v.substr(6, 2) +
33394                           v.substr(4, 2) +
33395                           v.substr(2, 2);
33396                   }
33397                   return [color, isNaN(opacity) ? undefined : opacity];
33398               }
33399               function gxCoord(v) { return numarray(v.split(' ')); }
33400               function gxCoords(root) {
33401                   var elems = get(root, 'coord', 'gx'), coords = [], times = [];
33402                   if (elems.length === 0) elems = get(root, 'gx:coord');
33403                   for (var i = 0; i < elems.length; i++) coords.push(gxCoord(nodeVal(elems[i])));
33404                   var timeElems = get(root, 'when');
33405                   for (var j = 0; j < timeElems.length; j++) times.push(nodeVal(timeElems[j]));
33406                   return {
33407                       coords: coords,
33408                       times: times
33409                   };
33410               }
33411               function getGeometry(root) {
33412                   var geomNode, geomNodes, i, j, k, geoms = [], coordTimes = [];
33413                   if (get1(root, 'MultiGeometry')) { return getGeometry(get1(root, 'MultiGeometry')); }
33414                   if (get1(root, 'MultiTrack')) { return getGeometry(get1(root, 'MultiTrack')); }
33415                   if (get1(root, 'gx:MultiTrack')) { return getGeometry(get1(root, 'gx:MultiTrack')); }
33416                   for (i = 0; i < geotypes.length; i++) {
33417                       geomNodes = get(root, geotypes[i]);
33418                       if (geomNodes) {
33419                           for (j = 0; j < geomNodes.length; j++) {
33420                               geomNode = geomNodes[j];
33421                               if (geotypes[i] === 'Point') {
33422                                   geoms.push({
33423                                       type: 'Point',
33424                                       coordinates: coord1(nodeVal(get1(geomNode, 'coordinates')))
33425                                   });
33426                               } else if (geotypes[i] === 'LineString') {
33427                                   geoms.push({
33428                                       type: 'LineString',
33429                                       coordinates: coord(nodeVal(get1(geomNode, 'coordinates')))
33430                                   });
33431                               } else if (geotypes[i] === 'Polygon') {
33432                                   var rings = get(geomNode, 'LinearRing'),
33433                                       coords = [];
33434                                   for (k = 0; k < rings.length; k++) {
33435                                       coords.push(coord(nodeVal(get1(rings[k], 'coordinates'))));
33436                                   }
33437                                   geoms.push({
33438                                       type: 'Polygon',
33439                                       coordinates: coords
33440                                   });
33441                               } else if (geotypes[i] === 'Track' ||
33442                                   geotypes[i] === 'gx:Track') {
33443                                   var track = gxCoords(geomNode);
33444                                   geoms.push({
33445                                       type: 'LineString',
33446                                       coordinates: track.coords
33447                                   });
33448                                   if (track.times.length) coordTimes.push(track.times);
33449                               }
33450                           }
33451                       }
33452                   }
33453                   return {
33454                       geoms: geoms,
33455                       coordTimes: coordTimes
33456                   };
33457               }
33458               function getPlacemark(root) {
33459                   var geomsAndTimes = getGeometry(root), i, properties = {},
33460                       name = nodeVal(get1(root, 'name')),
33461                       address = nodeVal(get1(root, 'address')),
33462                       styleUrl = nodeVal(get1(root, 'styleUrl')),
33463                       description = nodeVal(get1(root, 'description')),
33464                       timeSpan = get1(root, 'TimeSpan'),
33465                       timeStamp = get1(root, 'TimeStamp'),
33466                       extendedData = get1(root, 'ExtendedData'),
33467                       lineStyle = get1(root, 'LineStyle'),
33468                       polyStyle = get1(root, 'PolyStyle'),
33469                       visibility = get1(root, 'visibility');
33470
33471                   if (!geomsAndTimes.geoms.length) return [];
33472                   if (name) properties.name = name;
33473                   if (address) properties.address = address;
33474                   if (styleUrl) {
33475                       if (styleUrl[0] !== '#') {
33476                           styleUrl = '#' + styleUrl;
33477                       }
33478
33479                       properties.styleUrl = styleUrl;
33480                       if (styleIndex[styleUrl]) {
33481                           properties.styleHash = styleIndex[styleUrl];
33482                       }
33483                       if (styleMapIndex[styleUrl]) {
33484                           properties.styleMapHash = styleMapIndex[styleUrl];
33485                           properties.styleHash = styleIndex[styleMapIndex[styleUrl].normal];
33486                       }
33487                       // Try to populate the lineStyle or polyStyle since we got the style hash
33488                       var style = styleByHash[properties.styleHash];
33489                       if (style) {
33490                           if (!lineStyle) lineStyle = get1(style, 'LineStyle');
33491                           if (!polyStyle) polyStyle = get1(style, 'PolyStyle');
33492                       }
33493                   }
33494                   if (description) properties.description = description;
33495                   if (timeSpan) {
33496                       var begin = nodeVal(get1(timeSpan, 'begin'));
33497                       var end = nodeVal(get1(timeSpan, 'end'));
33498                       properties.timespan = { begin: begin, end: end };
33499                   }
33500                   if (timeStamp) {
33501                       properties.timestamp = nodeVal(get1(timeStamp, 'when'));
33502                   }
33503                   if (lineStyle) {
33504                       var linestyles = kmlColor(nodeVal(get1(lineStyle, 'color'))),
33505                           color = linestyles[0],
33506                           opacity = linestyles[1],
33507                           width = parseFloat(nodeVal(get1(lineStyle, 'width')));
33508                       if (color) properties.stroke = color;
33509                       if (!isNaN(opacity)) properties['stroke-opacity'] = opacity;
33510                       if (!isNaN(width)) properties['stroke-width'] = width;
33511                   }
33512                   if (polyStyle) {
33513                       var polystyles = kmlColor(nodeVal(get1(polyStyle, 'color'))),
33514                           pcolor = polystyles[0],
33515                           popacity = polystyles[1],
33516                           fill = nodeVal(get1(polyStyle, 'fill')),
33517                           outline = nodeVal(get1(polyStyle, 'outline'));
33518                       if (pcolor) properties.fill = pcolor;
33519                       if (!isNaN(popacity)) properties['fill-opacity'] = popacity;
33520                       if (fill) properties['fill-opacity'] = fill === '1' ? properties['fill-opacity'] || 1 : 0;
33521                       if (outline) properties['stroke-opacity'] = outline === '1' ? properties['stroke-opacity'] || 1 : 0;
33522                   }
33523                   if (extendedData) {
33524                       var datas = get(extendedData, 'Data'),
33525                           simpleDatas = get(extendedData, 'SimpleData');
33526
33527                       for (i = 0; i < datas.length; i++) {
33528                           properties[datas[i].getAttribute('name')] = nodeVal(get1(datas[i], 'value'));
33529                       }
33530                       for (i = 0; i < simpleDatas.length; i++) {
33531                           properties[simpleDatas[i].getAttribute('name')] = nodeVal(simpleDatas[i]);
33532                       }
33533                   }
33534                   if (visibility) {
33535                       properties.visibility = nodeVal(visibility);
33536                   }
33537                   if (geomsAndTimes.coordTimes.length) {
33538                       properties.coordTimes = (geomsAndTimes.coordTimes.length === 1) ?
33539                           geomsAndTimes.coordTimes[0] : geomsAndTimes.coordTimes;
33540                   }
33541                   var feature = {
33542                       type: 'Feature',
33543                       geometry: (geomsAndTimes.geoms.length === 1) ? geomsAndTimes.geoms[0] : {
33544                           type: 'GeometryCollection',
33545                           geometries: geomsAndTimes.geoms
33546                       },
33547                       properties: properties
33548                   };
33549                   if (attr(root, 'id')) feature.id = attr(root, 'id');
33550                   return [feature];
33551               }
33552               return gj;
33553           },
33554           gpx: function(doc) {
33555               var i,
33556                   tracks = get(doc, 'trk'),
33557                   routes = get(doc, 'rte'),
33558                   waypoints = get(doc, 'wpt'),
33559                   // a feature collection
33560                   gj = fc(),
33561                   feature;
33562               for (i = 0; i < tracks.length; i++) {
33563                   feature = getTrack(tracks[i]);
33564                   if (feature) gj.features.push(feature);
33565               }
33566               for (i = 0; i < routes.length; i++) {
33567                   feature = getRoute(routes[i]);
33568                   if (feature) gj.features.push(feature);
33569               }
33570               for (i = 0; i < waypoints.length; i++) {
33571                   gj.features.push(getPoint(waypoints[i]));
33572               }
33573               function getPoints(node, pointname) {
33574                   var pts = get(node, pointname),
33575                       line = [],
33576                       times = [],
33577                       heartRates = [],
33578                       l = pts.length;
33579                   if (l < 2) return {};  // Invalid line in GeoJSON
33580                   for (var i = 0; i < l; i++) {
33581                       var c = coordPair(pts[i]);
33582                       line.push(c.coordinates);
33583                       if (c.time) times.push(c.time);
33584                       if (c.heartRate) heartRates.push(c.heartRate);
33585                   }
33586                   return {
33587                       line: line,
33588                       times: times,
33589                       heartRates: heartRates
33590                   };
33591               }
33592               function getTrack(node) {
33593                   var segments = get(node, 'trkseg'),
33594                       track = [],
33595                       times = [],
33596                       heartRates = [],
33597                       line;
33598                   for (var i = 0; i < segments.length; i++) {
33599                       line = getPoints(segments[i], 'trkpt');
33600                       if (line) {
33601                           if (line.line) track.push(line.line);
33602                           if (line.times && line.times.length) times.push(line.times);
33603                           if (line.heartRates && line.heartRates.length) heartRates.push(line.heartRates);
33604                       }
33605                   }
33606                   if (track.length === 0) return;
33607                   var properties = getProperties(node);
33608                   extend(properties, getLineStyle(get1(node, 'extensions')));
33609                   if (times.length) properties.coordTimes = track.length === 1 ? times[0] : times;
33610                   if (heartRates.length) properties.heartRates = track.length === 1 ? heartRates[0] : heartRates;
33611                   return {
33612                       type: 'Feature',
33613                       properties: properties,
33614                       geometry: {
33615                           type: track.length === 1 ? 'LineString' : 'MultiLineString',
33616                           coordinates: track.length === 1 ? track[0] : track
33617                       }
33618                   };
33619               }
33620               function getRoute(node) {
33621                   var line = getPoints(node, 'rtept');
33622                   if (!line.line) return;
33623                   var prop = getProperties(node);
33624                   extend(prop, getLineStyle(get1(node, 'extensions')));
33625                   var routeObj = {
33626                       type: 'Feature',
33627                       properties: prop,
33628                       geometry: {
33629                           type: 'LineString',
33630                           coordinates: line.line
33631                       }
33632                   };
33633                   return routeObj;
33634               }
33635               function getPoint(node) {
33636                   var prop = getProperties(node);
33637                   extend(prop, getMulti(node, ['sym']));
33638                   return {
33639                       type: 'Feature',
33640                       properties: prop,
33641                       geometry: {
33642                           type: 'Point',
33643                           coordinates: coordPair(node).coordinates
33644                       }
33645                   };
33646               }
33647               function getLineStyle(extensions) {
33648                   var style = {};
33649                   if (extensions) {
33650                       var lineStyle = get1(extensions, 'line');
33651                       if (lineStyle) {
33652                           var color = nodeVal(get1(lineStyle, 'color')),
33653                               opacity = parseFloat(nodeVal(get1(lineStyle, 'opacity'))),
33654                               width = parseFloat(nodeVal(get1(lineStyle, 'width')));
33655                           if (color) style.stroke = color;
33656                           if (!isNaN(opacity)) style['stroke-opacity'] = opacity;
33657                           // GPX width is in mm, convert to px with 96 px per inch
33658                           if (!isNaN(width)) style['stroke-width'] = width * 96 / 25.4;
33659                       }
33660                   }
33661                   return style;
33662               }
33663               function getProperties(node) {
33664                   var prop = getMulti(node, ['name', 'cmt', 'desc', 'type', 'time', 'keywords']),
33665                       links = get(node, 'link');
33666                   if (links.length) prop.links = [];
33667                   for (var i = 0, link; i < links.length; i++) {
33668                       link = { href: attr(links[i], 'href') };
33669                       extend(link, getMulti(links[i], ['text', 'type']));
33670                       prop.links.push(link);
33671                   }
33672                   return prop;
33673               }
33674               return gj;
33675           }
33676       };
33677       return t;
33678   })();
33679
33680   module.exports = toGeoJSON;
33681   });
33682
33683   var _initialized = false;
33684   var _enabled = false;
33685   var _geojson;
33686
33687
33688   function svgData$$1(projection$$1, context, dispatch) {
33689       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
33690       var _showLabels = true;
33691       var detected = utilDetect();
33692       var layer = select(null);
33693       var _vtService;
33694       var _fileList;
33695       var _template;
33696       var _src;
33697
33698
33699       function init() {
33700           if (_initialized) return;  // run once
33701
33702           _geojson = {};
33703           _enabled = true;
33704
33705           function over() {
33706               event.stopPropagation();
33707               event.preventDefault();
33708               event.dataTransfer.dropEffect = 'copy';
33709           }
33710
33711           select('body')
33712               .attr('dropzone', 'copy')
33713               .on('drop.svgData', function() {
33714                   event.stopPropagation();
33715                   event.preventDefault();
33716                   if (!detected.filedrop) return;
33717                   drawData.fileList(event.dataTransfer.files);
33718               })
33719               .on('dragenter.svgData', over)
33720               .on('dragexit.svgData', over)
33721               .on('dragover.svgData', over);
33722
33723           _initialized = true;
33724       }
33725
33726
33727       function getService() {
33728           if (services.vectorTile && !_vtService) {
33729               _vtService = services.vectorTile;
33730               _vtService.event.on('loadedData', throttledRedraw);
33731           } else if (!services.vectorTile && _vtService) {
33732               _vtService = null;
33733           }
33734
33735           return _vtService;
33736       }
33737
33738
33739       function showLayer() {
33740           layerOn();
33741
33742           layer
33743               .style('opacity', 0)
33744               .transition()
33745               .duration(250)
33746               .style('opacity', 1)
33747               .on('end', function () { dispatch.call('change'); });
33748       }
33749
33750
33751       function hideLayer() {
33752           throttledRedraw.cancel();
33753
33754           layer
33755               .transition()
33756               .duration(250)
33757               .style('opacity', 0)
33758               .on('end', layerOff);
33759       }
33760
33761
33762       function layerOn() {
33763           layer.style('display', 'block');
33764       }
33765
33766
33767       function layerOff() {
33768           layer.selectAll('.viewfield-group').remove();
33769           layer.style('display', 'none');
33770       }
33771
33772
33773       // ensure that all geojson features in a collection have IDs
33774       function ensureIDs(gj) {
33775           if (!gj) return null;
33776
33777           if (gj.type === 'FeatureCollection') {
33778               for (var i = 0; i < gj.features.length; i++) {
33779                   ensureFeatureID(gj.features[i]);
33780               }
33781           } else {
33782               ensureFeatureID(gj);
33783           }
33784           return gj;
33785       }
33786
33787
33788       // ensure that each single Feature object has a unique ID
33789       function ensureFeatureID(feature) {
33790           if (!feature) return;
33791           feature.__featurehash__ = utilHashcode(fastJsonStableStringify(feature));
33792           return feature;
33793       }
33794
33795
33796       // Prefer an array of Features instead of a FeatureCollection
33797       function getFeatures(gj) {
33798           if (!gj) return [];
33799
33800           if (gj.type === 'FeatureCollection') {
33801               return gj.features;
33802           } else {
33803               return [gj];
33804           }
33805       }
33806
33807
33808       function featureKey(d) {
33809           return d.__featurehash__;
33810       }
33811
33812
33813       function isPolygon(d) {
33814           return d.geometry.type === 'Polygon' || d.geometry.type === 'MultiPolygon';
33815       }
33816
33817
33818       function clipPathID(d) {
33819           return 'data-' + d.__featurehash__ + '-clippath';
33820       }
33821
33822
33823       function featureClasses(d) {
33824           return [
33825               'data' + d.__featurehash__,
33826               d.geometry.type,
33827               isPolygon(d) ? 'area' : '',
33828               d.__layerID__ || ''
33829           ].filter(Boolean).join(' ');
33830       }
33831
33832
33833       function drawData(selection$$1) {
33834           var vtService = getService();
33835           var getPath = svgPath(projection$$1).geojson;
33836           var getAreaPath = svgPath(projection$$1, null, true).geojson;
33837           var hasData = drawData.hasData();
33838
33839           layer = selection$$1.selectAll('.layer-mapdata')
33840               .data(_enabled && hasData ? [0] : []);
33841
33842           layer.exit()
33843               .remove();
33844
33845           layer = layer.enter()
33846               .append('g')
33847               .attr('class', 'layer-mapdata')
33848               .merge(layer);
33849
33850           var surface = context.surface();
33851           if (!surface || surface.empty()) return;  // not ready to draw yet, starting up
33852
33853
33854           // Gather data
33855           var geoData, polygonData;
33856           if (_template && vtService) {   // fetch data from vector tile service
33857               var sourceID = _template;
33858               vtService.loadTiles(sourceID, _template, projection$$1);
33859               geoData = vtService.data(sourceID, projection$$1);
33860           } else {
33861               geoData = getFeatures(_geojson);
33862           }
33863           geoData = geoData.filter(getPath);
33864           polygonData = geoData.filter(isPolygon);
33865
33866
33867           // Draw clip paths for polygons
33868           var clipPaths = surface.selectAll('defs').selectAll('.clipPath-data')
33869              .data(polygonData, featureKey);
33870
33871           clipPaths.exit()
33872              .remove();
33873
33874           var clipPathsEnter = clipPaths.enter()
33875              .append('clipPath')
33876              .attr('class', 'clipPath-data')
33877              .attr('id', clipPathID);
33878
33879           clipPathsEnter
33880              .append('path');
33881
33882           clipPaths.merge(clipPathsEnter)
33883              .selectAll('path')
33884              .attr('d', getAreaPath);
33885
33886
33887           // Draw fill, shadow, stroke layers
33888           var datagroups = layer
33889               .selectAll('g.datagroup')
33890               .data(['fill', 'shadow', 'stroke']);
33891
33892           datagroups = datagroups.enter()
33893               .append('g')
33894               .attr('class', function(d) { return 'datagroup datagroup-' + d; })
33895               .merge(datagroups);
33896
33897
33898           // Draw paths
33899           var pathData = {
33900               fill: polygonData,
33901               shadow: geoData,
33902               stroke: geoData
33903           };
33904
33905           var paths = datagroups
33906               .selectAll('path')
33907               .data(function(layer) { return pathData[layer]; }, featureKey);
33908
33909           // exit
33910           paths.exit()
33911               .remove();
33912
33913           // enter/update
33914           paths = paths.enter()
33915               .append('path')
33916               .attr('class', function(d) {
33917                   var datagroup = this.parentNode.__data__;
33918                   return 'pathdata ' + datagroup + ' ' + featureClasses(d);
33919               })
33920               .attr('clip-path', function(d) {
33921                   var datagroup = this.parentNode.__data__;
33922                   return datagroup === 'fill' ? ('url(#' + clipPathID(d) + ')') : null;
33923               })
33924               .merge(paths)
33925               .attr('d', function(d) {
33926                   var datagroup = this.parentNode.__data__;
33927                   return datagroup === 'fill' ? getAreaPath(d) : getPath(d);
33928               });
33929
33930
33931           // Draw labels
33932           layer
33933               .call(drawLabels, 'label-halo', geoData)
33934               .call(drawLabels, 'label', geoData);
33935
33936
33937           function drawLabels(selection$$1, textClass, data) {
33938               var labelPath = d3_geoPath(projection$$1);
33939               var labelData = data.filter(function(d) {
33940                   return _showLabels && d.properties && (d.properties.desc || d.properties.name);
33941               });
33942
33943               var labels = selection$$1.selectAll('text.' + textClass)
33944                   .data(labelData, featureKey);
33945
33946               // exit
33947               labels.exit()
33948                   .remove();
33949
33950               // enter/update
33951               labels = labels.enter()
33952                   .append('text')
33953                   .attr('class', function(d) { return textClass + ' ' + featureClasses(d); })
33954                   .merge(labels)
33955                   .text(function(d) {
33956                       return d.properties.desc || d.properties.name;
33957                   })
33958                   .attr('x', function(d) {
33959                       var centroid = labelPath.centroid(d);
33960                       return centroid[0] + 11;
33961                   })
33962                   .attr('y', function(d) {
33963                       var centroid = labelPath.centroid(d);
33964                       return centroid[1];
33965                   });
33966           }
33967       }
33968
33969
33970       function getExtension(fileName) {
33971           if (!fileName) return;
33972
33973           var re = /\.(gpx|kml|(geo)?json)$/i;
33974           var match = fileName.toLowerCase().match(re);
33975           return match && match.length && match[0];
33976       }
33977
33978
33979       function xmlToDom(textdata) {
33980           return (new DOMParser()).parseFromString(textdata, 'text/xml');
33981       }
33982
33983
33984       drawData.setFile = function(extension, data) {
33985           _template = null;
33986           _fileList = null;
33987           _geojson = null;
33988           _src = null;
33989
33990           var gj;
33991           switch (extension) {
33992               case '.gpx':
33993                   gj = togeojson.gpx(xmlToDom(data));
33994                   break;
33995               case '.kml':
33996                   gj = togeojson.kml(xmlToDom(data));
33997                   break;
33998               case '.geojson':
33999               case '.json':
34000                   gj = JSON.parse(data);
34001                   break;
34002           }
34003
34004           if (!isEmpty(gj)) {
34005               _geojson = ensureIDs(gj);
34006               _src = extension + ' data file';
34007               this.fitZoom();
34008           }
34009
34010           dispatch.call('change');
34011           return this;
34012       };
34013
34014
34015       drawData.showLabels = function(val) {
34016           if (!arguments.length) return _showLabels;
34017
34018           _showLabels = val;
34019           return this;
34020       };
34021
34022
34023       drawData.enabled = function(val) {
34024           if (!arguments.length) return _enabled;
34025
34026           _enabled = val;
34027           if (_enabled) {
34028               showLayer();
34029           } else {
34030               hideLayer();
34031           }
34032
34033           dispatch.call('change');
34034           return this;
34035       };
34036
34037
34038       drawData.hasData = function() {
34039           return !!(_template || !isEmpty(_geojson));
34040       };
34041
34042
34043       drawData.template = function(val, src) {
34044           if (!arguments.length) return _template;
34045
34046           // test source against OSM imagery blacklists..
34047           var osm = context.connection();
34048           if (osm) {
34049               var blacklists = osm.imageryBlacklists();
34050               var fail = false;
34051               var tested = 0;
34052               var regex;
34053
34054               for (var i = 0; i < blacklists.length; i++) {
34055                   try {
34056                       regex = new RegExp(blacklists[i]);
34057                       fail = regex.test(val);
34058                       tested++;
34059                       if (fail) break;
34060                   } catch (e) {
34061                       /* noop */
34062                   }
34063               }
34064
34065               // ensure at least one test was run.
34066               if (!tested) {
34067                   regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
34068                   fail = regex.test(val);
34069               }
34070           }
34071
34072           _template = val;
34073           _fileList = null;
34074           _geojson = null;
34075
34076           // strip off the querystring/hash from the template,
34077           // it often includes the access token
34078           _src = src || ('vectortile:' + val.split(/[?#]/)[0]);
34079
34080           dispatch.call('change');
34081           return this;
34082       };
34083
34084
34085       drawData.geojson = function(gj, src) {
34086           if (!arguments.length) return _geojson;
34087
34088           _template = null;
34089           _fileList = null;
34090           _geojson = null;
34091           _src = null;
34092
34093           if (!isEmpty(gj)) {
34094               _geojson = ensureIDs(gj);
34095               _src = src || 'unknown.geojson';
34096           }
34097
34098           dispatch.call('change');
34099           return this;
34100       };
34101
34102
34103       drawData.fileList = function(fileList) {
34104           if (!arguments.length) return _fileList;
34105
34106           _template = null;
34107           _fileList = fileList;
34108           _geojson = null;
34109           _src = null;
34110
34111           if (!fileList || !fileList.length) return this;
34112           var f = fileList[0];
34113           var extension = getExtension(f.name);
34114           var reader = new FileReader();
34115           reader.onload = (function() {
34116               return function(e) {
34117                   drawData.setFile(extension, e.target.result);
34118               };
34119           })(f);
34120
34121           reader.readAsText(f);
34122
34123           return this;
34124       };
34125
34126
34127       drawData.url = function(url, defaultExtension) {
34128           _template = null;
34129           _fileList = null;
34130           _geojson = null;
34131           _src = null;
34132
34133           // strip off any querystring/hash from the url before checking extension
34134           var testUrl = url.split(/[?#]/)[0];
34135           var extension = getExtension(testUrl) || defaultExtension;
34136           if (extension) {
34137               _template = null;
34138               d3_text(url, function(err, data) {
34139                   if (err) return;
34140                   drawData.setFile(extension, data);
34141               });
34142           } else {
34143               drawData.template(url);
34144           }
34145
34146           return this;
34147       };
34148
34149
34150       drawData.getSrc = function() {
34151           return _src || '';
34152       };
34153
34154
34155       drawData.fitZoom = function() {
34156           var features = getFeatures(_geojson);
34157           if (!features.length) return;
34158
34159           var map = context.map();
34160           var viewport = map.trimmedExtent().polygon();
34161           var coords = reduce(features, function(coords, feature) {
34162               var c = feature.geometry.coordinates;
34163
34164               /* eslint-disable no-fallthrough */
34165               switch (feature.geometry.type) {
34166                   case 'Point':
34167                       c = [c];
34168                   case 'MultiPoint':
34169                   case 'LineString':
34170                       break;
34171
34172                   case 'MultiPolygon':
34173                       c = flatten(c);
34174                   case 'Polygon':
34175                   case 'MultiLineString':
34176                       c = flatten(c);
34177                       break;
34178               }
34179               /* eslint-enable no-fallthrough */
34180
34181               return union(coords, c);
34182           }, []);
34183
34184           if (!geoPolygonIntersectsPolygon(viewport, coords, true)) {
34185               var extent = geoExtent$$1(d3_geoBounds({ type: 'LineString', coordinates: coords }));
34186               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
34187           }
34188
34189           return this;
34190       };
34191
34192
34193       init();
34194       return drawData;
34195   }
34196
34197   function svgDebug$$1(projection, context) {
34198
34199       function drawDebug(selection$$1) {
34200           var showsTile = context.getDebug('tile');
34201           var showsCollision = context.getDebug('collision');
34202           var showsImagery = context.getDebug('imagery');
34203           var showsCommunity = context.getDebug('community');
34204           var showsImperial = context.getDebug('imperial');
34205           var showsDriveLeft = context.getDebug('driveLeft');
34206           var showsTouchTargets = context.getDebug('target');
34207
34208           var debugData = [];
34209           if (showsTile) {
34210               debugData.push({ class: 'red', label: 'tile' });
34211           }
34212           if (showsCollision) {
34213               debugData.push({ class: 'yellow', label: 'collision' });
34214           }
34215           if (showsImagery) {
34216               debugData.push({ class: 'orange', label: 'imagery' });
34217           }
34218           if (showsCommunity) {
34219               debugData.push({ class: 'blue', label: 'community' });
34220           }
34221           if (showsImperial) {
34222               debugData.push({ class: 'cyan', label: 'imperial' });
34223           }
34224           if (showsDriveLeft) {
34225               debugData.push({ class: 'green', label: 'driveLeft' });
34226           }
34227           if (showsTouchTargets) {
34228               debugData.push({ class: 'pink', label: 'touchTargets' });
34229           }
34230
34231
34232           var legend = select('#content')
34233               .selectAll('.debug-legend')
34234               .data(debugData.length ? [0] : []);
34235
34236           legend.exit()
34237               .remove();
34238
34239           legend = legend.enter()
34240               .append('div')
34241               .attr('class', 'fillD debug-legend')
34242               .merge(legend);
34243
34244
34245           var legendItems = legend.selectAll('.debug-legend-item')
34246               .data(debugData, function(d) { return d.label; });
34247
34248           legendItems.exit()
34249               .remove();
34250
34251           legendItems.enter()
34252               .append('span')
34253               .attr('class', function(d) { return 'debug-legend-item ' + d.class; })
34254               .text(function(d) { return d.label; });
34255
34256
34257           var layer = selection$$1.selectAll('.layer-debug')
34258               .data(showsImagery || showsCommunity || showsImperial || showsDriveLeft ? [0] : []);
34259
34260           layer.exit()
34261               .remove();
34262
34263           layer = layer.enter()
34264               .append('g')
34265               .attr('class', 'layer-debug')
34266               .merge(layer);
34267
34268
34269           var extent = context.map().extent();
34270           var matchImagery = (showsImagery && data.imagery.query.bbox(extent.rectangle(), true)) || [];
34271           var features = matchImagery.map(function(d) { return data.imagery.features[d.id]; });
34272
34273           var imagery = layer.selectAll('path.debug-imagery')
34274               .data(features);
34275
34276           imagery.exit()
34277               .remove();
34278
34279           imagery.enter()
34280               .append('path')
34281               .attr('class', 'debug-imagery debug orange');
34282
34283
34284           var community = layer.selectAll('path.debug-community')
34285               .data(showsCommunity ? values$1(data.community.features) : []);
34286
34287           community.exit()
34288               .remove();
34289
34290           community.enter()
34291               .append('path')
34292               .attr('class', 'debug-community debug blue');
34293
34294
34295           var imperial = layer
34296               .selectAll('path.debug-imperial')
34297               .data(showsImperial ? [dataImperial] : []);
34298
34299           imperial.exit()
34300               .remove();
34301
34302           imperial.enter()
34303               .append('path')
34304               .attr('class', 'debug-imperial debug cyan');
34305
34306
34307           var driveLeft = layer
34308               .selectAll('path.debug-drive-left')
34309               .data(showsDriveLeft ? [dataDriveLeft] : []);
34310
34311           driveLeft.exit()
34312               .remove();
34313
34314           driveLeft.enter()
34315               .append('path')
34316               .attr('class', 'debug-drive-left debug green');
34317
34318
34319           // update
34320           layer.selectAll('path')
34321               .attr('d', svgPath(projection).geojson);
34322       }
34323
34324
34325       // This looks strange because `enabled` methods on other layers are
34326       // chainable getter/setters, and this one is just a getter.
34327       drawDebug.enabled = function() {
34328           if (!arguments.length) {
34329               return context.getDebug('tile') ||
34330                   context.getDebug('collision') ||
34331                   context.getDebug('imagery') ||
34332                   context.getDebug('imperial') ||
34333                   context.getDebug('driveLeft') ||
34334                   context.getDebug('target');
34335           } else {
34336               return this;
34337           }
34338       };
34339
34340
34341       return drawDebug;
34342   }
34343
34344   /*
34345       A standalone SVG element that contains only a `defs` sub-element. To be
34346       used once globally, since defs IDs must be unique within a document.
34347   */
34348   function svgDefs(context) {
34349
34350       function drawDefs(selection$$1) {
34351           var defs = selection$$1.append('defs');
34352
34353           // add markers
34354           defs
34355               .append('marker')
34356               .attr('id', 'oneway-marker')
34357               .attr('viewBox', '0 0 10 5')
34358               .attr('refX', 2.5)
34359               .attr('refY', 2.5)
34360               .attr('markerWidth', 2)
34361               .attr('markerHeight', 2)
34362               .attr('markerUnits', 'strokeWidth')
34363               .attr('orient', 'auto')
34364               .append('path')
34365               .attr('class', 'oneway-marker-path')
34366               .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')
34367               .attr('stroke', 'none')
34368               .attr('fill', '#000')
34369               .attr('opacity', '0.75');
34370
34371           // SVG markers have to be given a colour where they're defined
34372           // (they can't inherit it from the line they're attached to),
34373           // so we need to manually define markers for each color of tag
34374           // (also, it's slightly nicer if we can control the
34375           // positioning for different tags)
34376           function addSidedMarker(name, color, offset) {
34377               defs
34378                   .append('marker')
34379                   .attr('id', 'sided-marker-' + name)
34380                   .attr('viewBox', '0 0 2 2')
34381                   .attr('refX', 1)
34382                   .attr('refY', -offset)
34383                   .attr('markerWidth', 1.5)
34384                   .attr('markerHeight', 1.5)
34385                   .attr('markerUnits', 'strokeWidth')
34386                   .attr('orient', 'auto')
34387                   .append('path')
34388                   .attr('class', 'sided-marker-path sided-marker-' + name + '-path')
34389                   .attr('d', 'M 0,0 L 1,1 L 2,0 z')
34390                   .attr('stroke', 'none')
34391                   .attr('fill', color);
34392           }
34393           addSidedMarker('natural', 'rgb(140, 208, 95)', 0);
34394           // for a coastline, the arrows are (somewhat unintuitively) on
34395           // the water side, so let's color them blue (with a gap) to
34396           // give a stronger indication
34397           addSidedMarker('coastline', '#77dede', 1);
34398           // barriers have a dashed line, and separating the triangle
34399           // from the line visually suits that
34400           addSidedMarker('barrier', '#ddd', 1);
34401           addSidedMarker('man_made', '#fff', 0);
34402
34403           defs
34404               .append('marker')
34405               .attr('id', 'viewfield-marker')
34406               .attr('viewBox', '0 0 16 16')
34407               .attr('refX', 8)
34408               .attr('refY', 16)
34409               .attr('markerWidth', 4)
34410               .attr('markerHeight', 4)
34411               .attr('markerUnits', 'strokeWidth')
34412               .attr('orient', 'auto')
34413               .append('path')
34414               .attr('class', 'viewfield-marker-path')
34415               .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')
34416               .attr('fill', '#333')
34417               .attr('fill-opacity', '0.75')
34418               .attr('stroke', '#fff')
34419               .attr('stroke-width', '0.5px')
34420               .attr('stroke-opacity', '0.75');
34421
34422           defs
34423               .append('marker')
34424               .attr('id', 'viewfield-marker-wireframe')
34425               .attr('viewBox', '0 0 16 16')
34426               .attr('refX', 8)
34427               .attr('refY', 16)
34428               .attr('markerWidth', 4)
34429               .attr('markerHeight', 4)
34430               .attr('markerUnits', 'strokeWidth')
34431               .attr('orient', 'auto')
34432               .append('path')
34433               .attr('class', 'viewfield-marker-path')
34434               .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')
34435               .attr('fill', 'none')
34436               .attr('stroke', '#fff')
34437               .attr('stroke-width', '0.5px')
34438               .attr('stroke-opacity', '0.75');
34439
34440           // add patterns
34441           var patterns = defs.selectAll('pattern')
34442               .data([
34443                   // pattern name, pattern image name
34444                   ['beach', 'dots'],
34445                   ['construction', 'construction'],
34446                   ['cemetery', 'cemetery'],
34447                   ['cemetery_christian', 'cemetery_christian'],
34448                   ['cemetery_buddhist', 'cemetery_buddhist'],
34449                   ['cemetery_muslim', 'cemetery_muslim'],
34450                   ['cemetery_jewish', 'cemetery_jewish'],
34451                   ['farmland', 'farmland'],
34452                   ['farmyard', 'farmyard'],
34453                   ['forest', 'forest'],
34454                   ['forest_broadleaved', 'forest_broadleaved'],
34455                   ['forest_needleleaved', 'forest_needleleaved'],
34456                   ['forest_leafless', 'forest_leafless'],
34457                   ['grass', 'grass'],
34458                   ['landfill', 'landfill'],
34459                   ['meadow', 'grass'],
34460                   ['orchard', 'orchard'],
34461                   ['pond', 'pond'],
34462                   ['quarry', 'quarry'],
34463                   ['scrub', 'bushes'],
34464                   ['vineyard', 'vineyard'],
34465                   ['waves', 'waves'],
34466                   ['wetland', 'wetland'],
34467                   ['wetland_marsh', 'wetland_marsh'],
34468                   ['wetland_swamp', 'wetland_swamp'],
34469                   ['wetland_bog', 'wetland_bog'],
34470                   ['wetland_reedbed', 'wetland_reedbed']
34471               ])
34472               .enter()
34473               .append('pattern')
34474               .attr('id', function (d) { return 'pattern-' + d[0]; })
34475               .attr('width', 32)
34476               .attr('height', 32)
34477               .attr('patternUnits', 'userSpaceOnUse');
34478
34479           patterns
34480               .append('rect')
34481               .attr('x', 0)
34482               .attr('y', 0)
34483               .attr('width', 32)
34484               .attr('height', 32)
34485               .attr('class', function (d) { return 'pattern-color-' + d[0]; });
34486
34487           patterns
34488               .append('image')
34489               .attr('x', 0)
34490               .attr('y', 0)
34491               .attr('width', 32)
34492               .attr('height', 32)
34493               .attr('xlink:href', function (d) {
34494                   return context.imagePath('pattern/' + d[1] + '.png');
34495               });
34496
34497           // add clip paths
34498           defs.selectAll('clipPath')
34499               .data([12, 18, 20, 32, 45])
34500               .enter()
34501               .append('clipPath')
34502               .attr('id', function (d) { return 'clip-square-' + d; })
34503               .append('rect')
34504               .attr('x', 0)
34505               .attr('y', 0)
34506               .attr('width', function (d) { return d; })
34507               .attr('height', function (d) { return d; });
34508
34509           // add symbol spritesheets
34510           defs
34511               .call(drawDefs.addSprites, [
34512                   'iD-sprite', 'maki-sprite', 'temaki-sprite', 'fa-sprite', 'community-sprite'
34513               ]);
34514       }
34515
34516
34517       drawDefs.addSprites = function(selection$$1, ids) {
34518           var spritesheets = selection$$1.selectAll('.spritesheet');
34519           var currData = spritesheets.data();
34520           var data = uniq(currData.concat(ids));
34521
34522           spritesheets
34523               .data(data)
34524               .enter()
34525               .append('g')
34526               .attr('class', function(d) { return 'spritesheet spritesheet-' + d; })
34527               .each(function(d) {
34528                   var url = context.imagePath(d + '.svg');
34529                   var node = select(this).node();
34530                   request(url)
34531                       .mimeType('image/svg+xml')
34532                       .response(function(xhr) { return xhr.responseXML; })
34533                       .get(function(err, svg) {
34534                           if (err) return;
34535                           node.appendChild(
34536                               select(svg.documentElement).attr('id', d).node()
34537                           );
34538                       });
34539               });
34540       };
34541
34542
34543       return drawDefs;
34544   }
34545
34546   function svgIcon(name, svgklass, useklass) {
34547       return function drawIcon(selection) {
34548           selection.selectAll('svg')
34549               .data([0])
34550               .enter()
34551               .append('svg')
34552               .attr('class', 'icon ' + (svgklass || ''))
34553               .append('use')
34554               .attr('xlink:href', name)
34555               .attr('class', useklass);
34556       };
34557   }
34558
34559   function svgLabels(projection$$1, context) {
34560       var path = d3_geoPath(projection$$1);
34561       var detected = utilDetect();
34562       var baselineHack = (detected.ie || detected.browser.toLowerCase() === 'edge');
34563       var _rdrawn = rbush_1();
34564       var _rskipped = rbush_1();
34565       var _textWidthCache = {};
34566       var _entitybboxes = {};
34567
34568       // Listed from highest to lowest priority
34569       var labelStack = [
34570           ['line', 'aeroway', '*', 12],
34571           ['line', 'highway', 'motorway', 12],
34572           ['line', 'highway', 'trunk', 12],
34573           ['line', 'highway', 'primary', 12],
34574           ['line', 'highway', 'secondary', 12],
34575           ['line', 'highway', 'tertiary', 12],
34576           ['line', 'highway', '*', 12],
34577           ['line', 'railway', '*', 12],
34578           ['line', 'waterway', '*', 12],
34579           ['area', 'aeroway', '*', 12],
34580           ['area', 'amenity', '*', 12],
34581           ['area', 'building', '*', 12],
34582           ['area', 'historic', '*', 12],
34583           ['area', 'leisure', '*', 12],
34584           ['area', 'man_made', '*', 12],
34585           ['area', 'natural', '*', 12],
34586           ['area', 'shop', '*', 12],
34587           ['area', 'tourism', '*', 12],
34588           ['area', 'camp_site', '*', 12],
34589           ['point', 'aeroway', '*', 10],
34590           ['point', 'amenity', '*', 10],
34591           ['point', 'building', '*', 10],
34592           ['point', 'historic', '*', 10],
34593           ['point', 'leisure', '*', 10],
34594           ['point', 'man_made', '*', 10],
34595           ['point', 'natural', '*', 10],
34596           ['point', 'shop', '*', 10],
34597           ['point', 'tourism', '*', 10],
34598           ['point', 'camp_site', '*', 10],
34599           ['line', 'name', '*', 12],
34600           ['area', 'name', '*', 12],
34601           ['point', 'name', '*', 10]
34602       ];
34603
34604
34605       function blacklisted(preset) {
34606           var noIcons = ['building', 'landuse', 'natural'];
34607           return some(noIcons, function(s) {
34608               return preset.id.indexOf(s) >= 0;
34609           });
34610       }
34611
34612
34613       function get(array, prop) {
34614           return function(d, i) { return array[i][prop]; };
34615       }
34616
34617
34618       function textWidth(text, size, elem) {
34619           var c = _textWidthCache[size];
34620           if (!c) c = _textWidthCache[size] = {};
34621
34622           if (c[text]) {
34623               return c[text];
34624
34625           } else if (elem) {
34626               c[text] = elem.getComputedTextLength();
34627               return c[text];
34628
34629           } else {
34630               var str = encodeURIComponent(text).match(/%[CDEFcdef]/g);
34631               if (str === null) {
34632                   return size / 3 * 2 * text.length;
34633               } else {
34634                   return size / 3 * (2 * text.length + str.length);
34635               }
34636           }
34637       }
34638
34639
34640       function drawLinePaths(selection, entities, filter, classes, labels) {
34641           var paths = selection.selectAll('path')
34642               .filter(filter)
34643               .data(entities, osmEntity$$1.key);
34644
34645           // exit
34646           paths.exit()
34647               .remove();
34648
34649           // enter/update
34650           paths.enter()
34651               .append('path')
34652               .style('stroke-width', get(labels, 'font-size'))
34653               .attr('id', function(d) { return 'labelpath-' + d.id; })
34654               .attr('class', classes)
34655               .merge(paths)
34656               .attr('d', get(labels, 'lineString'));
34657       }
34658
34659
34660       function drawLineLabels(selection, entities, filter, classes, labels) {
34661           var texts = selection.selectAll('text.' + classes)
34662               .filter(filter)
34663               .data(entities, osmEntity$$1.key);
34664
34665           // exit
34666           texts.exit()
34667               .remove();
34668
34669           // enter
34670           texts.enter()
34671               .append('text')
34672               .attr('class', function(d, i) { return classes + ' ' + labels[i].classes + ' ' + d.id; })
34673               .attr('dy', baselineHack ? '0.35em' : null)
34674               .append('textPath')
34675               .attr('class', 'textpath');
34676
34677           // update
34678           selection.selectAll('text.' + classes).selectAll('.textpath')
34679               .filter(filter)
34680               .data(entities, osmEntity$$1.key)
34681               .attr('startOffset', '50%')
34682               .attr('xlink:href', function(d) { return '#labelpath-' + d.id; })
34683               .text(utilDisplayNameForPath);
34684       }
34685
34686
34687       function drawPointLabels(selection, entities, filter, classes, labels) {
34688           var texts = selection.selectAll('text.' + classes)
34689               .filter(filter)
34690               .data(entities, osmEntity$$1.key);
34691
34692           // exit
34693           texts.exit()
34694               .remove();
34695
34696           // enter/update
34697           texts.enter()
34698               .append('text')
34699               .attr('class', function(d, i) {
34700                   return classes + ' ' + labels[i].classes + ' ' + d.id;
34701               })
34702               .merge(texts)
34703               .attr('x', get(labels, 'x'))
34704               .attr('y', get(labels, 'y'))
34705               .style('text-anchor', get(labels, 'textAnchor'))
34706               .text(utilDisplayName)
34707               .each(function(d, i) {
34708                   textWidth(utilDisplayName(d), labels[i].height, this);
34709               });
34710       }
34711
34712
34713       function drawAreaLabels(selection, entities, filter, classes, labels) {
34714           entities = entities.filter(hasText);
34715           labels = labels.filter(hasText);
34716           drawPointLabels(selection, entities, filter, classes, labels);
34717
34718           function hasText(d, i) {
34719               return labels[i].hasOwnProperty('x') && labels[i].hasOwnProperty('y');
34720           }
34721       }
34722
34723
34724       function drawAreaIcons(selection, entities, filter, classes, labels) {
34725           var icons = selection.selectAll('use.' + classes)
34726               .filter(filter)
34727               .data(entities, osmEntity$$1.key);
34728
34729           // exit
34730           icons.exit()
34731               .remove();
34732
34733           // enter/update
34734           icons.enter()
34735               .append('use')
34736               .attr('class', 'icon ' + classes)
34737               .attr('width', '17px')
34738               .attr('height', '17px')
34739               .merge(icons)
34740               .attr('transform', get(labels, 'transform'))
34741               .attr('xlink:href', function(d) {
34742                   var preset = context.presets().match(d, context.graph());
34743                   var picon = preset && preset.icon;
34744
34745                   if (!picon) {
34746                       return '';
34747                   } else {
34748                       var isMaki = /^maki-/.test(picon);
34749                       return '#' + picon + (isMaki ? '-15' : '');
34750                   }
34751               });
34752       }
34753
34754
34755       function drawCollisionBoxes(selection, rtree, which) {
34756           var classes = 'debug ' + which + ' ' + (which === 'debug-skipped' ? 'orange' : 'yellow');
34757
34758           var gj = [];
34759           if (context.getDebug('collision')) {
34760               gj = rtree.all().map(function(d) {
34761                   return { type: 'Polygon', coordinates: [[
34762                       [d.minX, d.minY],
34763                       [d.maxX, d.minY],
34764                       [d.maxX, d.maxY],
34765                       [d.minX, d.maxY],
34766                       [d.minX, d.minY]
34767                   ]]};
34768               });
34769           }
34770
34771           var boxes = selection.selectAll('.' + which)
34772               .data(gj);
34773
34774           // exit
34775           boxes.exit()
34776               .remove();
34777
34778           // enter/update
34779           boxes.enter()
34780               .append('path')
34781               .attr('class', classes)
34782               .merge(boxes)
34783               .attr('d', d3_geoPath());
34784       }
34785
34786
34787       function drawLabels(selection, graph, entities, filter, dimensions, fullRedraw) {
34788           var wireframe = context.surface().classed('fill-wireframe');
34789           var zoom = geoScaleToZoom(projection$$1.scale());
34790
34791           var labelable = [];
34792           var renderNodeAs = {};
34793           var i, j, k, entity, geometry;
34794
34795           for (i = 0; i < labelStack.length; i++) {
34796               labelable.push([]);
34797           }
34798
34799           if (fullRedraw) {
34800               _rdrawn.clear();
34801               _rskipped.clear();
34802               _entitybboxes = {};
34803
34804           } else {
34805               for (i = 0; i < entities.length; i++) {
34806                   entity = entities[i];
34807                   var toRemove = []
34808                       .concat(_entitybboxes[entity.id] || [])
34809                       .concat(_entitybboxes[entity.id + 'I'] || []);
34810
34811                   for (j = 0; j < toRemove.length; j++) {
34812                       _rdrawn.remove(toRemove[j]);
34813                       _rskipped.remove(toRemove[j]);
34814                   }
34815               }
34816           }
34817
34818           // Loop through all the entities to do some preprocessing
34819           for (i = 0; i < entities.length; i++) {
34820               entity = entities[i];
34821               geometry = entity.geometry(graph);
34822
34823               // Insert collision boxes around interesting points/vertices
34824               if (geometry === 'point' || (geometry === 'vertex' && isInterestingVertex(entity))) {
34825                   var hasDirections = entity.directions(graph, projection$$1).length;
34826                   var markerPadding;
34827
34828                   if (!wireframe && geometry === 'point' && !(zoom >= 18 && hasDirections)) {
34829                       renderNodeAs[entity.id] = 'point';
34830                       markerPadding = 20;   // extra y for marker height
34831                   } else {
34832                       renderNodeAs[entity.id] = 'vertex';
34833                       markerPadding = 0;
34834                   }
34835
34836                   var coord = projection$$1(entity.loc);
34837                   var nodePadding = 10;
34838                   var bbox = {
34839                       minX: coord[0] - nodePadding,
34840                       minY: coord[1] - nodePadding - markerPadding,
34841                       maxX: coord[0] + nodePadding,
34842                       maxY: coord[1] + nodePadding
34843                   };
34844
34845                   doInsert(bbox, entity.id + 'P');
34846               }
34847
34848               // From here on, treat vertices like points
34849               if (geometry === 'vertex') {
34850                   geometry = 'point';
34851               }
34852
34853               // Determine which entities are label-able
34854               var preset = geometry === 'area' && context.presets().match(entity, graph);
34855               var icon = preset && !blacklisted(preset) && preset.icon;
34856
34857               if (!icon && !utilDisplayName(entity))
34858                   continue;
34859
34860               for (k = 0; k < labelStack.length; k++) {
34861                   var matchGeom = labelStack[k][0];
34862                   var matchKey = labelStack[k][1];
34863                   var matchVal = labelStack[k][2];
34864                   var hasVal = entity.tags[matchKey];
34865
34866                   if (geometry === matchGeom && hasVal && (matchVal === '*' || matchVal === hasVal)) {
34867                       labelable[k].push(entity);
34868                       break;
34869                   }
34870               }
34871           }
34872
34873           var positions = {
34874               point: [],
34875               line: [],
34876               area: []
34877           };
34878
34879           var labelled = {
34880               point: [],
34881               line: [],
34882               area: []
34883           };
34884
34885           // Try and find a valid label for labellable entities
34886           for (k = 0; k < labelable.length; k++) {
34887               var fontSize = labelStack[k][3];
34888
34889               for (i = 0; i < labelable[k].length; i++) {
34890                   entity = labelable[k][i];
34891                   geometry = entity.geometry(graph);
34892
34893                   var getName = (geometry === 'line') ? utilDisplayNameForPath : utilDisplayName;
34894                   var name = getName(entity);
34895                   var width = name && textWidth(name, fontSize);
34896                   var p = null;
34897
34898                   if (geometry === 'point' || geometry === 'vertex') {
34899                       // no point or vertex labels in wireframe mode
34900                       // no vertex labels at low zooms (vertices have no icons)
34901                       if (wireframe) continue;
34902                       var renderAs = renderNodeAs[entity.id];
34903                       if (renderAs === 'vertex' && zoom < 17) continue;
34904
34905                       p = getPointLabel(entity, width, fontSize, renderAs);
34906
34907                   } else if (geometry === 'line') {
34908                       p = getLineLabel(entity, width, fontSize);
34909
34910                   } else if (geometry === 'area') {
34911                       p = getAreaLabel(entity, width, fontSize);
34912                   }
34913
34914                   if (p) {
34915                       if (geometry === 'vertex') { geometry = 'point'; }  // treat vertex like point
34916                       p.classes = geometry + ' tag-' + labelStack[k][1];
34917                       positions[geometry].push(p);
34918                       labelled[geometry].push(entity);
34919                   }
34920               }
34921           }
34922
34923
34924           function isInterestingVertex(entity) {
34925               var selectedIDs = context.selectedIDs();
34926
34927               return entity.hasInterestingTags() ||
34928                   entity.isEndpoint(graph) ||
34929                   entity.isConnected(graph) ||
34930                   selectedIDs.indexOf(entity.id) !== -1 ||
34931                   some(graph.parentWays(entity), function(parent) {
34932                       return selectedIDs.indexOf(parent.id) !== -1;
34933                   });
34934           }
34935
34936
34937           function getPointLabel(entity, width, height, geometry) {
34938               var y = (geometry === 'point' ? -12 : 0);
34939               var pointOffsets = {
34940                   ltr: [15, y, 'start'],
34941                   rtl: [-15, y, 'end']
34942               };
34943
34944               var coord = projection$$1(entity.loc);
34945               var textPadding = 2;
34946               var offset = pointOffsets[textDirection];
34947               var p = {
34948                   height: height,
34949                   width: width,
34950                   x: coord[0] + offset[0],
34951                   y: coord[1] + offset[1],
34952                   textAnchor: offset[2]
34953               };
34954
34955               // insert a collision box for the text label..
34956               var bbox;
34957               if (textDirection === 'rtl') {
34958                   bbox = {
34959                       minX: p.x - width - textPadding,
34960                       minY: p.y - (height / 2) - textPadding,
34961                       maxX: p.x + textPadding,
34962                       maxY: p.y + (height / 2) + textPadding
34963                   };
34964               } else {
34965                   bbox = {
34966                       minX: p.x - textPadding,
34967                       minY: p.y - (height / 2) - textPadding,
34968                       maxX: p.x + width + textPadding,
34969                       maxY: p.y + (height / 2) + textPadding
34970                   };
34971               }
34972
34973               if (tryInsert([bbox], entity.id, true)) {
34974                   return p;
34975               }
34976           }
34977
34978
34979           function getLineLabel(entity, width, height) {
34980               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
34981               var points = map$3(graph.childNodes(entity), 'loc').map(projection$$1);
34982               var length = geoPathLength(points);
34983
34984               if (length < width + 20) return;
34985
34986               // todo: properly clip points to viewport
34987
34988               // % along the line to attempt to place the label
34989               var lineOffsets = [50, 45, 55, 40, 60, 35, 65, 30, 70,
34990                                  25, 75, 20, 80, 15, 95, 10, 90, 5, 95];
34991               var padding = 3;
34992
34993               for (var i = 0; i < lineOffsets.length; i++) {
34994                   var offset = lineOffsets[i];
34995                   var middle = offset / 100 * length;
34996                   var start = middle - width / 2;
34997
34998                   if (start < 0 || start + width > length) continue;
34999
35000                   // generate subpath and ignore paths that are invalid or don't cross viewport.
35001                   var sub = subpath(points, start, start + width);
35002                   if (!sub || !geoPolygonIntersectsPolygon(viewport, sub, true)) {
35003                       continue;
35004                   }
35005
35006                   var isReverse = reverse(sub);
35007                   if (isReverse) {
35008                       sub = sub.reverse();
35009                   }
35010
35011                   var bboxes = [];
35012                   var boxsize = (height + 2) / 2;
35013
35014                   for (var j = 0; j < sub.length - 1; j++) {
35015                       var a = sub[j];
35016                       var b = sub[j + 1];
35017
35018                       // split up the text into small collision boxes
35019                       var num = Math.max(1, Math.floor(geoVecLength(a, b) / boxsize / 2));
35020
35021                       for (var box = 0; box < num; box++) {
35022                           var p = geoVecInterp(a, b, box / num);
35023                           var x0 = p[0] - boxsize - padding;
35024                           var y0 = p[1] - boxsize - padding;
35025                           var x1 = p[0] + boxsize + padding;
35026                           var y1 = p[1] + boxsize + padding;
35027
35028                           bboxes.push({
35029                               minX: Math.min(x0, x1),
35030                               minY: Math.min(y0, y1),
35031                               maxX: Math.max(x0, x1),
35032                               maxY: Math.max(y0, y1)
35033                           });
35034                       }
35035                   }
35036
35037                   if (tryInsert(bboxes, entity.id, false)) {   // accept this one
35038                       return {
35039                           'font-size': height + 2,
35040                           lineString: lineString(sub),
35041                           startOffset: offset + '%'
35042                       };
35043                   }
35044               }
35045
35046               function reverse(p) {
35047                   var angle = Math.atan2(p[1][1] - p[0][1], p[1][0] - p[0][0]);
35048                   return !(p[0][0] < p[p.length - 1][0] && angle < Math.PI/2 && angle > -Math.PI/2);
35049               }
35050
35051               function lineString(points) {
35052                   return 'M' + points.join('L');
35053               }
35054
35055               function subpath(points, from, to) {
35056                   var sofar = 0;
35057                   var start, end, i0, i1;
35058
35059                   for (var i = 0; i < points.length - 1; i++) {
35060                       var a = points[i];
35061                       var b = points[i + 1];
35062                       var current = geoVecLength(a, b);
35063                       var portion;
35064                       if (!start && sofar + current >= from) {
35065                           portion = (from - sofar) / current;
35066                           start = [
35067                               a[0] + portion * (b[0] - a[0]),
35068                               a[1] + portion * (b[1] - a[1])
35069                           ];
35070                           i0 = i + 1;
35071                       }
35072                       if (!end && sofar + current >= to) {
35073                           portion = (to - sofar) / current;
35074                           end = [
35075                               a[0] + portion * (b[0] - a[0]),
35076                               a[1] + portion * (b[1] - a[1])
35077                           ];
35078                           i1 = i + 1;
35079                       }
35080                       sofar += current;
35081                   }
35082
35083                   var result = points.slice(i0, i1);
35084                   result.unshift(start);
35085                   result.push(end);
35086                   return result;
35087               }
35088           }
35089
35090
35091           function getAreaLabel(entity, width, height) {
35092               var centroid = path.centroid(entity.asGeoJSON(graph, true));
35093               var extent = entity.extent(graph);
35094               var areaWidth = projection$$1(extent[1])[0] - projection$$1(extent[0])[0];
35095
35096               if (isNaN(centroid[0]) || areaWidth < 20) return;
35097
35098               var preset = context.presets().match(entity, context.graph());
35099               var picon = preset && preset.icon;
35100               var iconSize = 17;
35101               var padding = 2;
35102               var p = {};
35103
35104               if (picon) {  // icon and label..
35105                   if (addIcon()) {
35106                       addLabel(iconSize + padding);
35107                       return p;
35108                   }
35109               } else {   // label only..
35110                   if (addLabel(0)) {
35111                       return p;
35112                   }
35113               }
35114
35115
35116               function addIcon() {
35117                   var iconX = centroid[0] - (iconSize / 2);
35118                   var iconY = centroid[1] - (iconSize / 2);
35119                   var bbox = {
35120                       minX: iconX,
35121                       minY: iconY,
35122                       maxX: iconX + iconSize,
35123                       maxY: iconY + iconSize
35124                   };
35125
35126                   if (tryInsert([bbox], entity.id + 'I', true)) {
35127                       p.transform = 'translate(' + iconX + ',' + iconY + ')';
35128                       return true;
35129                   }
35130                   return false;
35131               }
35132
35133               function addLabel(yOffset) {
35134                   if (width && areaWidth >= width + 20) {
35135                       var labelX = centroid[0];
35136                       var labelY = centroid[1] + yOffset;
35137                       var bbox = {
35138                           minX: labelX - (width / 2) - padding,
35139                           minY: labelY - (height / 2) - padding,
35140                           maxX: labelX + (width / 2) + padding,
35141                           maxY: labelY + (height / 2) + padding
35142                       };
35143
35144                       if (tryInsert([bbox], entity.id, true)) {
35145                           p.x = labelX;
35146                           p.y = labelY;
35147                           p.textAnchor = 'middle';
35148                           p.height = height;
35149                           return true;
35150                       }
35151                   }
35152                   return false;
35153               }
35154           }
35155
35156
35157           // force insert a singular bounding box
35158           // singular box only, no array, id better be unique
35159           function doInsert(bbox, id) {
35160               bbox.id = id;
35161
35162               var oldbox = _entitybboxes[id];
35163               if (oldbox) {
35164                   _rdrawn.remove(oldbox);
35165               }
35166               _entitybboxes[id] = bbox;
35167               _rdrawn.insert(bbox);
35168           }
35169
35170
35171           function tryInsert(bboxes, id, saveSkipped) {
35172               var skipped = false;
35173
35174               for (var i = 0; i < bboxes.length; i++) {
35175                   var bbox = bboxes[i];
35176                   bbox.id = id;
35177
35178                   // Check that label is visible
35179                   if (bbox.minX < 0 || bbox.minY < 0 || bbox.maxX > dimensions[0] || bbox.maxY > dimensions[1]) {
35180                       skipped = true;
35181                       break;
35182                   }
35183                   if (_rdrawn.collides(bbox)) {
35184                       skipped = true;
35185                       break;
35186                   }
35187               }
35188
35189               _entitybboxes[id] = bboxes;
35190
35191               if (skipped) {
35192                   if (saveSkipped) {
35193                       _rskipped.load(bboxes);
35194                   }
35195               } else {
35196                   _rdrawn.load(bboxes);
35197               }
35198
35199               return !skipped;
35200           }
35201
35202
35203           var layer = selection.selectAll('.layer-osm.labels');
35204           layer.selectAll('.labels-group')
35205               .data(['halo', 'label', 'debug'])
35206               .enter()
35207               .append('g')
35208               .attr('class', function(d) { return 'labels-group ' + d; });
35209
35210           var halo = layer.selectAll('.labels-group.halo');
35211           var label = layer.selectAll('.labels-group.label');
35212           var debug = layer.selectAll('.labels-group.debug');
35213
35214           // points
35215           drawPointLabels(label, labelled.point, filter, 'pointlabel', positions.point);
35216           drawPointLabels(halo, labelled.point, filter, 'pointlabel-halo', positions.point);
35217
35218           // lines
35219           drawLinePaths(layer, labelled.line, filter, '', positions.line);
35220           drawLineLabels(label, labelled.line, filter, 'linelabel', positions.line);
35221           drawLineLabels(halo, labelled.line, filter, 'linelabel-halo', positions.line);
35222
35223           // areas
35224           drawAreaLabels(label, labelled.area, filter, 'arealabel', positions.area);
35225           drawAreaLabels(halo, labelled.area, filter, 'arealabel-halo', positions.area);
35226           drawAreaIcons(label, labelled.area, filter, 'areaicon', positions.area);
35227           drawAreaIcons(halo, labelled.area, filter, 'areaicon-halo', positions.area);
35228
35229           // debug
35230           drawCollisionBoxes(debug, _rskipped, 'debug-skipped');
35231           drawCollisionBoxes(debug, _rdrawn, 'debug-drawn');
35232
35233           layer.call(filterLabels);
35234       }
35235
35236
35237       function filterLabels(selection) {
35238           var drawLayer = selection.selectAll('.layer-osm.labels');
35239           var layers = drawLayer.selectAll('.labels-group.halo, .labels-group.label');
35240
35241           layers.selectAll('.nolabel')
35242               .classed('nolabel', false);
35243
35244           var mouse = context.mouse();
35245           var graph = context.graph();
35246           var selectedIDs = context.selectedIDs();
35247           var ids = [];
35248           var pad, bbox;
35249
35250           // hide labels near the mouse
35251           if (mouse) {
35252               pad = 20;
35253               bbox = { minX: mouse[0] - pad, minY: mouse[1] - pad, maxX: mouse[0] + pad, maxY: mouse[1] + pad };
35254               ids.push.apply(ids, map$3(_rdrawn.search(bbox), 'id'));
35255           }
35256
35257           // hide labels on selected nodes (they look weird when dragging / haloed)
35258           for (var i = 0; i < selectedIDs.length; i++) {
35259               var entity = graph.hasEntity(selectedIDs[i]);
35260               if (entity && entity.type === 'node') {
35261                   ids.push(selectedIDs[i]);
35262               }
35263           }
35264
35265           layers.selectAll(utilEntitySelector(ids))
35266               .classed('nolabel', true);
35267
35268
35269           // draw the mouse bbox if debugging is on..
35270           var debug = selection.selectAll('.labels-group.debug');
35271           var gj = [];
35272           if (context.getDebug('collision')) {
35273               gj = bbox ? [{
35274                   type: 'Polygon',
35275                   coordinates: [[
35276                       [bbox.minX, bbox.minY],
35277                       [bbox.maxX, bbox.minY],
35278                       [bbox.maxX, bbox.maxY],
35279                       [bbox.minX, bbox.maxY],
35280                       [bbox.minX, bbox.minY]
35281                   ]]
35282               }] : [];
35283           }
35284
35285           var box = debug.selectAll('.debug-mouse')
35286               .data(gj);
35287
35288           // exit
35289           box.exit()
35290               .remove();
35291
35292           // enter/update
35293           box.enter()
35294               .append('path')
35295               .attr('class', 'debug debug-mouse yellow')
35296               .merge(box)
35297               .attr('d', d3_geoPath());
35298       }
35299
35300
35301       var throttleFilterLabels = throttle(utilCallWhenIdle(filterLabels), 100);
35302
35303
35304       drawLabels.observe = function(selection) {
35305           var listener = function() { throttleFilterLabels(selection); };
35306           selection.on('mousemove.hidelabels', listener);
35307           context.on('enter.hidelabels', listener);
35308       };
35309
35310
35311       drawLabels.off = function(selection) {
35312           throttleFilterLabels.cancel();
35313           selection.on('mousemove.hidelabels', null);
35314           context.on('enter.hidelabels', null);
35315       };
35316
35317
35318       return drawLabels;
35319   }
35320
35321   function svgStreetside$$1(projection, context, dispatch) {
35322       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35323       var minZoom = 14;
35324       var minMarkerZoom = 16;
35325       var minViewfieldZoom = 18;
35326       var layer = select(null);
35327       var _viewerYaw = 0;
35328       var _selectedSequence = null;
35329       var _hoveredBubble = null;
35330       var _streetside;
35331
35332       /**
35333        * init().
35334        */
35335       function init() {
35336           if (svgStreetside$$1.initialized) return;  // run once
35337           svgStreetside$$1.enabled = false;
35338           svgStreetside$$1.initialized = true;
35339       }
35340
35341       /**
35342        * getService().
35343        */
35344       function getService() {
35345           if (services.streetside && !_streetside) {
35346               _streetside = services.streetside;
35347               _streetside.event
35348                   .on('viewerChanged', viewerChanged)
35349                   .on('loadedBubbles', throttledRedraw);
35350           } else if (!services.streetside && _streetside) {
35351               _streetside = null;
35352           }
35353
35354           return _streetside;
35355       }
35356
35357       /**
35358        * showLayer().
35359        */
35360       function showLayer() {
35361           var service = getService();
35362           if (!service) return;
35363
35364           service.loadViewer(context);
35365           editOn();
35366
35367           layer
35368               .style('opacity', 0)
35369               .transition()
35370               .duration(250)
35371               .style('opacity', 1)
35372               .on('end', function () { dispatch.call('change'); });
35373       }
35374
35375       /**
35376        * hideLayer().
35377        */
35378       function hideLayer() {
35379           var service = getService();
35380           if (service) {
35381               service.hideViewer();
35382           }
35383
35384           throttledRedraw.cancel();
35385
35386           layer
35387               .transition()
35388               .duration(250)
35389               .style('opacity', 0)
35390               .on('end', editOff);
35391       }
35392
35393       /**
35394        * editOn().
35395        */
35396       function editOn() {
35397           layer.style('display', 'block');
35398       }
35399
35400       /**
35401        * editOff().
35402        */
35403       function editOff() {
35404           layer.selectAll('.viewfield-group').remove();
35405           layer.style('display', 'none');
35406       }
35407
35408       /**
35409        * click() Handles 'bubble' point click event.
35410        */
35411       function click(d) {
35412           var service = getService();
35413           if (!service) return;
35414
35415           // try to preserve the viewer rotation when staying on the same sequence
35416           if (d.sequenceKey !== _selectedSequence) {
35417               _viewerYaw = 0;  // reset
35418           }
35419           _selectedSequence = d.sequenceKey;
35420
35421           service
35422               .selectImage(d)
35423               .then(function(r) {
35424                   if (r.status === 'ok'){
35425                       service.showViewer(_viewerYaw);
35426                   }
35427               });
35428
35429
35430           context.map().centerEase(d.loc);
35431       }
35432
35433       /**
35434        * mouseover().
35435        */
35436       function mouseover(d) {
35437           var service = getService();
35438           _hoveredBubble = d;
35439           if (service) service.setStyles(d, true);
35440       }
35441
35442       /**
35443        * mouseout().
35444        */
35445       function mouseout() {
35446           var service = getService();
35447           _hoveredBubble = null;
35448           if (service) service.setStyles(null, true);
35449       }
35450
35451       /**
35452        * transform().
35453        */
35454       function transform(d) {
35455           var t = svgPointTransform(projection)(d);
35456           var rot = d.ca + _viewerYaw;
35457           if (rot) {
35458               t += ' rotate(' + Math.floor(rot) + ',0,0)';
35459           }
35460           return t;
35461       }
35462
35463
35464       function viewerChanged() {
35465           var service = getService();
35466           if (!service) return;
35467
35468           var viewer = service.viewer();
35469           if (!viewer) return;
35470
35471           // update viewfield rotation
35472           _viewerYaw = viewer.getYaw();
35473
35474           // avoid updating if the map is currently transformed
35475           // e.g. during drags or easing.
35476           if (context.map().isTransformed()) return;
35477
35478           layer.selectAll('.viewfield-group.selected')
35479               .attr('transform', transform);
35480       }
35481
35482
35483       /**
35484        * update().
35485        */
35486       function update() {
35487           var viewer = select('#photoviewer');
35488           var selected = viewer.empty() ? undefined : viewer.datum();
35489           var z = ~~context.map().zoom();
35490           var showMarkers = (z >= minMarkerZoom);
35491           var showViewfields = (z >= minViewfieldZoom);
35492           var service = getService();
35493
35494           var sequences = (service ? service.sequences(projection) : []);
35495           var bubbles = (service && showMarkers ? service.bubbles(projection) : []);
35496
35497           var traces = layer.selectAll('.sequences').selectAll('.sequence')
35498               .data(sequences, function(d) { return d.properties.key; });
35499
35500           // exit
35501           traces.exit()
35502               .remove();
35503
35504           // enter/update
35505           traces = traces.enter()
35506               .append('path')
35507               .attr('class', 'sequence')
35508               .merge(traces)
35509               .attr('d', svgPath(projection).geojson);
35510
35511
35512           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
35513               .data(bubbles, function(d) {
35514                   // force reenter once bubbles are attached to a sequence
35515                   return d.key + (d.sequenceKey ? 'v1' : 'v0');
35516               });
35517
35518           // exit
35519           groups.exit()
35520               .remove();
35521
35522           // enter
35523           var groupsEnter = groups.enter()
35524               .append('g')
35525               .attr('class', 'viewfield-group')
35526               .on('mouseover', mouseover)
35527               .on('mouseout', mouseout)
35528               .on('click', click);
35529
35530           groupsEnter
35531               .append('g')
35532               .attr('class', 'viewfield-scale');
35533
35534           // update
35535           var markers = groups
35536               .merge(groupsEnter)
35537               .sort(function(a, b) {
35538                   return (a === selected) ? 1
35539                       : (b === selected) ? -1
35540                       : b.loc[1] - a.loc[1];
35541               })
35542               .attr('transform', transform)
35543               .select('.viewfield-scale');
35544
35545
35546           markers.selectAll('circle')
35547               .data([0])
35548               .enter()
35549               .append('circle')
35550               .attr('dx', '0')
35551               .attr('dy', '0')
35552               .attr('r', '6');
35553
35554           var viewfields = markers.selectAll('.viewfield')
35555               .data(showViewfields ? [0] : []);
35556
35557           viewfields.exit()
35558               .remove();
35559
35560           // viewfields may or may not be drawn...
35561           // but if they are, draw below the circles
35562           viewfields.enter()
35563               .insert('path', 'circle')
35564               .attr('class', 'viewfield')
35565               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
35566               .attr('d', viewfieldPath);
35567
35568
35569           if (service) {
35570               service.setStyles(_hoveredBubble, true);
35571           }
35572
35573
35574           function viewfieldPath() {
35575               var d = this.parentNode.__data__;
35576               if (d.pano) {
35577                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
35578               } else {
35579                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
35580               }
35581           }
35582
35583       }
35584
35585       /**
35586        * drawImages()
35587        * drawImages is the method that is returned (and that runs) everytime 'svgStreetside()' is called.
35588        * 'svgStreetside()' is called from index.js
35589        */
35590       function drawImages(selection$$1) {
35591           var enabled = svgStreetside$$1.enabled;
35592           var service = getService();
35593
35594           layer = selection$$1.selectAll('.layer-streetside-images')
35595               .data(service ? [0] : []);
35596
35597           layer.exit()
35598               .remove();
35599
35600           var layerEnter = layer.enter()
35601               .append('g')
35602               .attr('class', 'layer-streetside-images')
35603               .style('display', enabled ? 'block' : 'none');
35604
35605           layerEnter
35606               .append('g')
35607               .attr('class', 'sequences');
35608
35609           layerEnter
35610               .append('g')
35611               .attr('class', 'markers');
35612
35613           layer = layerEnter
35614               .merge(layer);
35615
35616           if (enabled) {
35617               if (service && ~~context.map().zoom() >= minZoom) {
35618                   editOn();
35619                   update();
35620                   service.loadBubbles(projection);
35621               } else {
35622                   editOff();
35623               }
35624           }
35625       }
35626
35627
35628       /**
35629        * drawImages.enabled().
35630        */
35631       drawImages.enabled = function(_) {
35632           if (!arguments.length) return svgStreetside$$1.enabled;
35633           svgStreetside$$1.enabled = _;
35634           if (svgStreetside$$1.enabled) {
35635               showLayer();
35636           } else {
35637               hideLayer();
35638           }
35639           dispatch.call('change');
35640           return this;
35641       };
35642
35643       /**
35644        * drawImages.supported().
35645        */
35646       drawImages.supported = function() {
35647           return !!getService();
35648       };
35649
35650       init();
35651
35652       return drawImages;
35653   }
35654
35655   function svgMapillaryImages$$1(projection, context, dispatch) {
35656       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35657       var minZoom = 12;
35658       var minMarkerZoom = 16;
35659       var minViewfieldZoom = 18;
35660       var layer = select(null);
35661       var _mapillary;
35662       var viewerCompassAngle;
35663
35664
35665       function init() {
35666           if (svgMapillaryImages$$1.initialized) return;  // run once
35667           svgMapillaryImages$$1.enabled = false;
35668           svgMapillaryImages$$1.initialized = true;
35669       }
35670
35671
35672       function getService() {
35673           if (services.mapillary && !_mapillary) {
35674               _mapillary = services.mapillary;
35675               _mapillary.event.on('loadedImages', throttledRedraw);
35676               _mapillary.event.on('bearingChanged', function(e) {
35677                   viewerCompassAngle = e;
35678
35679                   // avoid updating if the map is currently transformed
35680                   // e.g. during drags or easing.
35681                   if (context.map().isTransformed()) return;
35682
35683                   layer.selectAll('.viewfield-group.selected')
35684                       .filter(function(d) {
35685                           return d.pano;
35686                       })
35687                       .attr('transform', transform);
35688               });
35689           } else if (!services.mapillary && _mapillary) {
35690               _mapillary = null;
35691           }
35692
35693           return _mapillary;
35694       }
35695
35696
35697       function showLayer() {
35698           var service = getService();
35699           if (!service) return;
35700
35701           service.loadViewer(context);
35702           editOn();
35703
35704           layer
35705               .style('opacity', 0)
35706               .transition()
35707               .duration(250)
35708               .style('opacity', 1)
35709               .on('end', function () { dispatch.call('change'); });
35710       }
35711
35712
35713       function hideLayer() {
35714           var service = getService();
35715           if (service) {
35716               service.hideViewer();
35717           }
35718
35719           throttledRedraw.cancel();
35720
35721           layer
35722               .transition()
35723               .duration(250)
35724               .style('opacity', 0)
35725               .on('end', editOff);
35726       }
35727
35728
35729       function editOn() {
35730           layer.style('display', 'block');
35731       }
35732
35733
35734       function editOff() {
35735           layer.selectAll('.viewfield-group').remove();
35736           layer.style('display', 'none');
35737       }
35738
35739
35740       function click(d) {
35741           var service = getService();
35742           if (!service) return;
35743
35744           service
35745               .selectImage(d)
35746               .updateViewer(d.key, context)
35747               .showViewer();
35748
35749           context.map().centerEase(d.loc);
35750       }
35751
35752
35753       function mouseover(d) {
35754           var service = getService();
35755           if (service) service.setStyles(d);
35756       }
35757
35758
35759       function mouseout() {
35760           var service = getService();
35761           if (service) service.setStyles(null);
35762       }
35763
35764
35765       function transform(d) {
35766           var t = svgPointTransform(projection)(d);
35767           if (d.pano && isNumber(viewerCompassAngle)) {
35768               t += ' rotate(' + Math.floor(viewerCompassAngle) + ',0,0)';
35769           } else if (d.ca) {
35770               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
35771           }
35772           return t;
35773       }
35774
35775
35776       function update() {
35777           var viewer = select('#photoviewer');
35778           var selected = viewer.empty() ? undefined : viewer.datum();
35779
35780           var z = ~~context.map().zoom();
35781           var showMarkers = (z >= minMarkerZoom);
35782           var showViewfields = (z >= minViewfieldZoom);
35783
35784           var service = getService();
35785           var sequences = (service ? service.sequences(projection) : []);
35786           var images = (service && showMarkers ? service.images(projection) : []);
35787
35788           var traces = layer.selectAll('.sequences').selectAll('.sequence')
35789               .data(sequences, function(d) { return d.properties.key; });
35790
35791           // exit
35792           traces.exit()
35793               .remove();
35794
35795           // enter/update
35796           traces = traces.enter()
35797               .append('path')
35798               .attr('class', 'sequence')
35799               .merge(traces)
35800               .attr('d', svgPath(projection).geojson);
35801
35802
35803           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
35804               .data(images, function(d) { return d.key; });
35805
35806           // exit
35807           groups.exit()
35808               .remove();
35809
35810           // enter
35811           var groupsEnter = groups.enter()
35812               .append('g')
35813               .attr('class', 'viewfield-group')
35814               .on('mouseover', mouseover)
35815               .on('mouseout', mouseout)
35816               .on('click', click);
35817
35818           groupsEnter
35819               .append('g')
35820               .attr('class', 'viewfield-scale');
35821
35822           // update
35823           var markers = groups
35824               .merge(groupsEnter)
35825               .sort(function(a, b) {
35826                   return (a === selected) ? 1
35827                       : (b === selected) ? -1
35828                       : b.loc[1] - a.loc[1];  // sort Y
35829               })
35830               .attr('transform', transform)
35831               .select('.viewfield-scale');
35832
35833
35834           markers.selectAll('circle')
35835               .data([0])
35836               .enter()
35837               .append('circle')
35838               .attr('dx', '0')
35839               .attr('dy', '0')
35840               .attr('r', '6');
35841
35842           var viewfields = markers.selectAll('.viewfield')
35843               .data(showViewfields ? [0] : []);
35844
35845           viewfields.exit()
35846               .remove();
35847
35848           viewfields.enter()               // viewfields may or may not be drawn...
35849               .insert('path', 'circle')    // but if they are, draw below the circles
35850               .attr('class', 'viewfield')
35851               .classed('pano', function() { return this.parentNode.__data__.pano; })
35852               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
35853               .attr('d', viewfieldPath);
35854
35855           function viewfieldPath() {
35856               var d = this.parentNode.__data__;
35857               if (d.pano) {
35858                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
35859               } else {
35860                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
35861               }
35862           }
35863       }
35864
35865
35866       function drawImages(selection$$1) {
35867           var enabled = svgMapillaryImages$$1.enabled;
35868           var service = getService();
35869
35870           layer = selection$$1.selectAll('.layer-mapillary-images')
35871               .data(service ? [0] : []);
35872
35873           layer.exit()
35874               .remove();
35875
35876           var layerEnter = layer.enter()
35877               .append('g')
35878               .attr('class', 'layer-mapillary-images')
35879               .style('display', enabled ? 'block' : 'none');
35880
35881           layerEnter
35882               .append('g')
35883               .attr('class', 'sequences');
35884
35885           layerEnter
35886               .append('g')
35887               .attr('class', 'markers');
35888
35889           layer = layerEnter
35890               .merge(layer);
35891
35892           if (enabled) {
35893               if (service && ~~context.map().zoom() >= minZoom) {
35894                   editOn();
35895                   update();
35896                   service.loadImages(projection);
35897               } else {
35898                   editOff();
35899               }
35900           }
35901       }
35902
35903
35904       drawImages.enabled = function(_) {
35905           if (!arguments.length) return svgMapillaryImages$$1.enabled;
35906           svgMapillaryImages$$1.enabled = _;
35907           if (svgMapillaryImages$$1.enabled) {
35908               showLayer();
35909           } else {
35910               hideLayer();
35911           }
35912           dispatch.call('change');
35913           return this;
35914       };
35915
35916
35917       drawImages.supported = function() {
35918           return !!getService();
35919       };
35920
35921
35922       init();
35923       return drawImages;
35924   }
35925
35926   function svgMapillarySigns$$1(projection, context, dispatch) {
35927       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
35928       var minZoom = 12;
35929       var layer = select(null);
35930       var _mapillary;
35931
35932
35933       function init() {
35934           if (svgMapillarySigns$$1.initialized) return;  // run once
35935           svgMapillarySigns$$1.enabled = false;
35936           svgMapillarySigns$$1.initialized = true;
35937       }
35938
35939
35940       function getService() {
35941           if (services.mapillary && !_mapillary) {
35942               _mapillary = services.mapillary;
35943               _mapillary.event.on('loadedSigns', throttledRedraw);
35944           } else if (!services.mapillary && _mapillary) {
35945               _mapillary = null;
35946           }
35947           return _mapillary;
35948       }
35949
35950
35951       function showLayer() {
35952           var service = getService();
35953           if (!service) return;
35954
35955           service.loadViewer(context);
35956           editOn();
35957       }
35958
35959
35960       function hideLayer() {
35961           throttledRedraw.cancel();
35962           editOff();
35963       }
35964
35965
35966       function editOn() {
35967           layer.style('display', 'block');
35968       }
35969
35970
35971       function editOff() {
35972           layer.selectAll('.icon-sign').remove();
35973           layer.style('display', 'none');
35974       }
35975
35976
35977       function click(d) {
35978           var service = getService();
35979           if (!service) return;
35980
35981           context.map().centerEase(d.loc);
35982
35983           var selected = service.getSelectedImage();
35984           var selectedImageKey = selected && selected.key;
35985           var imageKey;
35986
35987           // Pick one of the images the sign was detected in,
35988           // preference given to an image already selected.
35989           d.detections.forEach(function(detection) {
35990               if (!imageKey || selectedImageKey === detection.image_key) {
35991                   imageKey = detection.image_key;
35992               }
35993           });
35994
35995           service
35996               .selectImage(null, imageKey)
35997               .updateViewer(imageKey, context)
35998               .showViewer();
35999       }
36000
36001
36002       function update() {
36003           var service = getService();
36004           var data = (service ? service.signs(projection) : []);
36005           var viewer = select('#photoviewer');
36006           var selected = viewer.empty() ? undefined : viewer.datum();
36007           var selectedImageKey = selected && selected.key;
36008           var transform = svgPointTransform(projection);
36009
36010           var signs = layer.selectAll('.icon-sign')
36011               .data(data, function(d) { return d.key; });
36012
36013           // exit
36014           signs.exit()
36015               .remove();
36016
36017           // enter
36018           var enter = signs.enter()
36019               .append('use')
36020               .attr('class', 'icon-sign')
36021               .attr('width', '24px')
36022               .attr('height', '24px')
36023               .attr('x', '-12px')
36024               .attr('y', '-12px')
36025               .attr('xlink:href', function(d) { return '#' + d.value; })
36026               .classed('selected', function(d) {
36027                   return some(d.detections, function(detection) {
36028                       return detection.image_key === selectedImageKey;
36029                   });
36030               })
36031               .on('click', click);
36032
36033           // update
36034           signs
36035               .merge(enter)
36036               .sort(function(a, b) {
36037                   return (a === selected) ? 1
36038                       : (b === selected) ? -1
36039                       : b.loc[1] - a.loc[1];  // sort Y
36040               })
36041               .attr('transform', transform);
36042       }
36043
36044
36045       function drawSigns(selection$$1) {
36046           var enabled = svgMapillarySigns$$1.enabled;
36047           var service = getService();
36048
36049           layer = selection$$1.selectAll('.layer-mapillary-signs')
36050               .data(service ? [0] : []);
36051
36052           layer.exit()
36053               .remove();
36054
36055           layer = layer.enter()
36056               .append('g')
36057               .attr('class', 'layer-mapillary-signs')
36058               .style('display', enabled ? 'block' : 'none')
36059               .merge(layer);
36060
36061           if (enabled) {
36062               if (service && ~~context.map().zoom() >= minZoom) {
36063                   editOn();
36064                   update();
36065                   service.loadSigns(context, projection);
36066               } else {
36067                   editOff();
36068               }
36069           }
36070       }
36071
36072
36073       drawSigns.enabled = function(_) {
36074           if (!arguments.length) return svgMapillarySigns$$1.enabled;
36075           svgMapillarySigns$$1.enabled = _;
36076           if (svgMapillarySigns$$1.enabled) {
36077               showLayer();
36078           } else {
36079               hideLayer();
36080           }
36081           dispatch.call('change');
36082           return this;
36083       };
36084
36085
36086       drawSigns.supported = function() {
36087           return !!getService();
36088       };
36089
36090
36091       init();
36092       return drawSigns;
36093   }
36094
36095   function svgOpenstreetcamImages$$1(projection, context, dispatch) {
36096       var throttledRedraw = throttle(function () { dispatch.call('change'); }, 1000);
36097       var minZoom = 12;
36098       var minMarkerZoom = 16;
36099       var minViewfieldZoom = 18;
36100       var layer = select(null);
36101       var _openstreetcam;
36102
36103
36104       function init() {
36105           if (svgOpenstreetcamImages$$1.initialized) return;  // run once
36106           svgOpenstreetcamImages$$1.enabled = false;
36107           svgOpenstreetcamImages$$1.initialized = true;
36108       }
36109
36110
36111       function getService() {
36112           if (services.openstreetcam && !_openstreetcam) {
36113               _openstreetcam = services.openstreetcam;
36114               _openstreetcam.event.on('loadedImages', throttledRedraw);
36115           } else if (!services.openstreetcam && _openstreetcam) {
36116               _openstreetcam = null;
36117           }
36118
36119           return _openstreetcam;
36120       }
36121
36122
36123       function showLayer() {
36124           var service = getService();
36125           if (!service) return;
36126
36127           service.loadViewer(context);
36128           editOn();
36129
36130           layer
36131               .style('opacity', 0)
36132               .transition()
36133               .duration(250)
36134               .style('opacity', 1)
36135               .on('end', function () { dispatch.call('change'); });
36136       }
36137
36138
36139       function hideLayer() {
36140           var service = getService();
36141           if (service) {
36142               service.hideViewer();
36143           }
36144
36145           throttledRedraw.cancel();
36146
36147           layer
36148               .transition()
36149               .duration(250)
36150               .style('opacity', 0)
36151               .on('end', editOff);
36152       }
36153
36154
36155       function editOn() {
36156           layer.style('display', 'block');
36157       }
36158
36159
36160       function editOff() {
36161           layer.selectAll('.viewfield-group').remove();
36162           layer.style('display', 'none');
36163       }
36164
36165
36166       function click(d) {
36167           var service = getService();
36168           if (!service) return;
36169
36170           service
36171               .selectImage(d)
36172               .updateViewer(d)
36173               .showViewer();
36174
36175           context.map().centerEase(d.loc);
36176       }
36177
36178
36179       function mouseover(d) {
36180           var service = getService();
36181           if (service) service.setStyles(d);
36182       }
36183
36184
36185       function mouseout() {
36186           var service = getService();
36187           if (service) service.setStyles(null);
36188       }
36189
36190
36191       function transform(d) {
36192           var t = svgPointTransform(projection)(d);
36193           if (d.ca) {
36194               t += ' rotate(' + Math.floor(d.ca) + ',0,0)';
36195           }
36196           return t;
36197       }
36198
36199
36200       function update() {
36201           var viewer = select('#photoviewer');
36202           var selected = viewer.empty() ? undefined : viewer.datum();
36203
36204           var z = ~~context.map().zoom();
36205           var showMarkers = (z >= minMarkerZoom);
36206           var showViewfields = (z >= minViewfieldZoom);
36207
36208           var service = getService();
36209           var sequences = (service ? service.sequences(projection) : []);
36210           var images = (service && showMarkers ? service.images(projection) : []);
36211
36212           var traces = layer.selectAll('.sequences').selectAll('.sequence')
36213               .data(sequences, function(d) { return d.properties.key; });
36214
36215           // exit
36216           traces.exit()
36217               .remove();
36218
36219           // enter/update
36220           traces = traces.enter()
36221               .append('path')
36222               .attr('class', 'sequence')
36223               .merge(traces)
36224               .attr('d', svgPath(projection).geojson);
36225
36226
36227           var groups = layer.selectAll('.markers').selectAll('.viewfield-group')
36228               .data(images, function(d) { return d.key; });
36229
36230           // exit
36231           groups.exit()
36232               .remove();
36233
36234           // enter
36235           var groupsEnter = groups.enter()
36236               .append('g')
36237               .attr('class', 'viewfield-group')
36238               .on('mouseover', mouseover)
36239               .on('mouseout', mouseout)
36240               .on('click', click);
36241
36242           groupsEnter
36243               .append('g')
36244               .attr('class', 'viewfield-scale');
36245
36246           // update
36247           var markers = groups
36248               .merge(groupsEnter)
36249               .sort(function(a, b) {
36250                   return (a === selected) ? 1
36251                       : (b === selected) ? -1
36252                       : b.loc[1] - a.loc[1];  // sort Y
36253               })
36254               .attr('transform', transform)
36255               .select('.viewfield-scale');
36256
36257
36258           markers.selectAll('circle')
36259               .data([0])
36260               .enter()
36261               .append('circle')
36262               .attr('dx', '0')
36263               .attr('dy', '0')
36264               .attr('r', '6');
36265
36266           var viewfields = markers.selectAll('.viewfield')
36267               .data(showViewfields ? [0] : []);
36268
36269           viewfields.exit()
36270               .remove();
36271
36272           viewfields.enter()               // viewfields may or may not be drawn...
36273               .insert('path', 'circle')    // but if they are, draw below the circles
36274               .attr('class', 'viewfield')
36275               .attr('transform', 'scale(1.5,1.5),translate(-8, -13)')
36276               .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');
36277       }
36278
36279
36280       function drawImages(selection$$1) {
36281           var enabled = svgOpenstreetcamImages$$1.enabled,
36282               service = getService();
36283
36284           layer = selection$$1.selectAll('.layer-openstreetcam-images')
36285               .data(service ? [0] : []);
36286
36287           layer.exit()
36288               .remove();
36289
36290           var layerEnter = layer.enter()
36291               .append('g')
36292               .attr('class', 'layer-openstreetcam-images')
36293               .style('display', enabled ? 'block' : 'none');
36294
36295           layerEnter
36296               .append('g')
36297               .attr('class', 'sequences');
36298
36299           layerEnter
36300               .append('g')
36301               .attr('class', 'markers');
36302
36303           layer = layerEnter
36304               .merge(layer);
36305
36306           if (enabled) {
36307               if (service && ~~context.map().zoom() >= minZoom) {
36308                   editOn();
36309                   update();
36310                   service.loadImages(projection);
36311               } else {
36312                   editOff();
36313               }
36314           }
36315       }
36316
36317
36318       drawImages.enabled = function(_) {
36319           if (!arguments.length) return svgOpenstreetcamImages$$1.enabled;
36320           svgOpenstreetcamImages$$1.enabled = _;
36321           if (svgOpenstreetcamImages$$1.enabled) {
36322               showLayer();
36323           } else {
36324               hideLayer();
36325           }
36326           dispatch.call('change');
36327           return this;
36328       };
36329
36330
36331       drawImages.supported = function() {
36332           return !!getService();
36333       };
36334
36335
36336       init();
36337       return drawImages;
36338   }
36339
36340   function svgOsm(projection, context, dispatch) {
36341       var enabled = true;
36342
36343
36344       function drawOsm(selection) {
36345           selection.selectAll('.layer-osm')
36346               .data(['covered', 'areas', 'lines', 'points', 'labels'])
36347               .enter()
36348               .append('g')
36349               .attr('class', function(d) { return 'layer-osm ' + d; });
36350
36351           selection.selectAll('.layer-osm.points').selectAll('.points-group')
36352               .data(['points', 'midpoints', 'vertices', 'turns'])
36353               .enter()
36354               .append('g')
36355               .attr('class', function(d) { return 'points-group ' + d; });
36356       }
36357
36358
36359       function showLayer() {
36360           var layer = context.surface().selectAll('.data-layer.osm');
36361           layer.interrupt();
36362
36363           layer
36364               .classed('disabled', false)
36365               .style('opacity', 0)
36366               .transition()
36367               .duration(250)
36368               .style('opacity', 1)
36369               .on('end interrupt', function () {
36370                   dispatch.call('change');
36371               });
36372       }
36373
36374
36375       function hideLayer() {
36376           var layer = context.surface().selectAll('.data-layer.osm');
36377           layer.interrupt();
36378
36379           layer
36380               .transition()
36381               .duration(250)
36382               .style('opacity', 0)
36383               .on('end interrupt', function () {
36384                   layer.classed('disabled', true);
36385                   dispatch.call('change');
36386               });
36387       }
36388
36389
36390       drawOsm.enabled = function(_) {
36391           if (!arguments.length) return enabled;
36392           enabled = _;
36393
36394           if (enabled) {
36395               showLayer();
36396           } else {
36397               hideLayer();
36398           }
36399
36400           dispatch.call('change');
36401           return this;
36402       };
36403
36404
36405       return drawOsm;
36406   }
36407
36408   function svgNotes$$1(projection, context, dispatch$$1) {
36409       if (!dispatch$$1) { dispatch$$1 = dispatch('change'); }
36410       var throttledRedraw = throttle(function () { dispatch$$1.call('change'); }, 1000);
36411       var minZoom = 12;
36412       var layer = select(null);
36413       var _notes;
36414
36415       function markerPath(selection$$1, klass) {
36416           selection$$1
36417               .attr('class', klass)
36418               .attr('transform', 'translate(-8, -22)')
36419               .attr('d', 'm17.5,0l-15,0c-1.37,0 -2.5,1.12 -2.5,2.5l0,11.25c0,1.37 1.12,2.5 2.5,2.5l3.75,0l0,3.28c0,0.38 0.43,0.6 0.75,0.37l4.87,-3.65l5.62,0c1.37,0 2.5,-1.12 2.5,-2.5l0,-11.25c0,-1.37 -1.12,-2.5 -2.5,-2.5z');
36420       }
36421
36422       function init() {
36423           if (svgNotes$$1.initialized) return;  // run once
36424           svgNotes$$1.enabled = false;
36425           svgNotes$$1.initialized = true;
36426       }
36427
36428       function editOn() {
36429           layer.style('display', 'block');
36430       }
36431
36432
36433       function editOff() {
36434           layer.selectAll('.note').remove();
36435           layer.style('display', 'none');
36436       }
36437
36438
36439       function getService() {
36440           if (services.osm && !_notes) {
36441               _notes = services.osm;
36442               _notes.on('loadedNotes', throttledRedraw);
36443           } else if (!services.osm && _notes) {
36444               _notes = null;
36445           }
36446
36447           return _notes;
36448       }
36449
36450
36451       function showLayer() {
36452           editOn();
36453
36454           layer
36455               .classed('disabled', false)
36456               .style('opacity', 0)
36457               .transition()
36458               .duration(250)
36459               .style('opacity', 1)
36460               .on('end interrupt', function () {
36461                   dispatch$$1.call('change');
36462               });
36463       }
36464
36465
36466       function hideLayer() {
36467           editOff();
36468
36469           throttledRedraw.cancel();
36470           layer.interrupt();
36471
36472           layer
36473               .transition()
36474               .duration(250)
36475               .style('opacity', 0)
36476               .on('end interrupt', function () {
36477                   layer.classed('disabled', true);
36478                   dispatch$$1.call('change');
36479               });
36480
36481       }
36482
36483
36484       function update() {
36485           var service = getService();
36486           var selectedID = context.selectedNoteID();
36487           var data = (service ? service.notes(projection) : []);
36488           var transform = svgPointTransform(projection);
36489           var notes = layer.selectAll('.note')
36490               .data(data, function(d) { return d.status + d.id; });
36491
36492           // exit
36493           notes.exit()
36494               .remove();
36495
36496           // enter
36497           var notesEnter = notes.enter()
36498               .append('g')
36499               .attr('class', function(d) { return 'note note-' + d.id + ' ' + d.status; })
36500               .classed('new', function(d) { return d.id < 0; });
36501
36502           notesEnter
36503               .append('ellipse')
36504               .attr('cx', 0.5)
36505               .attr('cy', 1)
36506               .attr('rx', 6.5)
36507               .attr('ry', 3)
36508               .attr('class', 'stroke');
36509
36510           notesEnter
36511               .append('path')
36512               .call(markerPath, 'shadow');
36513
36514           notesEnter
36515               .append('use')
36516               .attr('class', 'note-fill')
36517               .attr('width', '20px')
36518               .attr('height', '20px')
36519               .attr('x', '-8px')
36520               .attr('y', '-22px')
36521               .attr('xlink:href', '#iD-icon-note');
36522
36523           notesEnter.selectAll('.note-annotation')
36524               .data(function(d) { return [d]; })
36525               .enter()
36526               .append('use')
36527               .attr('class', 'note-annotation')
36528               .attr('width', '10px')
36529               .attr('height', '10px')
36530               .attr('x', '-3px')
36531               .attr('y', '-19px')
36532               .attr('xlink:href', function(d) {
36533                   return '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
36534               });
36535
36536           // update
36537           notes
36538               .merge(notesEnter)
36539               .sort(function(a, b) {
36540                   return (a.id === selectedID) ? 1
36541                       : (b.id === selectedID) ? -1
36542                       : b.loc[1] - a.loc[1];  // sort Y
36543               })
36544               .classed('selected', function(d) { return d.id === selectedID; })
36545               .attr('transform', transform);
36546       }
36547
36548
36549       function drawNotes(selection$$1) {
36550           var enabled = svgNotes$$1.enabled;
36551           var service = getService();
36552
36553           layer = selection$$1.selectAll('.layer-notes')
36554               .data(service ? [0] : []);
36555
36556           layer.exit()
36557               .remove();
36558
36559           layer.enter()
36560               .append('g')
36561               .attr('class', 'layer-notes')
36562               .style('display', enabled ? 'block' : 'none')
36563               .merge(layer);
36564
36565           function dimensions() {
36566               return [window.innerWidth, window.innerHeight];
36567           }
36568
36569           if (enabled) {
36570               if (service && ~~context.map().zoom() >= minZoom) {
36571                   editOn();
36572                   service.loadNotes(projection, dimensions());
36573                   update();
36574               } else {
36575                   editOff();
36576               }
36577           }
36578       }
36579
36580       drawNotes.enabled = function(val) {
36581           if (!arguments.length) return svgNotes$$1.enabled;
36582
36583           svgNotes$$1.enabled = val;
36584           if (svgNotes$$1.enabled) {
36585               showLayer();
36586           } else {
36587               hideLayer();
36588               if (context.selectedNoteID()) {
36589                   context.enter(modeBrowse(context));
36590               }
36591           }
36592
36593           dispatch$$1.call('change');
36594           return this;
36595       };
36596
36597       init();
36598       return drawNotes;
36599   }
36600
36601   function svgTouch() {
36602
36603       function drawTouch(selection) {
36604           selection.selectAll('.layer-touch')
36605               .data(['areas', 'lines', 'points', 'turns', 'notes'])
36606               .enter()
36607               .append('g')
36608               .attr('class', function(d) { return 'layer-touch ' + d; });
36609       }
36610
36611       return drawTouch;
36612   }
36613
36614   function svgLayers(projection, context) {
36615       var dispatch$$1 = dispatch('change');
36616       var svg = select(null);
36617       var layers = [
36618           { id: 'osm', layer: svgOsm(projection, context, dispatch$$1) },
36619           { id: 'notes', layer: svgNotes$$1(projection, context, dispatch$$1) },
36620           { id: 'data', layer: svgData$$1(projection, context, dispatch$$1) },
36621           { id: 'streetside', layer: svgStreetside$$1(projection, context, dispatch$$1)},
36622           { id: 'mapillary-images', layer: svgMapillaryImages$$1(projection, context, dispatch$$1) },
36623           { id: 'mapillary-signs',  layer: svgMapillarySigns$$1(projection, context, dispatch$$1) },
36624           { id: 'openstreetcam-images', layer: svgOpenstreetcamImages$$1(projection, context, dispatch$$1) },
36625           { id: 'debug', layer: svgDebug$$1(projection, context, dispatch$$1) },
36626           { id: 'touch', layer: svgTouch(projection, context, dispatch$$1) }
36627       ];
36628
36629
36630       function drawLayers(selection$$1) {
36631           svg = selection$$1.selectAll('.surface')
36632               .data([0]);
36633
36634           svg = svg.enter()
36635               .append('svg')
36636               .attr('class', 'surface')
36637               .merge(svg);
36638
36639           var defs = svg.selectAll('.surface-defs')
36640               .data([0]);
36641
36642           defs.enter()
36643               .append('defs')
36644               .attr('class', 'surface-defs');
36645
36646           var groups = svg.selectAll('.data-layer')
36647               .data(layers);
36648
36649           groups.exit()
36650               .remove();
36651
36652           groups.enter()
36653               .append('g')
36654               .attr('class', function(d) { return 'data-layer ' + d.id; })
36655               .merge(groups)
36656               .each(function(d) { select(this).call(d.layer); });
36657       }
36658
36659
36660       drawLayers.all = function() {
36661           return layers;
36662       };
36663
36664
36665       drawLayers.layer = function(id) {
36666           var obj = find$1(layers, function(o) {return o.id === id;});
36667           return obj && obj.layer;
36668       };
36669
36670
36671       drawLayers.only = function(what) {
36672           var arr = [].concat(what);
36673           drawLayers.remove(difference(map$3(layers, 'id'), arr));
36674           return this;
36675       };
36676
36677
36678       drawLayers.remove = function(what) {
36679           var arr = [].concat(what);
36680           arr.forEach(function(id) {
36681               layers = reject(layers, function(o) {return o.id === id;});
36682           });
36683           dispatch$$1.call('change');
36684           return this;
36685       };
36686
36687
36688       drawLayers.add = function(what) {
36689           var arr = [].concat(what);
36690           arr.forEach(function(obj) {
36691               if ('id' in obj && 'layer' in obj) {
36692                   layers.push(obj);
36693               }
36694           });
36695           dispatch$$1.call('change');
36696           return this;
36697       };
36698
36699
36700       drawLayers.dimensions = function(_) {
36701           if (!arguments.length) return utilGetDimensions(svg);
36702           utilSetDimensions(svg, _);
36703           return this;
36704       };
36705
36706
36707       return utilRebind(drawLayers, dispatch$$1, 'on');
36708   }
36709
36710   function svgLines$$1(projection, context) {
36711       var detected = utilDetect();
36712
36713       var highway_stack = {
36714           motorway: 0,
36715           motorway_link: 1,
36716           trunk: 2,
36717           trunk_link: 3,
36718           primary: 4,
36719           primary_link: 5,
36720           secondary: 6,
36721           tertiary: 7,
36722           unclassified: 8,
36723           residential: 9,
36724           service: 10,
36725           footway: 11
36726       };
36727
36728
36729       function drawTargets(selection, graph, entities, filter$$1) {
36730           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
36731           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
36732           var getPath = svgPath(projection).geojson;
36733           var activeID = context.activeID();
36734
36735           // The targets and nopes will be MultiLineString sub-segments of the ways
36736           var data = { targets: [], nopes: [] };
36737
36738           entities.forEach(function(way) {
36739               var features = svgSegmentWay(way, graph, activeID);
36740               data.targets.push.apply(data.targets, features.passive);
36741               data.nopes.push.apply(data.nopes, features.active);
36742           });
36743
36744
36745           // Targets allow hover and vertex snapping
36746           var targetData = data.targets.filter(getPath);
36747           var targets = selection.selectAll('.line.target-allowed')
36748               .filter(function(d) { return filter$$1(d.properties.entity); })
36749               .data(targetData, function key(d) { return d.id; });
36750
36751           // exit
36752           targets.exit()
36753               .remove();
36754
36755           // enter/update
36756           targets.enter()
36757               .append('path')
36758               .merge(targets)
36759               .attr('d', getPath)
36760               .attr('class', function(d) { return 'way line target target-allowed ' + targetClass + d.id; });
36761
36762
36763           // NOPE
36764           var nopeData = data.nopes.filter(getPath);
36765           var nopes = selection.selectAll('.line.target-nope')
36766               .filter(function(d) { return filter$$1(d.properties.entity); })
36767               .data(nopeData, function key(d) { return d.id; });
36768
36769           // exit
36770           nopes.exit()
36771               .remove();
36772
36773           // enter/update
36774           nopes.enter()
36775               .append('path')
36776               .merge(nopes)
36777               .attr('d', getPath)
36778               .attr('class', function(d) { return 'way line target target-nope ' + nopeClass + d.id; });
36779       }
36780
36781
36782       function drawLines(selection, graph, entities, filter$$1) {
36783
36784           function waystack(a, b) {
36785               var selected = context.selectedIDs();
36786               var scoreA = selected.indexOf(a.id) !== -1 ? 20 : 0;
36787               var scoreB = selected.indexOf(b.id) !== -1 ? 20 : 0;
36788
36789               if (a.tags.highway) { scoreA -= highway_stack[a.tags.highway]; }
36790               if (b.tags.highway) { scoreB -= highway_stack[b.tags.highway]; }
36791               return scoreA - scoreB;
36792           }
36793
36794
36795           function drawLineGroup(selection, klass, isSelected) {
36796               // Note: Don't add `.selected` class in draw modes
36797               var mode = context.mode();
36798               var isDrawing = mode && /^draw/.test(mode.id);
36799               var selectedClass = (!isDrawing && isSelected) ? 'selected ' : '';
36800
36801               var lines = selection
36802                   .selectAll('path')
36803                   .filter(filter$$1)
36804                   .data(getPathData(isSelected), osmEntity$$1.key);
36805
36806               lines.exit()
36807                   .remove();
36808
36809               // Optimization: Call expensive TagClasses only on enter selection. This
36810               // works because osmEntity.key is defined to include the entity v attribute.
36811               lines.enter()
36812                   .append('path')
36813                   .attr('class', function(d) {
36814                       var oldMPClass = oldMultiPolygonOuters[d.id] ? 'old-multipolygon ' : '';
36815                       return 'way line ' + klass + ' ' + selectedClass + oldMPClass + d.id;
36816                   })
36817                   .call(svgTagClasses())
36818                   .merge(lines)
36819                   .sort(waystack)
36820                   .attr('d', getPath)
36821                   .call(svgTagClasses().tags(svgRelationMemberTags(graph)));
36822
36823               return selection;
36824           }
36825
36826
36827           function getPathData(isSelected) {
36828               return function() {
36829                   var layer = this.parentNode.__data__;
36830                   var data = pathdata[layer] || [];
36831                   return data.filter(function(d) {
36832                       if (isSelected)
36833                           return context.selectedIDs().indexOf(d.id) !== -1;
36834                       else
36835                           return context.selectedIDs().indexOf(d.id) === -1;
36836                   });
36837               };
36838           }
36839
36840           function addMarkers(layergroup, pathclass, groupclass, groupdata, marker) {
36841               var markergroup = layergroup
36842                   .selectAll('g.' + groupclass)
36843                   .data([pathclass]);
36844
36845               markergroup = markergroup.enter()
36846                   .append('g')
36847                   .attr('class', groupclass)
36848                   .merge(markergroup);
36849
36850               var markers = markergroup
36851                   .selectAll('path')
36852                   .filter(filter$$1)
36853                   .data(
36854                       function data() { return groupdata[this.parentNode.__data__] || []; },
36855                       function key(d) { return [d.id, d.index]; }
36856                   );
36857
36858               markers.exit()
36859                   .remove();
36860
36861               markers = markers.enter()
36862                   .append('path')
36863                   .attr('class', pathclass)
36864                   .attr('marker-mid', marker)
36865                   .merge(markers)
36866                   .attr('d', function(d) { return d.d; });
36867
36868               if (detected.ie) {
36869                   markers.each(function() { this.parentNode.insertBefore(this, this); });
36870               }
36871           }
36872
36873
36874           var getPath = svgPath(projection, graph);
36875           var ways = [];
36876           var pathdata = {};
36877           var onewaydata = {};
36878           var sideddata = {};
36879           var oldMultiPolygonOuters = {};
36880
36881           for (var i = 0; i < entities.length; i++) {
36882               var entity = entities[i];
36883               var outer = osmSimpleMultipolygonOuterMember(entity, graph);
36884               if (outer) {
36885                   ways.push(entity.mergeTags(outer.tags));
36886                   oldMultiPolygonOuters[outer.id] = true;
36887               } else if (entity.geometry(graph) === 'line') {
36888                   ways.push(entity);
36889               }
36890           }
36891
36892           ways = ways.filter(getPath);
36893           pathdata = groupBy(ways, function(way) { return way.layer(); });
36894
36895           forOwn(pathdata, function(v, k) {
36896               var onewayArr = filter(v, function(d) { return d.isOneWay(); });
36897               var onewaySegments = svgMarkerSegments(
36898                   projection, graph, 35,
36899                   function shouldReverse(entity) { return entity.tags.oneway === '-1'; },
36900                   function bothDirections(entity) {
36901                       return entity.tags.oneway === 'reversible' || entity.tags.oneway === 'alternating';
36902                   });
36903               onewaydata[k] = flatten(map$3(onewayArr, onewaySegments));
36904
36905               var sidedArr = filter(v, function(d) { return d.isSided(); });
36906               var sidedSegments = svgMarkerSegments(
36907                   projection, graph, 30,
36908                   function shouldReverse() { return false; },
36909                   function bothDirections() { return false; });
36910               sideddata[k] = flatten(map$3(sidedArr, sidedSegments));
36911           });
36912
36913
36914           var covered = selection.selectAll('.layer-osm.covered');     // under areas
36915           var uncovered = selection.selectAll('.layer-osm.lines');     // over areas
36916           var touchLayer = selection.selectAll('.layer-touch.lines');
36917
36918           // Draw lines..
36919           [covered, uncovered].forEach(function(selection) {
36920               var range$$1 = (selection === covered ? range(-10,0) : range(0,11));
36921               var layergroup = selection
36922                   .selectAll('g.layergroup')
36923                   .data(range$$1);
36924
36925               layergroup = layergroup.enter()
36926                   .append('g')
36927                   .attr('class', function(d) { return 'layergroup layer' + String(d); })
36928                   .merge(layergroup);
36929
36930               layergroup
36931                   .selectAll('g.linegroup')
36932                   .data(['shadow', 'casing', 'stroke', 'shadow-highlighted', 'casing-highlighted', 'stroke-highlighted'])
36933                   .enter()
36934                   .append('g')
36935                   .attr('class', function(d) { return 'linegroup line-' + d; });
36936
36937               layergroup.selectAll('g.line-shadow')
36938                   .call(drawLineGroup, 'shadow', false);
36939               layergroup.selectAll('g.line-casing')
36940                   .call(drawLineGroup, 'casing', false);
36941               layergroup.selectAll('g.line-stroke')
36942                   .call(drawLineGroup, 'stroke', false);
36943
36944               layergroup.selectAll('g.line-shadow-highlighted')
36945                   .call(drawLineGroup, 'shadow', true);
36946               layergroup.selectAll('g.line-casing-highlighted')
36947                   .call(drawLineGroup, 'casing', true);
36948               layergroup.selectAll('g.line-stroke-highlighted')
36949                   .call(drawLineGroup, 'stroke', true);
36950
36951               addMarkers(layergroup, 'oneway', 'onewaygroup', onewaydata, 'url(#oneway-marker)');
36952               addMarkers(layergroup, 'sided', 'sidedgroup', sideddata,
36953                          function marker(d) {
36954                              var category = graph.entity(d.id).sidednessIdentifier();
36955                              return 'url(#sided-marker-' + category + ')';
36956                          });
36957           });
36958
36959           // Draw touch targets..
36960           touchLayer
36961               .call(drawTargets, graph, ways, filter$$1);
36962       }
36963
36964
36965       return drawLines;
36966   }
36967
36968   function svgMidpoints$$1(projection, context) {
36969       var targetRadius = 8;
36970
36971       function drawTargets(selection, graph, entities, filter) {
36972           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
36973           var getTransform = svgPointTransform(projection).geojson;
36974
36975           var data = entities.map(function(midpoint) {
36976               return {
36977                   type: 'Feature',
36978                   id: midpoint.id,
36979                   properties: {
36980                       target: true,
36981                       entity: midpoint
36982                   },
36983                   geometry: {
36984                       type: 'Point',
36985                       coordinates: midpoint.loc
36986                   }
36987               };
36988           });
36989
36990           var targets = selection.selectAll('.midpoint.target')
36991               .filter(function(d) { return filter(d.properties.entity); })
36992               .data(data, function key(d) { return d.id; });
36993
36994           // exit
36995           targets.exit()
36996               .remove();
36997
36998           // enter/update
36999           targets.enter()
37000               .append('circle')
37001               .attr('r', targetRadius)
37002               .merge(targets)
37003               .attr('class', function(d) { return 'node midpoint target ' + fillClass + d.id; })
37004               .attr('transform', getTransform);
37005       }
37006
37007
37008       function drawMidpoints(selection, graph, entities, filter, extent) {
37009           var drawLayer = selection.selectAll('.layer-osm.points .points-group.midpoints');
37010           var touchLayer = selection.selectAll('.layer-touch.points');
37011
37012           var mode = context.mode();
37013           if (mode && mode.id !== 'select') {
37014               drawLayer.selectAll('.midpoint').remove();
37015               touchLayer.selectAll('.midpoint.target').remove();
37016               return;
37017           }
37018
37019           var poly = extent.polygon();
37020           var midpoints = {};
37021
37022           for (var i = 0; i < entities.length; i++) {
37023               var entity = entities[i];
37024
37025               if (entity.type !== 'way') continue;
37026               if (!filter(entity)) continue;
37027               if (context.selectedIDs().indexOf(entity.id) < 0) continue;
37028
37029               var nodes = graph.childNodes(entity);
37030               for (var j = 0; j < nodes.length - 1; j++) {
37031                   var a = nodes[j];
37032                   var b = nodes[j + 1];
37033                   var id = [a.id, b.id].sort().join('-');
37034
37035                   if (midpoints[id]) {
37036                       midpoints[id].parents.push(entity);
37037                   } else if (geoVecLength(projection(a.loc), projection(b.loc)) > 40) {
37038                       var point = geoVecInterp(a.loc, b.loc, 0.5);
37039                       var loc = null;
37040
37041                       if (extent.intersects(point)) {
37042                           loc = point;
37043                       } else {
37044                           for (var k = 0; k < 4; k++) {
37045                               point = geoLineIntersection([a.loc, b.loc], [poly[k], poly[k + 1]]);
37046                               if (point &&
37047                                   geoVecLength(projection(a.loc), projection(point)) > 20 &&
37048                                   geoVecLength(projection(b.loc), projection(point)) > 20)
37049                               {
37050                                   loc = point;
37051                                   break;
37052                               }
37053                           }
37054                       }
37055
37056                       if (loc) {
37057                           midpoints[id] = {
37058                               type: 'midpoint',
37059                               id: id,
37060                               loc: loc,
37061                               edge: [a.id, b.id],
37062                               parents: [entity]
37063                           };
37064                       }
37065                   }
37066               }
37067           }
37068
37069
37070           function midpointFilter(d) {
37071               if (midpoints[d.id])
37072                   return true;
37073
37074               for (var i = 0; i < d.parents.length; i++) {
37075                   if (filter(d.parents[i])) {
37076                       return true;
37077                   }
37078               }
37079
37080               return false;
37081           }
37082
37083
37084           var groups = drawLayer.selectAll('.midpoint')
37085               .filter(midpointFilter)
37086               .data(values$1(midpoints), function(d) { return d.id; });
37087
37088           groups.exit()
37089               .remove();
37090
37091           var enter = groups.enter()
37092               .insert('g', ':first-child')
37093               .attr('class', 'midpoint');
37094
37095           enter
37096               .append('polygon')
37097               .attr('points', '-6,8 10,0 -6,-8')
37098               .attr('class', 'shadow');
37099
37100           enter
37101               .append('polygon')
37102               .attr('points', '-3,4 5,0 -3,-4')
37103               .attr('class', 'fill');
37104
37105           groups = groups
37106               .merge(enter)
37107               .attr('transform', function(d) {
37108                   var translate = svgPointTransform(projection);
37109                   var a = graph.entity(d.edge[0]);
37110                   var b = graph.entity(d.edge[1]);
37111                   var angle = geoAngle(a, b, projection) * (180 / Math.PI);
37112                   return translate(d) + ' rotate(' + angle + ')';
37113               })
37114               .call(svgTagClasses().tags(
37115                   function(d) { return d.parents[0].tags; }
37116               ));
37117
37118           // Propagate data bindings.
37119           groups.select('polygon.shadow');
37120           groups.select('polygon.fill');
37121
37122
37123           // Draw touch targets..
37124           touchLayer
37125               .call(drawTargets, graph, values$1(midpoints), midpointFilter);
37126       }
37127
37128       return drawMidpoints;
37129   }
37130
37131   // Touch targets control which other vertices we can drag a vertex onto.
37132   //
37133   // - the activeID - nope
37134   // - 1 away (adjacent) to the activeID - yes (vertices will be merged)
37135   // - 2 away from the activeID - nope (would create a self intersecting segment)
37136   // - all others on a linear way - yes
37137   // - all others on a closed way - nope (would create a self intersecting polygon)
37138   //
37139   // returns
37140   // 0 = active vertex - no touch/connect
37141   // 1 = passive vertex - yes touch/connect
37142   // 2 = adjacent vertex - yes but pay attention segmenting a line here
37143   //
37144   function svgPassiveVertex(node, graph, activeID) {
37145       if (!activeID) return 1;
37146       if (activeID === node.id) return 0;
37147
37148       var parents = graph.parentWays(node);
37149
37150       for (var i = 0; i < parents.length; i++) {
37151           var nodes = parents[i].nodes;
37152           var isClosed = parents[i].isClosed();
37153           for (var j = 0; j < nodes.length; j++) {   // find this vertex, look nearby
37154               if (nodes[j] === node.id) {
37155                   var ix1 = j - 2;
37156                   var ix2 = j - 1;
37157                   var ix3 = j + 1;
37158                   var ix4 = j + 2;
37159
37160                   if (isClosed) {  // wraparound if needed
37161                       var max = nodes.length - 1;
37162                       if (ix1 < 0)   ix1 = max + ix1;
37163                       if (ix2 < 0)   ix2 = max + ix2;
37164                       if (ix3 > max) ix3 = ix3 - max;
37165                       if (ix4 > max) ix4 = ix4 - max;
37166                   }
37167
37168                   if (nodes[ix1] === activeID) return 0;        // no - prevent self intersect
37169                   else if (nodes[ix2] === activeID) return 2;   // ok - adjacent
37170                   else if (nodes[ix3] === activeID) return 2;   // ok - adjacent
37171                   else if (nodes[ix4] === activeID) return 0;   // no - prevent self intersect
37172                   else if (isClosed && nodes.indexOf(activeID) !== -1) return 0;  // no - prevent self intersect
37173               }
37174           }
37175       }
37176
37177       return 1;   // ok
37178   }
37179
37180
37181   function svgMarkerSegments(projection$$1, graph, dt,
37182                                     shouldReverse,
37183                                     bothDirections) {
37184       return function(entity) {
37185           var i = 0;
37186           var offset = dt;
37187           var segments = [];
37188           var clip = d3_geoIdentity().clipExtent(projection$$1.clipExtent()).stream;
37189           var coordinates = graph.childNodes(entity).map(function(n) { return n.loc; });
37190           var a, b;
37191
37192           if (shouldReverse(entity)) {
37193               coordinates.reverse();
37194           }
37195
37196           geoStream({
37197               type: 'LineString',
37198               coordinates: coordinates
37199           }, projection$$1.stream(clip({
37200               lineStart: function() {},
37201               lineEnd: function() { a = null; },
37202               point: function(x, y) {
37203                   b = [x, y];
37204
37205                   if (a) {
37206                       var span = geoVecLength(a, b) - offset;
37207
37208                       if (span >= 0) {
37209                           var heading = geoVecAngle(a, b);
37210                           var dx = dt * Math.cos(heading);
37211                           var dy = dt * Math.sin(heading);
37212                           var p = [
37213                               a[0] + offset * Math.cos(heading),
37214                               a[1] + offset * Math.sin(heading)
37215                           ];
37216
37217                           // gather coordinates
37218                           var coord = [a, p];
37219                           for (span -= dt; span >= 0; span -= dt) {
37220                               p = geoVecAdd(p, [dx, dy]);
37221                               coord.push(p);
37222                           }
37223                           coord.push(b);
37224
37225                           // generate svg paths
37226                           var segment = '';
37227                           var j;
37228
37229                           for (j = 0; j < coord.length; j++) {
37230                               segment += (j === 0 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37231                           }
37232                           segments.push({ id: entity.id, index: i++, d: segment });
37233
37234                           if (bothDirections(entity)) {
37235                               segment = '';
37236                               for (j = coord.length - 1; j >= 0; j--) {
37237                                   segment += (j === coord.length - 1 ? 'M' : 'L') + coord[j][0] + ',' + coord[j][1];
37238                               }
37239                               segments.push({ id: entity.id, index: i++, d: segment });
37240                           }
37241                       }
37242
37243                       offset = -span;
37244                   }
37245
37246                   a = b;
37247               }
37248           })));
37249
37250           return segments;
37251       };
37252   }
37253
37254
37255   function svgPath(projection$$1, graph, isArea) {
37256
37257       // Explanation of magic numbers:
37258       // "padding" here allows space for strokes to extend beyond the viewport,
37259       // so that the stroke isn't drawn along the edge of the viewport when
37260       // the shape is clipped.
37261       //
37262       // When drawing lines, pad viewport by 5px.
37263       // When drawing areas, pad viewport by 65px in each direction to allow
37264       // for 60px area fill stroke (see ".fill-partial path.fill" css rule)
37265
37266       var cache = {};
37267       var padding = isArea ? 65 : 5;
37268       var viewport = projection$$1.clipExtent();
37269       var paddedExtent = [
37270           [viewport[0][0] - padding, viewport[0][1] - padding],
37271           [viewport[1][0] + padding, viewport[1][1] + padding]
37272       ];
37273       var clip = d3_geoIdentity().clipExtent(paddedExtent).stream;
37274       var project = projection$$1.stream;
37275       var path = d3_geoPath()
37276           .projection({stream: function(output) { return project(clip(output)); }});
37277
37278       var svgpath = function(entity) {
37279           if (entity.id in cache) {
37280               return cache[entity.id];
37281           } else {
37282               return cache[entity.id] = path(entity.asGeoJSON(graph));
37283           }
37284       };
37285
37286       svgpath.geojson = function(d) {
37287           if (d.__featurehash__ !== undefined) {
37288               if (d.__featurehash__ in cache) {
37289                   return cache[d.__featurehash__];
37290               } else {
37291                   return cache[d.__featurehash__] = path(d);
37292               }
37293           } else {
37294               return path(d);
37295           }
37296       };
37297
37298       return svgpath;
37299   }
37300
37301
37302   function svgPointTransform(projection$$1) {
37303       var svgpoint = function(entity) {
37304           // http://jsperf.com/short-array-join
37305           var pt = projection$$1(entity.loc);
37306           return 'translate(' + pt[0] + ',' + pt[1] + ')';
37307       };
37308
37309       svgpoint.geojson = function(d) {
37310           return svgpoint(d.properties.entity);
37311       };
37312
37313       return svgpoint;
37314   }
37315
37316
37317   function svgRelationMemberTags(graph) {
37318       return function(entity) {
37319           var tags = entity.tags;
37320           graph.parentRelations(entity).forEach(function(relation) {
37321               var type = relation.tags.type;
37322               if (type === 'multipolygon' || type === 'boundary') {
37323                   tags = assignIn({}, relation.tags, tags);
37324               }
37325           });
37326           return tags;
37327       };
37328   }
37329
37330
37331   function svgSegmentWay(way, graph, activeID) {
37332       // When there is no activeID, we can memoize this expensive computation
37333       if (activeID === undefined) {
37334           return graph.transient(way, 'waySegments', getWaySegments);
37335       } else {
37336           return getWaySegments();
37337       }
37338
37339       function getWaySegments() {
37340           var isActiveWay = (way.nodes.indexOf(activeID) !== -1);
37341           var features = { passive: [], active: [] };
37342           var start = {};
37343           var end = {};
37344           var node, type;
37345
37346           for (var i = 0; i < way.nodes.length; i++) {
37347               node = graph.entity(way.nodes[i]);
37348               type = svgPassiveVertex(node, graph, activeID);
37349               end = { node: node, type: type };
37350
37351               if (start.type !== undefined) {
37352                   if (start.node.id === activeID || end.node.id === activeID) ; else if (isActiveWay && (start.type === 2 || end.type === 2)) {   // one adjacent vertex
37353                       pushActive(start, end, i);
37354                   } else if (start.type === 0 && end.type === 0) {   // both active vertices
37355                       pushActive(start, end, i);
37356                   } else {
37357                       pushPassive(start, end, i);
37358                   }
37359               }
37360
37361               start = end;
37362           }
37363
37364           return features;
37365
37366           function pushActive(start, end, index) {
37367               features.active.push({
37368                   type: 'Feature',
37369                   id: way.id + '-' + index + '-nope',
37370                   properties: {
37371                       nope: true,
37372                       target: true,
37373                       entity: way,
37374                       nodes: [start.node, end.node],
37375                       index: index
37376                   },
37377                   geometry: {
37378                       type: 'LineString',
37379                       coordinates: [start.node.loc, end.node.loc]
37380                   }
37381               });
37382           }
37383
37384           function pushPassive(start, end, index) {
37385               features.passive.push({
37386                   type: 'Feature',
37387                   id: way.id + '-' + index,
37388                   properties: {
37389                       target: true,
37390                       entity: way,
37391                       nodes: [start.node, end.node],
37392                       index: index
37393                   },
37394                   geometry: {
37395                       type: 'LineString',
37396                       coordinates: [start.node.loc, end.node.loc]
37397                   }
37398               });
37399           }
37400       }
37401   }
37402
37403   function svgPoints$$1(projection, context) {
37404
37405       function markerPath(selection, klass) {
37406           selection
37407               .attr('class', klass)
37408               .attr('transform', 'translate(-8, -23)')
37409               .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');
37410       }
37411
37412       function sortY(a, b) {
37413           return b.loc[1] - a.loc[1];
37414       }
37415
37416
37417       // Avoid exit/enter if we're just moving stuff around.
37418       // The node will get a new version but we only need to run the update selection.
37419       function fastEntityKey(d) {
37420           var mode = context.mode();
37421           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
37422           return isMoving ? d.id : osmEntity$$1.key(d);
37423       }
37424
37425
37426       function drawTargets(selection, graph, entities, filter) {
37427           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37428           var getTransform = svgPointTransform(projection).geojson;
37429           var activeID = context.activeID();
37430           var data = [];
37431
37432           entities.forEach(function(node) {
37433               if (activeID === node.id) return;   // draw no target on the activeID
37434
37435               data.push({
37436                   type: 'Feature',
37437                   id: node.id,
37438                   properties: {
37439                       target: true,
37440                       entity: node
37441                   },
37442                   geometry: node.asGeoJSON()
37443               });
37444           });
37445
37446           var targets = selection.selectAll('.point.target')
37447               .filter(function(d) { return filter(d.properties.entity); })
37448               .data(data, function key(d) { return d.id; });
37449
37450           // exit
37451           targets.exit()
37452               .remove();
37453
37454           // enter/update
37455           targets.enter()
37456               .append('rect')
37457               .attr('x', -10)
37458               .attr('y', -26)
37459               .attr('width', 20)
37460               .attr('height', 30)
37461               .merge(targets)
37462               .attr('class', function(d) { return 'node point target ' + fillClass + d.id; })
37463               .attr('transform', getTransform);
37464       }
37465
37466
37467       function drawPoints(selection, graph, entities, filter) {
37468           var wireframe = context.surface().classed('fill-wireframe');
37469           var zoom = geoScaleToZoom(projection.scale());
37470
37471           // Points with a direction will render as vertices at higher zooms..
37472           function renderAsPoint(entity) {
37473               return entity.geometry(graph) === 'point' &&
37474                   !(zoom >= 18 && entity.directions(graph, projection).length);
37475           }
37476
37477           // All points will render as vertices in wireframe mode too..
37478           var points = wireframe ? [] : entities.filter(renderAsPoint);
37479           points.sort(sortY);
37480
37481
37482           var drawLayer = selection.selectAll('.layer-osm.points .points-group.points');
37483           var touchLayer = selection.selectAll('.layer-touch.points');
37484
37485           // Draw points..
37486           var groups = drawLayer.selectAll('g.point')
37487               .filter(filter)
37488               .data(points, fastEntityKey);
37489
37490           groups.exit()
37491               .remove();
37492
37493           var enter = groups.enter()
37494               .append('g')
37495               .attr('class', function(d) { return 'node point ' + d.id; })
37496               .order();
37497
37498           enter
37499               .append('path')
37500               .call(markerPath, 'shadow');
37501
37502           enter
37503               .append('ellipse')
37504               .attr('cx', 0.5)
37505               .attr('cy', 1)
37506               .attr('rx', 6.5)
37507               .attr('ry', 3)
37508               .attr('class', 'stroke');
37509
37510           enter
37511               .append('path')
37512               .call(markerPath, 'stroke');
37513
37514           enter
37515               .append('use')
37516               .attr('transform', 'translate(-5, -19)')
37517               .attr('class', 'icon')
37518               .attr('width', '11px')
37519               .attr('height', '11px');
37520
37521           groups = groups
37522               .merge(enter)
37523               .attr('transform', svgPointTransform(projection))
37524               .call(svgTagClasses());
37525
37526           // Selecting the following implicitly
37527           // sets the data (point entity) on the element
37528           groups.select('.shadow');
37529           groups.select('.stroke');
37530           groups.select('.icon')
37531               .attr('xlink:href', function(entity) {
37532                   var preset = context.presets().match(entity, graph);
37533                   var picon = preset && preset.icon;
37534
37535                   if (!picon) {
37536                       return '';
37537                   } else {
37538                       var isMaki = /^maki-/.test(picon);
37539                       return '#' + picon + (isMaki ? '-11' : '');
37540                   }
37541               });
37542
37543
37544           // Draw touch targets..
37545           touchLayer
37546               .call(drawTargets, graph, points, filter);
37547       }
37548
37549
37550       return drawPoints;
37551   }
37552
37553   function svgTagClasses() {
37554       var primaries = [
37555           'building', 'highway', 'railway', 'waterway', 'aeroway',
37556           'motorway', 'boundary', 'power', 'amenity', 'natural', 'landuse',
37557           'leisure', 'military', 'place', 'man_made', 'route', 'attraction'
37558       ];
37559       var statuses = [
37560           'proposed', 'construction', 'disused', 'abandoned', 'dismantled',
37561           'razed', 'demolished', 'obliterated', 'intermittent'
37562       ];
37563       var secondaries = [
37564           'oneway', 'bridge', 'tunnel', 'embankment', 'cutting', 'barrier',
37565           'surface', 'tracktype', 'footway', 'crossing', 'service', 'sport',
37566           'public_transport', 'location', 'parking'
37567       ];
37568       var tagClassRe = /^tag-/;
37569       var _tags = function(entity) { return entity.tags; };
37570
37571
37572       var tagClasses = function(selection$$1) {
37573           selection$$1.each(function tagClassesEach(entity) {
37574               var value = this.className;
37575               var classes, primary, status;
37576
37577               if (value.baseVal !== undefined) value = value.baseVal;
37578
37579               classes = value.trim().split(/\s+/).filter(function(name) {
37580                   return name.length && !tagClassRe.test(name);
37581               }).join(' ');
37582
37583               var t = _tags(entity), i, k, v;
37584
37585               // pick at most one primary classification tag..
37586               for (i = 0; i < primaries.length; i++) {
37587                   k = primaries[i];
37588                   v = t[k];
37589                   if (!v || v === 'no') continue;
37590
37591                   primary = k;
37592                   if (statuses.indexOf(v) !== -1) {   // e.g. `railway=abandoned`
37593                       status = v;
37594                       classes += ' tag-' + k;
37595                   } else {
37596                       classes += ' tag-' + k + ' tag-' + k + '-' + v;
37597                   }
37598
37599                   break;
37600               }
37601
37602               // add at most one status tag, only if relates to primary tag..
37603               if (!status) {
37604                   for (i = 0; i < statuses.length; i++) {
37605                       k = statuses[i];
37606                       v = t[k];
37607                       if (!v || v === 'no') continue;
37608
37609                       if (v === 'yes') {   // e.g. `railway=rail + abandoned=yes`
37610                           status = k;
37611                       }
37612                       else if (primary && primary === v) {  // e.g. `railway=rail + abandoned=railway`
37613                           status = k;
37614                       } else if (!primary && primaries.indexOf(v) !== -1) {  // e.g. `abandoned=railway`
37615                           status = k;
37616                           primary = v;
37617                           classes += ' tag-' + v;
37618                       }  // else ignore e.g.  `highway=path + abandoned=railway`
37619
37620                       if (status) break;
37621                   }
37622               }
37623
37624               if (status) {
37625                   classes += ' tag-status tag-status-' + status;
37626               }
37627
37628               // add any secondary (structure) tags
37629               for (i = 0; i < secondaries.length; i++) {
37630                   k = secondaries[i];
37631                   v = t[k];
37632                   if (!v || v === 'no') continue;
37633                   classes += ' tag-' + k + ' tag-' + k + '-' + v;
37634               }
37635
37636               // For highways, look for surface tagging..
37637               if (primary === 'highway' || primary === 'aeroway') {
37638                   var paved = (t.highway !== 'track');
37639                   for (k in t) {
37640                       v = t[k];
37641                       if (k in osmPavedTags) {
37642                           paved = !!osmPavedTags[k][v];
37643                           break;
37644                       }
37645                   }
37646                   if (!paved) {
37647                       classes += ' tag-unpaved';
37648                   }
37649               }
37650
37651               classes = classes.trim();
37652
37653               if (classes !== value) {
37654                   select(this).attr('class', classes);
37655               }
37656           });
37657       };
37658
37659
37660       tagClasses.tags = function(_) {
37661           if (!arguments.length) return _tags;
37662           _tags = _;
37663           return tagClasses;
37664       };
37665
37666       return tagClasses;
37667   }
37668
37669   function svgTurns(projection, context) {
37670
37671       function icon(turn) {
37672           var u = turn.u ? '-u' : '';
37673           if (turn.no) return '#iD-turn-no' + u;
37674           if (turn.only) return '#iD-turn-only' + u;
37675           return '#iD-turn-yes' + u;
37676       }
37677
37678       function drawTurns(selection, graph, turns) {
37679
37680           function turnTransform(d) {
37681               var pxRadius = 50;
37682               var toWay = graph.entity(d.to.way);
37683               var toPoints = graph.childNodes(toWay)
37684                   .map(function (n) { return n.loc; })
37685                   .map(projection);
37686               var toLength = geoPathLength(toPoints);
37687               var mid = toLength / 2;    // midpoint of destination way
37688
37689               var toNode = graph.entity(d.to.node);
37690               var toVertex = graph.entity(d.to.vertex);
37691               var a = geoAngle(toVertex, toNode, projection);
37692               var o = projection(toVertex.loc);
37693               var r = d.u ? 0                  // u-turn: no radius
37694                   : !toWay.__via ? pxRadius    // leaf way: put marker at pxRadius
37695                   : Math.min(mid, pxRadius);   // via way: prefer pxRadius, fallback to mid for very short ways
37696
37697               return 'translate(' + (r * Math.cos(a) + o[0]) + ',' + (r * Math.sin(a) + o[1]) + ') ' +
37698                   'rotate(' + a * 180 / Math.PI + ')';
37699           }
37700
37701
37702           var drawLayer = selection.selectAll('.layer-osm.points .points-group.turns');
37703           var touchLayer = selection.selectAll('.layer-touch.turns');
37704
37705           // Draw turns..
37706           var groups = drawLayer.selectAll('g.turn')
37707               .data(turns, function(d) { return d.key; });
37708
37709           // exit
37710           groups.exit()
37711               .remove();
37712
37713           // enter
37714           var groupsEnter = groups.enter()
37715               .append('g')
37716               .attr('class', function(d) { return 'turn ' + d.key; });
37717
37718           var turnsEnter = groupsEnter
37719               .filter(function(d) { return !d.u; });
37720
37721           turnsEnter.append('rect')
37722               .attr('transform', 'translate(-22, -12)')
37723               .attr('width', '44')
37724               .attr('height', '24');
37725
37726           turnsEnter.append('use')
37727               .attr('transform', 'translate(-22, -12)')
37728               .attr('width', '44')
37729               .attr('height', '24');
37730
37731           var uEnter = groupsEnter
37732               .filter(function(d) { return d.u; });
37733
37734           uEnter.append('circle')
37735               .attr('r', '16');
37736
37737           uEnter.append('use')
37738               .attr('transform', 'translate(-16, -16)')
37739               .attr('width', '32')
37740               .attr('height', '32');
37741
37742           // update
37743           groups = groups
37744               .merge(groupsEnter)
37745               .attr('opacity', function(d) { return d.direct === false ? '0.7' : null; })
37746               .attr('transform', turnTransform);
37747
37748           groups.select('use')
37749               .attr('xlink:href', icon);
37750
37751           groups.select('rect');      // propagate bound data
37752           groups.select('circle');    // propagate bound data
37753
37754
37755           // Draw touch targets..
37756           var fillClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37757           groups = touchLayer.selectAll('g.turn')
37758               .data(turns, function(d) { return d.key; });
37759
37760           // exit
37761           groups.exit()
37762               .remove();
37763
37764           // enter
37765           groupsEnter = groups.enter()
37766               .append('g')
37767               .attr('class', function(d) { return 'turn ' + d.key; });
37768
37769           turnsEnter = groupsEnter
37770               .filter(function(d) { return !d.u; });
37771
37772           turnsEnter.append('rect')
37773               .attr('class', 'target ' + fillClass)
37774               .attr('transform', 'translate(-22, -12)')
37775               .attr('width', '44')
37776               .attr('height', '24');
37777
37778           uEnter = groupsEnter
37779               .filter(function(d) { return d.u; });
37780
37781           uEnter.append('circle')
37782               .attr('class', 'target ' + fillClass)
37783               .attr('r', '16');
37784
37785           // update
37786           groups = groups
37787               .merge(groupsEnter)
37788               .attr('transform', turnTransform);
37789
37790           groups.select('rect');      // propagate bound data
37791           groups.select('circle');    // propagate bound data
37792
37793
37794           return this;
37795       }
37796
37797       return drawTurns;
37798   }
37799
37800   function svgVertices$$1(projection, context) {
37801       var radiuses = {
37802           //       z16-, z17,   z18+,  w/icon
37803           shadow: [6,    7.5,   7.5,   12],
37804           stroke: [2.5,  3.5,   3.5,   8],
37805           fill:   [1,    1.5,   1.5,   1.5]
37806       };
37807
37808       var _currHoverTarget;
37809       var _currPersistent = {};
37810       var _currHover = {};
37811       var _prevHover = {};
37812       var _currSelected = {};
37813       var _prevSelected = {};
37814       var _radii = {};
37815
37816
37817       function sortY(a, b) {
37818           return b.loc[1] - a.loc[1];
37819       }
37820
37821       // Avoid exit/enter if we're just moving stuff around.
37822       // The node will get a new version but we only need to run the update selection.
37823       function fastEntityKey(d) {
37824           var mode = context.mode();
37825           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
37826           return isMoving ? d.id : osmEntity$$1.key(d);
37827       }
37828
37829
37830       function draw(selection$$1, graph, vertices, sets, filter) {
37831           sets = sets || { selected: {}, important: {}, hovered: {} };
37832
37833           var icons = {};
37834           var directions = {};
37835           var wireframe = context.surface().classed('fill-wireframe');
37836           var zoom = geoScaleToZoom(projection.scale());
37837           var z = (zoom < 17 ? 0 : zoom < 18 ? 1 : 2);
37838
37839
37840           function getIcon(d) {
37841               // always check latest entity, as fastEntityKey avoids enter/exit now
37842               var entity = graph.entity(d.id);
37843               if (entity.id in icons) return icons[entity.id];
37844
37845               icons[entity.id] =
37846                   entity.hasInterestingTags() &&
37847                   context.presets().match(entity, graph).icon;
37848               return icons[entity.id];
37849           }
37850
37851
37852           // memoize directions results, return false for empty arrays (for use in filter)
37853           function getDirections(entity) {
37854               if (entity.id in directions) return directions[entity.id];
37855
37856               var angles = entity.directions(graph, projection);
37857               directions[entity.id] = angles.length ? angles : false;
37858               return angles;
37859           }
37860
37861
37862           function updateAttributes(selection$$1) {
37863               ['shadow', 'stroke', 'fill'].forEach(function(klass) {
37864                   var rads = radiuses[klass];
37865                   selection$$1.selectAll('.' + klass)
37866                       .each(function(entity) {
37867                           var i = z && getIcon(entity);
37868                           var r = rads[i ? 3 : z];
37869
37870                           // slightly increase the size of unconnected endpoints #3775
37871                           if (entity.isEndpoint(graph) && !entity.isConnected(graph)) {
37872                               r += 1.5;
37873                           }
37874
37875                           if (klass === 'shadow') {   // remember this value, so we don't need to
37876                               _radii[entity.id] = r;  // recompute it when we draw the touch targets
37877                           }
37878
37879                           select(this)
37880                               .attr('r', r)
37881                               .attr('visibility', (i && klass === 'fill') ? 'hidden' : null);
37882                       });
37883               });
37884           }
37885
37886           vertices.sort(sortY);
37887
37888           var groups = selection$$1.selectAll('g.vertex')
37889               .filter(filter)
37890               .data(vertices, fastEntityKey);
37891
37892           // exit
37893           groups.exit()
37894               .remove();
37895
37896           // enter
37897           var enter = groups.enter()
37898               .append('g')
37899               .attr('class', function(d) { return 'node vertex ' + d.id; })
37900               .order();
37901
37902           enter
37903               .append('circle')
37904               .attr('class', 'shadow');
37905
37906           enter
37907               .append('circle')
37908               .attr('class', 'stroke');
37909
37910           // Vertices with tags get a fill.
37911           enter.filter(function(d) { return d.hasInterestingTags(); })
37912               .append('circle')
37913               .attr('class', 'fill');
37914
37915           // update
37916           groups = groups
37917               .merge(enter)
37918               .attr('transform', svgPointTransform(projection))
37919               .classed('sibling', function(d) { return d.id in sets.selected; })
37920               .classed('shared', function(d) { return graph.isShared(d); })
37921               .classed('endpoint', function(d) { return d.isEndpoint(graph); })
37922               .call(updateAttributes);
37923
37924
37925           // Vertices with icons get a `use`.
37926           var iconUse = groups
37927               .selectAll('.icon')
37928               .data(function data(d) { return zoom >= 17 && getIcon(d) ? [d] : []; }, fastEntityKey);
37929
37930           // exit
37931           iconUse.exit()
37932               .remove();
37933
37934           // enter
37935           iconUse.enter()
37936               .append('use')
37937               .attr('class', 'icon')
37938               .attr('width', '11px')
37939               .attr('height', '11px')
37940               .attr('transform', 'translate(-5.5, -5.5)')
37941               .attr('xlink:href', function(d) {
37942                   var picon = getIcon(d);
37943                   var isMaki = /^maki-/.test(picon);
37944                   return '#' + picon + (isMaki ? '-11' : '');
37945               });
37946
37947
37948           // Vertices with directions get viewfields
37949           var dgroups = groups
37950               .selectAll('.viewfieldgroup')
37951               .data(function data(d) { return zoom >= 18 && getDirections(d) ? [d] : []; }, fastEntityKey);
37952
37953           // exit
37954           dgroups.exit()
37955               .remove();
37956
37957           // enter/update
37958           dgroups = dgroups.enter()
37959               .insert('g', '.shadow')
37960               .attr('class', 'viewfieldgroup')
37961               .merge(dgroups);
37962
37963           var viewfields = dgroups.selectAll('.viewfield')
37964               .data(getDirections, function key(d) { return osmEntity$$1.key(d); });
37965
37966           // exit
37967           viewfields.exit()
37968               .remove();
37969
37970           // enter/update
37971           viewfields.enter()
37972               .append('path')
37973               .attr('class', 'viewfield')
37974               .attr('d', 'M0,0H0')
37975               .merge(viewfields)
37976               .attr('marker-start', 'url(#viewfield-marker' + (wireframe ? '-wireframe' : '') + ')')
37977               .attr('transform', function(d) { return 'rotate(' + d + ')'; });
37978       }
37979
37980
37981       function drawTargets(selection$$1, graph, entities, filter) {
37982           var targetClass = context.getDebug('target') ? 'pink ' : 'nocolor ';
37983           var nopeClass = context.getDebug('target') ? 'red ' : 'nocolor ';
37984           var getTransform = svgPointTransform(projection).geojson;
37985           var activeID = context.activeID();
37986           var data = { targets: [], nopes: [] };
37987
37988           entities.forEach(function(node) {
37989               if (activeID === node.id) return;   // draw no target on the activeID
37990
37991               var vertexType = svgPassiveVertex(node, graph, activeID);
37992               if (vertexType !== 0) {     // passive or adjacent - allow to connect
37993                   data.targets.push({
37994                       type: 'Feature',
37995                       id: node.id,
37996                       properties: {
37997                           target: true,
37998                           entity: node
37999                       },
38000                       geometry: node.asGeoJSON()
38001                   });
38002               } else {
38003                   data.nopes.push({
38004                       type: 'Feature',
38005                       id: node.id + '-nope',
38006                       properties: {
38007                           nope: true,
38008                           target: true,
38009                           entity: node
38010                       },
38011                       geometry: node.asGeoJSON()
38012                   });
38013               }
38014           });
38015
38016
38017           // Targets allow hover and vertex snapping
38018           var targets = selection$$1.selectAll('.vertex.target-allowed')
38019               .filter(function(d) { return filter(d.properties.entity); })
38020               .data(data.targets, function key(d) { return d.id; });
38021
38022           // exit
38023           targets.exit()
38024               .remove();
38025
38026           // enter/update
38027           targets.enter()
38028               .append('circle')
38029               .attr('r', function(d) { return (_radii[d.id] || radiuses.shadow[3]); })
38030               .merge(targets)
38031               .attr('class', function(d) { return 'node vertex target target-allowed ' + targetClass + d.id; })
38032               .attr('transform', getTransform);
38033
38034
38035           // NOPE
38036           var nopes = selection$$1.selectAll('.vertex.target-nope')
38037               .filter(function(d) { return filter(d.properties.entity); })
38038               .data(data.nopes, function key(d) { return d.id; });
38039
38040           // exit
38041           nopes.exit()
38042               .remove();
38043
38044           // enter/update
38045           nopes.enter()
38046               .append('circle')
38047               .attr('r', function(d) { return (_radii[d.properties.entity.id] || radiuses.shadow[3]); })
38048               .merge(nopes)
38049               .attr('class', function(d) { return 'node vertex target target-nope ' + nopeClass + d.id; })
38050               .attr('transform', getTransform);
38051       }
38052
38053
38054       // Points can also render as vertices:
38055       // 1. in wireframe mode or
38056       // 2. at higher zooms if they have a direction
38057       function renderAsVertex(entity, graph, wireframe, zoom) {
38058           var geometry = entity.geometry(graph);
38059           return geometry === 'vertex' || (geometry === 'point' && (
38060               wireframe || (zoom >= 18 && entity.directions(graph, projection).length)
38061           ));
38062       }
38063
38064
38065       function getSiblingAndChildVertices(ids, graph, wireframe, zoom) {
38066           var results = {};
38067
38068           function addChildVertices(entity) {
38069               var geometry = entity.geometry(graph);
38070               if (!context.features().isHiddenFeature(entity, graph, geometry)) {
38071                   var i;
38072                   if (entity.type === 'way') {
38073                       for (i = 0; i < entity.nodes.length; i++) {
38074                           var child = graph.hasEntity(entity.nodes[i]);
38075                           if (child) {
38076                               addChildVertices(child);
38077                           }
38078                       }
38079                   } else if (entity.type === 'relation') {
38080                       for (i = 0; i < entity.members.length; i++) {
38081                           var member = graph.hasEntity(entity.members[i].id);
38082                           if (member) {
38083                               addChildVertices(member);
38084                           }
38085                       }
38086                   } else if (renderAsVertex(entity, graph, wireframe, zoom)) {
38087                       results[entity.id] = entity;
38088                   }
38089               }
38090           }
38091
38092           ids.forEach(function(id) {
38093               var entity = graph.hasEntity(id);
38094               if (!entity) return;
38095
38096               if (entity.type === 'node') {
38097                   if (renderAsVertex(entity, graph, wireframe, zoom)) {
38098                       results[entity.id] = entity;
38099                       graph.parentWays(entity).forEach(function(entity) {
38100                           addChildVertices(entity);
38101                       });
38102                   }
38103               } else {  // way, relation
38104                   addChildVertices(entity);
38105               }
38106           });
38107
38108           return results;
38109       }
38110
38111
38112       function drawVertices(selection$$1, graph, entities, filter, extent, fullRedraw) {
38113           var wireframe = context.surface().classed('fill-wireframe');
38114           var zoom = geoScaleToZoom(projection.scale());
38115           var mode = context.mode();
38116           var isMoving = mode && /^(add|draw|drag|move|rotate)/.test(mode.id);
38117
38118           var drawLayer = selection$$1.selectAll('.layer-osm.points .points-group.vertices');
38119           var touchLayer = selection$$1.selectAll('.layer-touch.points');
38120
38121           if (fullRedraw) {
38122               _currPersistent = {};
38123               _radii = {};
38124           }
38125
38126           // Collect important vertices from the `entities` list..
38127           // (during a paritial redraw, it will not contain everything)
38128           for (var i = 0; i < entities.length; i++) {
38129               var entity = entities[i];
38130               var geometry = entity.geometry(graph);
38131               var keep = false;
38132
38133               // a point that looks like a vertex..
38134               if ((geometry === 'point') && renderAsVertex(entity, graph, wireframe, zoom)) {
38135                   _currPersistent[entity.id] = entity;
38136                   keep = true;
38137
38138               // a vertex of some importance..
38139               } else if (geometry === 'vertex' &&
38140                   (entity.hasInterestingTags() || entity.isEndpoint(graph) || entity.isConnected(graph))) {
38141                   _currPersistent[entity.id] = entity;
38142                   keep = true;
38143               }
38144
38145               // whatever this is, it's not a persistent vertex..
38146               if (!keep && !fullRedraw) {
38147                   delete _currPersistent[entity.id];
38148               }
38149           }
38150
38151           // 3 sets of vertices to consider:
38152           var sets = {
38153               persistent: _currPersistent,  // persistent = important vertices (render always)
38154               selected: _currSelected,      // selected + siblings of selected (render always)
38155               hovered: _currHover           // hovered + siblings of hovered (render only in draw modes)
38156           };
38157
38158           var all = assign({}, (isMoving ? _currHover : {}), _currSelected, _currPersistent);
38159
38160           // Draw the vertices..
38161           // The filter function controls the scope of what objects d3 will touch (exit/enter/update)
38162           // Adjust the filter function to expand the scope beyond whatever entities were passed in.
38163           var filterRendered = function(d) {
38164               return d.id in _currPersistent || d.id in _currSelected || d.id in _currHover || filter(d);
38165           };
38166           drawLayer
38167               .call(draw, graph, currentVisible(all), sets, filterRendered);
38168
38169           // Draw touch targets..
38170           // When drawing, render all targets (not just those affected by a partial redraw)
38171           var filterTouch = function(d) {
38172               return isMoving ? true : filterRendered(d);
38173           };
38174           touchLayer
38175               .call(drawTargets, graph, currentVisible(all), filterTouch);
38176
38177
38178           function currentVisible(which) {
38179               return Object.keys(which)
38180                   .map(graph.hasEntity, graph)     // the current version of this entity
38181                   .filter(function (entity) { return entity && entity.intersects(extent, graph); });
38182           }
38183       }
38184
38185
38186       // partial redraw - only update the selected items..
38187       drawVertices.drawSelected = function(selection$$1, graph, extent) {
38188           var wireframe = context.surface().classed('fill-wireframe');
38189           var zoom = geoScaleToZoom(projection.scale());
38190
38191           _prevSelected = _currSelected || {};
38192           _currSelected = getSiblingAndChildVertices(context.selectedIDs(), graph, wireframe, zoom);
38193
38194           // note that drawVertices will add `_currSelected` automatically if needed..
38195           var filter = function(d) { return d.id in _prevSelected; };
38196           drawVertices(selection$$1, graph, values$1(_prevSelected), filter, extent, false);
38197       };
38198
38199
38200       // partial redraw - only update the hovered items..
38201       drawVertices.drawHover = function(selection$$1, graph, target, extent) {
38202           if (target === _currHoverTarget) return;  // continue only if something changed
38203
38204           var wireframe = context.surface().classed('fill-wireframe');
38205           var zoom = geoScaleToZoom(projection.scale());
38206
38207           _prevHover = _currHover || {};
38208           _currHoverTarget = target;
38209           var entity = target && target.properties && target.properties.entity;
38210
38211           if (entity) {
38212               _currHover = getSiblingAndChildVertices([entity.id], graph, wireframe, zoom);
38213           } else {
38214               _currHover = {};
38215           }
38216
38217           // note that drawVertices will add `_currHover` automatically if needed..
38218           var filter = function(d) { return d.id in _prevHover; };
38219           drawVertices(selection$$1, graph, values$1(_prevHover), filter, extent, false);
38220       };
38221
38222       return drawVertices;
38223   }
38224
38225   /* global Mapillary:false */
38226
38227
38228   var apibase = 'https://a.mapillary.com/v3/';
38229   var viewercss = 'mapillary-js/mapillary.min.css';
38230   var viewerjs = 'mapillary-js/mapillary.min.js';
38231   var clientId = 'NzNRM2otQkR2SHJzaXJmNmdQWVQ0dzo1ZWYyMmYwNjdmNDdlNmVi';
38232   var maxResults = 1000;
38233   var tileZoom = 14;
38234   var tiler = utilTiler().zoomExtent([tileZoom, tileZoom]).skipNullIsland(true);
38235   var dispatch$1 = dispatch('loadedImages', 'loadedSigns', 'bearingChanged');
38236   var _mlyFallback = false;
38237   var _mlyCache;
38238   var _mlyClicks;
38239   var _mlySelectedImage;
38240   var _mlyViewer;
38241
38242
38243   function abortRequest(i) {
38244       i.abort();
38245   }
38246
38247
38248   function maxPageAtZoom(z) {
38249       if (z < 15)   return 2;
38250       if (z === 15) return 5;
38251       if (z === 16) return 10;
38252       if (z === 17) return 20;
38253       if (z === 18) return 40;
38254       if (z > 18)   return 80;
38255   }
38256
38257
38258   function loadTiles(which, url, projection) {
38259       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
38260       var tiles = tiler.getTiles(projection);
38261
38262       // abort inflight requests that are no longer needed
38263       var cache = _mlyCache[which];
38264       forEach(cache.inflight, function(v, k) {
38265           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
38266
38267           if (!wanted) {
38268               abortRequest(v);
38269               delete cache.inflight[k];
38270           }
38271       });
38272
38273       tiles.forEach(function(tile) {
38274           loadNextTilePage(which, currZoom, url, tile);
38275       });
38276   }
38277
38278
38279   function loadNextTilePage(which, currZoom, url, tile) {
38280       var cache = _mlyCache[which];
38281       var rect = tile.extent.rectangle();
38282       var maxPages = maxPageAtZoom(currZoom);
38283       var nextPage = cache.nextPage[tile.id] || 0;
38284       var nextURL = cache.nextURL[tile.id] || url +
38285           utilQsString({
38286               per_page: maxResults,
38287               page: nextPage,
38288               client_id: clientId,
38289               bbox: [rect[0], rect[1], rect[2], rect[3]].join(','),
38290           });
38291
38292       if (nextPage > maxPages) return;
38293
38294       var id = tile.id + ',' + String(nextPage);
38295       if (cache.loaded[id] || cache.inflight[id]) return;
38296       cache.inflight[id] = request(nextURL)
38297           .mimeType('application/json')
38298           .response(function(xhr) {
38299               var linkHeader = xhr.getResponseHeader('Link');
38300               if (linkHeader) {
38301                   var pagination = parsePagination(xhr.getResponseHeader('Link'));
38302                   if (pagination.next) {
38303                       cache.nextURL[tile.id] = pagination.next;
38304                   }
38305               }
38306               return JSON.parse(xhr.responseText);
38307           })
38308           .get(function(err, data) {
38309               cache.loaded[id] = true;
38310               delete cache.inflight[id];
38311               if (err || !data.features || !data.features.length) return;
38312
38313               var features = data.features.map(function(feature) {
38314                   var loc = feature.geometry.coordinates;
38315                   var d;
38316
38317                   // An image (shown as a green dot on the map) is a single street photo with extra
38318                   // information such as location, camera angle (CA), camera model, and so on.
38319                   // Each image feature is a GeoJSON Point
38320                   if (which === 'images') {
38321                       d = {
38322                           loc: loc,
38323                           key: feature.properties.key,
38324                           ca: feature.properties.ca,
38325                           captured_at: feature.properties.captured_at,
38326                           captured_by: feature.properties.username,
38327                           pano: feature.properties.pano
38328                       };
38329
38330                       cache.forImageKey[d.key] = d;     // cache imageKey -> image
38331
38332                   // Mapillary organizes images as sequences. A sequence of images are continuously captured
38333                   // by a user at a give time. Sequences are shown on the map as green lines.
38334                   // Each sequence feature is a GeoJSON LineString
38335                   } else if (which === 'sequences') {
38336                       var sequenceKey = feature.properties.key;
38337                       cache.lineString[sequenceKey] = feature;           // cache sequenceKey -> lineString
38338                       feature.properties.coordinateProperties.image_keys.forEach(function(imageKey) {
38339                           cache.forImageKey[imageKey] = sequenceKey;     // cache imageKey -> sequenceKey
38340                       });
38341                       return false;    // because no `d` data worth loading into an rbush
38342
38343                   // An image detection is a semantic pixel area on an image. The area could indicate
38344                   // sky, trees, sidewalk in the image. A detection can be a polygon, a bounding box, or a point.
38345                   // Each image_detection feature is a GeoJSON Point (located where the image was taken)
38346                   } else if (which === 'image_detections') {
38347                       d = {
38348                           key: feature.properties.key,
38349                           image_key: feature.properties.image_key,
38350                           value: feature.properties.value,
38351                           package: feature.properties.package,
38352                           shape: feature.properties.shape
38353                       };
38354
38355                       // cache imageKey -> image_detections
38356                       if (!cache.forImageKey[d.image_key]) {
38357                           cache.forImageKey[d.image_key] = [];
38358                       }
38359                       cache.forImageKey[d.image_key].push(d);
38360                       return false;    // because no `d` data worth loading into an rbush
38361
38362
38363                   // A map feature is a real world object that can be shown on a map. It could be any object
38364                   // recognized from images, manually added in images, or added on the map.
38365                   // Each map feature is a GeoJSON Point (located where the feature is)
38366                   } else if (which === 'map_features') {
38367                       d = {
38368                           loc: loc,
38369                           key: feature.properties.key,
38370                           value: feature.properties.value,
38371                           package: feature.properties.package,
38372                           detections: feature.properties.detections
38373                       };
38374                   }
38375
38376                   return {
38377                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
38378                   };
38379
38380               }).filter(Boolean);
38381
38382               if (cache.rtree && features) {
38383                   cache.rtree.load(features);
38384               }
38385
38386               if (which === 'images' || which === 'sequences') {
38387                   dispatch$1.call('loadedImages');
38388               } else if (which === 'map_features') {
38389                   dispatch$1.call('loadedSigns');
38390               }
38391
38392               if (data.features.length === maxResults) {  // more pages to load
38393                   cache.nextPage[tile.id] = nextPage + 1;
38394                   loadNextTilePage(which, currZoom, url, tile);
38395               } else {
38396                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
38397               }
38398           });
38399   }
38400
38401   // extract links to pages of API results
38402   function parsePagination(links) {
38403       return links.split(',').map(function(rel) {
38404           var elements = rel.split(';');
38405           if (elements.length === 2) {
38406               return [
38407                   /<(.+)>/.exec(elements[0])[1],
38408                   /rel="(.+)"/.exec(elements[1])[1]
38409               ];
38410           } else {
38411               return ['',''];
38412           }
38413       }).reduce(function(pagination, val) {
38414           pagination[val[1]] = val[0];
38415           return pagination;
38416       }, {});
38417   }
38418
38419
38420   // partition viewport into higher zoom tiles
38421   function partitionViewport(projection) {
38422       var z = geoScaleToZoom(projection.scale());
38423       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
38424       var tiler = utilTiler().zoomExtent([z2, z2]);
38425
38426       return tiler.getTiles(projection)
38427           .map(function(tile) { return tile.extent; });
38428   }
38429
38430
38431   // no more than `limit` results per partition.
38432   function searchLimited(limit, projection, rtree) {
38433       limit = limit || 5;
38434
38435       return partitionViewport(projection)
38436           .reduce(function(result, extent) {
38437               var found = rtree.search(extent.bbox())
38438                   .slice(0, limit)
38439                   .map(function(d) { return d.data; });
38440
38441               return (found.length ? result.concat(found) : result);
38442           }, []);
38443   }
38444
38445
38446
38447   var serviceMapillary = {
38448
38449       init: function() {
38450           if (!_mlyCache) {
38451               this.reset();
38452           }
38453
38454           this.event = utilRebind(this, dispatch$1, 'on');
38455       },
38456
38457       reset: function() {
38458           var cache = _mlyCache;
38459
38460           if (cache) {
38461               if (cache.images && cache.images.inflight) {
38462                   forEach(cache.images.inflight, abortRequest);
38463               }
38464               if (cache.image_detections && cache.image_detections.inflight) {
38465                   forEach(cache.image_detections.inflight, abortRequest);
38466               }
38467               if (cache.map_features && cache.map_features.inflight) {
38468                   forEach(cache.map_features.inflight, abortRequest);
38469               }
38470               if (cache.sequences && cache.sequences.inflight) {
38471                   forEach(cache.sequences.inflight, abortRequest);
38472               }
38473           }
38474
38475           _mlyCache = {
38476               images: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {} },
38477               image_detections: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, forImageKey: {} },
38478               map_features: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1() },
38479               sequences: { inflight: {}, loaded: {}, nextPage: {}, nextURL: {}, rtree: rbush_1(), forImageKey: {}, lineString: {} }
38480           };
38481
38482           _mlySelectedImage = null;
38483           _mlyClicks = [];
38484       },
38485
38486
38487       images: function(projection) {
38488           var limit = 5;
38489           return searchLimited(limit, projection, _mlyCache.images.rtree);
38490       },
38491
38492
38493       signs: function(projection) {
38494           var limit = 5;
38495           return searchLimited(limit, projection, _mlyCache.map_features.rtree);
38496       },
38497
38498
38499       sequences: function(projection) {
38500           var viewport = projection.clipExtent();
38501           var min = [viewport[0][0], viewport[1][1]];
38502           var max = [viewport[1][0], viewport[0][1]];
38503           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
38504           var sequenceKeys = {};
38505
38506           // all sequences for images in viewport
38507           _mlyCache.images.rtree.search(bbox)
38508               .forEach(function(d) {
38509                   var sequenceKey = _mlyCache.sequences.forImageKey[d.data.key];
38510                   if (sequenceKey) {
38511                       sequenceKeys[sequenceKey] = true;
38512                   }
38513               });
38514
38515           // Return lineStrings for the sequences
38516           return Object.keys(sequenceKeys).map(function(sequenceKey) {
38517               return _mlyCache.sequences.lineString[sequenceKey];
38518           });
38519       },
38520
38521
38522       signsSupported: function() {
38523           return true;
38524       },
38525
38526
38527       loadImages: function(projection) {
38528           loadTiles('images', apibase + 'images?', projection);
38529           loadTiles('sequences', apibase + 'sequences?', projection);
38530       },
38531
38532
38533       loadSigns: function(context, projection) {
38534           // if we are looking at signs, we'll actually need to fetch images too
38535           loadTiles('images', apibase + 'images?', projection);
38536           loadTiles('map_features', apibase + 'map_features?layers=trafficsigns&min_nbr_image_detections=1&', projection);
38537           loadTiles('image_detections', apibase + 'image_detections?layers=trafficsigns&', projection);
38538       },
38539
38540
38541       loadViewer: function(context) {
38542           // add mly-wrapper
38543           var wrap = select('#photoviewer').selectAll('.mly-wrapper')
38544               .data([0]);
38545
38546           wrap.enter()
38547               .append('div')
38548               .attr('id', 'mly')
38549               .attr('class', 'photo-wrapper mly-wrapper')
38550               .classed('hide', true);
38551
38552           // load mapillary-viewercss
38553           select('head').selectAll('#mapillary-viewercss')
38554               .data([0])
38555               .enter()
38556               .append('link')
38557               .attr('id', 'mapillary-viewercss')
38558               .attr('rel', 'stylesheet')
38559               .attr('href', context.asset(viewercss));
38560
38561           // load mapillary-viewerjs
38562           select('head').selectAll('#mapillary-viewerjs')
38563               .data([0])
38564               .enter()
38565               .append('script')
38566               .attr('id', 'mapillary-viewerjs')
38567               .attr('src', context.asset(viewerjs));
38568
38569           // load mapillary signs sprite
38570           var defs = context.container().select('defs');
38571           defs.call(svgDefs(context).addSprites, ['mapillary-sprite']);
38572
38573           // Register viewer resize handler
38574           context.ui().photoviewer.on('resize', function() {
38575               if (_mlyViewer) {
38576                   _mlyViewer.resize();
38577               }
38578           });
38579       },
38580
38581
38582       showViewer: function() {
38583           var wrap = select('#photoviewer')
38584               .classed('hide', false);
38585
38586           var isHidden = wrap.selectAll('.photo-wrapper.mly-wrapper.hide').size();
38587
38588           if (isHidden && _mlyViewer) {
38589               wrap
38590                   .selectAll('.photo-wrapper:not(.mly-wrapper)')
38591                   .classed('hide', true);
38592
38593               wrap
38594                   .selectAll('.photo-wrapper.mly-wrapper')
38595                   .classed('hide', false);
38596
38597               _mlyViewer.resize();
38598           }
38599
38600           return this;
38601       },
38602
38603
38604       hideViewer: function() {
38605           _mlySelectedImage = null;
38606
38607           if (!_mlyFallback && _mlyViewer) {
38608               _mlyViewer.getComponent('sequence').stop();
38609           }
38610
38611           var viewer = select('#photoviewer');
38612           if (!viewer.empty()) viewer.datum(null);
38613
38614           viewer
38615               .classed('hide', true)
38616               .selectAll('.photo-wrapper')
38617               .classed('hide', true);
38618
38619           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
38620               .classed('selected', false);
38621
38622           return this.setStyles(null, true);
38623       },
38624
38625
38626       parsePagination: parsePagination,
38627
38628
38629       updateViewer: function(imageKey, context) {
38630           if (!imageKey) return this;
38631
38632           if (!_mlyViewer) {
38633               this.initViewer(imageKey, context);
38634           } else {
38635               _mlyViewer.moveToKey(imageKey)
38636                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
38637           }
38638
38639           return this;
38640       },
38641
38642
38643       initViewer: function(imageKey, context) {
38644           var that = this;
38645           if (window.Mapillary && imageKey) {
38646               var opts = {
38647                   baseImageSize: 320,
38648                   component: {
38649                       cover: false,
38650                       keyboard: false,
38651                       tag: true
38652                   }
38653               };
38654
38655               // Disable components requiring WebGL support
38656               if (!Mapillary.isSupported() && Mapillary.isFallbackSupported()) {
38657                   _mlyFallback = true;
38658                   opts.component = {
38659                       cover: false,
38660                       direction: false,
38661                       imagePlane: false,
38662                       keyboard: false,
38663                       mouse: false,
38664                       sequence: false,
38665                       tag: false,
38666                       image: true,        // fallback
38667                       navigation: true    // fallback
38668                   };
38669               }
38670
38671               _mlyViewer = new Mapillary.Viewer('mly', clientId, null, opts);
38672               _mlyViewer.on('nodechanged', nodeChanged);
38673               _mlyViewer.on('bearingchanged', bearingChanged);
38674               _mlyViewer.moveToKey(imageKey)
38675                   .catch(function(e) { console.error('mly3', e); });  // eslint-disable-line no-console
38676           }
38677
38678           // nodeChanged: called after the viewer has changed images and is ready.
38679           //
38680           // There is some logic here to batch up clicks into a _mlyClicks array
38681           // because the user might click on a lot of markers quickly and nodechanged
38682           // may be called out of order asychronously.
38683           //
38684           // Clicks are added to the array in `selectedImage` and removed here.
38685           //
38686           function nodeChanged(node) {
38687               if (!_mlyFallback) {
38688                   _mlyViewer.getComponent('tag').removeAll();  // remove previous detections
38689               }
38690
38691               var clicks = _mlyClicks;
38692               var index = clicks.indexOf(node.key);
38693               var selectedKey = _mlySelectedImage && _mlySelectedImage.key;
38694
38695               if (index > -1) {              // `nodechanged` initiated from clicking on a marker..
38696                   clicks.splice(index, 1);   // remove the click
38697                   // If `node.key` matches the current _mlySelectedImage, call `selectImage()`
38698                   // one more time to update the detections and attribution..
38699                   if (node.key === selectedKey) {
38700                       that.selectImage(_mlySelectedImage, node.key, true);
38701                   }
38702               } else {             // `nodechanged` initiated from the Mapillary viewer controls..
38703                   var loc = node.computedLatLon ? [node.computedLatLon.lon, node.computedLatLon.lat] : [node.latLon.lon, node.latLon.lat];
38704                   context.map().centerEase(loc);
38705                   that.selectImage(undefined, node.key, true);
38706               }
38707           }
38708
38709           function bearingChanged(e) {
38710               dispatch$1.call('bearingChanged', undefined, e);
38711           }
38712       },
38713
38714
38715       // Pass the image datum itself in `d` or the `imageKey` string.
38716       // This allows images to be selected from places that dont have access
38717       // to the full image datum (like the street signs layer or the js viewer)
38718       selectImage: function(d, imageKey, fromViewer) {
38719           if (!d && imageKey) {
38720               // If the user clicked on something that's not an image marker, we
38721               // might get in here.. Cache lookup can fail, e.g. if the user
38722               // clicked a streetsign, but images are loading slowly asynchronously.
38723               // We'll try to carry on anyway if there is no datum.  There just
38724               // might be a delay before user sees detections, captured_at, etc.
38725               d = _mlyCache.images.forImageKey[imageKey];
38726           }
38727
38728           _mlySelectedImage = d;
38729           var viewer = select('#photoviewer');
38730           if (!viewer.empty()) viewer.datum(d);
38731
38732           imageKey = (d && d.key) || imageKey;
38733           if (!fromViewer && imageKey) {
38734               _mlyClicks.push(imageKey);
38735           }
38736
38737           this.setStyles(null, true);
38738
38739           // if signs signs are shown, highlight the ones that appear in this image
38740           d3_selectAll('.layer-mapillary-signs .icon-sign')
38741               .classed('selected', function(d) {
38742                   return some(d.detections, function(detection) {
38743                       return detection.image_key === imageKey;
38744                   });
38745               });
38746
38747           if (d) {
38748               this.updateDetections(d);
38749           }
38750
38751           return this;
38752       },
38753
38754
38755       getSelectedImage: function() {
38756           return _mlySelectedImage;
38757       },
38758
38759
38760       getSequenceKeyForImage: function(d) {
38761           var imageKey = d && d.key;
38762           return imageKey && _mlyCache.sequences.forImageKey[imageKey];
38763       },
38764
38765
38766       setStyles: function(hovered, reset) {
38767           if (reset) {  // reset all layers
38768               d3_selectAll('.viewfield-group')
38769                   .classed('highlighted', false)
38770                   .classed('hovered', false)
38771                   .classed('selected', false);
38772
38773               d3_selectAll('.sequence')
38774                   .classed('highlighted', false)
38775                   .classed('selected', false);
38776           }
38777
38778           var hoveredImageKey = hovered && hovered.key;
38779           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
38780           var hoveredLineString = hoveredSequenceKey && _mlyCache.sequences.lineString[hoveredSequenceKey];
38781           var hoveredImageKeys = (hoveredLineString && hoveredLineString.properties.coordinateProperties.image_keys) || [];
38782
38783           var viewer = select('#photoviewer');
38784           var selected = viewer.empty() ? undefined : viewer.datum();
38785           var selectedImageKey = selected && selected.key;
38786           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
38787           var selectedLineString = selectedSequenceKey && _mlyCache.sequences.lineString[selectedSequenceKey];
38788           var selectedImageKeys = (selectedLineString && selectedLineString.properties.coordinateProperties.image_keys) || [];
38789
38790           // highlight sibling viewfields on either the selected or the hovered sequences
38791           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
38792
38793           d3_selectAll('.layer-mapillary-images .viewfield-group')
38794               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
38795               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
38796               .classed('selected', function(d) { return d.key === selectedImageKey; });
38797
38798           d3_selectAll('.layer-mapillary-images .sequence')
38799               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
38800               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
38801
38802           // update viewfields if needed
38803           d3_selectAll('.viewfield-group .viewfield')
38804               .attr('d', viewfieldPath);
38805
38806           function viewfieldPath() {
38807               var d = this.parentNode.__data__;
38808               if (d.pano && d.key !== selectedImageKey) {
38809                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
38810               } else {
38811                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
38812               }
38813           }
38814
38815           return this;
38816       },
38817
38818
38819       updateDetections: function(d) {
38820           if (!_mlyViewer || _mlyFallback) return;
38821
38822           var imageKey = d && d.key;
38823           if (!imageKey) return;
38824
38825           var detections = _mlyCache.image_detections.forImageKey[imageKey] || [];
38826           detections.forEach(function(data) {
38827               var tag = makeTag(data);
38828               if (tag) {
38829                   var tagComponent = _mlyViewer.getComponent('tag');
38830                   tagComponent.add([tag]);
38831               }
38832           });
38833
38834           function makeTag(data) {
38835               var valueParts = data.value.split('--');
38836               if (valueParts.length !== 3) return;
38837
38838               var text = valueParts[1].replace(/-/g, ' ');
38839               var tag;
38840
38841               // Currently only two shapes <Polygon|Point>
38842               if (data.shape.type === 'Polygon') {
38843                   var polygonGeometry = new Mapillary
38844                       .TagComponent
38845                       .PolygonGeometry(data.shape.coordinates[0]);
38846
38847                   tag = new Mapillary.TagComponent.OutlineTag(
38848                       data.key,
38849                       polygonGeometry,
38850                       {
38851                           text: text,
38852                           textColor: 0xffff00,
38853                           lineColor: 0xffff00,
38854                           lineWidth: 2,
38855                           fillColor: 0xffff00,
38856                           fillOpacity: 0.3,
38857                       }
38858                   );
38859
38860               } else if (data.shape.type === 'Point') {
38861                   var pointGeometry = new Mapillary
38862                       .TagComponent
38863                       .PointGeometry(data.shape.coordinates[0]);
38864
38865                   tag = new Mapillary.TagComponent.SpotTag(
38866                       data.key,
38867                       pointGeometry,
38868                       {
38869                           text: text,
38870                           color: 0xffff00,
38871                           textColor: 0xffff00
38872                       }
38873                   );
38874               }
38875
38876               return tag;
38877           }
38878       },
38879
38880
38881       cache: function() {
38882           return _mlyCache;
38883       }
38884
38885   };
38886
38887   var apibase$1 = 'https://nominatim.openstreetmap.org/',
38888       inflight = {},
38889       nominatimCache;
38890
38891
38892   var serviceNominatim = {
38893
38894       init: function() {
38895           inflight = {};
38896           nominatimCache = rbush_1();
38897       },
38898
38899       reset: function() {
38900           forEach(inflight, function(req) { req.abort(); });
38901           inflight = {};
38902           nominatimCache = rbush_1();
38903       },
38904
38905
38906       countryCode: function (location, callback) {
38907           this.reverse(location, function(err, result) {
38908               if (err) {
38909                   return callback(err);
38910               } else if (result.address) {
38911                   return callback(null, result.address.country_code);
38912               } else {
38913                   return callback('Unable to geocode', null);
38914               }
38915           });
38916       },
38917
38918
38919       reverse: function (location, callback) {
38920           var cached = nominatimCache.search(
38921               { minX: location[0], minY: location[1], maxX: location[0], maxY: location[1] }
38922           );
38923
38924           if (cached.length > 0) {
38925               return callback(null, cached[0].data);
38926           }
38927
38928           var params = { zoom: 13, format: 'json', addressdetails: 1, lat: location[1], lon: location[0] };
38929           var url = apibase$1 + 'reverse?' + utilQsString(params);
38930           if (inflight[url]) return;
38931
38932           inflight[url] = d3_json(url, function(err, result) {
38933               delete inflight[url];
38934
38935               if (err) {
38936                   return callback(err);
38937               } else if (result && result.error) {
38938                   return callback(result.error);
38939               }
38940
38941               var extent = geoExtent$$1(location).padByMeters(200);
38942               nominatimCache.insert(assign(extent.bbox(), {data: result}));
38943
38944               callback(null, result);
38945           });
38946       },
38947
38948
38949       search: function (val, callback) {
38950           var searchVal = encodeURIComponent(val);
38951           var url = apibase$1 + 'search/' + searchVal + '?limit=10&format=json';
38952           if (inflight[url]) return;
38953
38954           inflight[url] = d3_json(url, function(err, result) {
38955               delete inflight[url];
38956               callback(err, result);
38957           });
38958       }
38959
38960   };
38961
38962   var apibase$2 = 'https://openstreetcam.org';
38963   var maxResults$1 = 1000;
38964   var tileZoom$1 = 14;
38965   var tiler$1 = utilTiler().zoomExtent([tileZoom$1, tileZoom$1]).skipNullIsland(true);
38966   var dispatch$2 = dispatch('loadedImages');
38967   var imgZoom = d3_zoom()
38968       .extent([[0, 0], [320, 240]])
38969       .translateExtent([[0, 0], [320, 240]])
38970       .scaleExtent([1, 15])
38971       .on('zoom', zoomPan);
38972   var _oscCache;
38973   var _oscSelectedImage;
38974
38975
38976   function abortRequest$1(i) {
38977       i.abort();
38978   }
38979
38980
38981   function maxPageAtZoom$1(z) {
38982       if (z < 15)   return 2;
38983       if (z === 15) return 5;
38984       if (z === 16) return 10;
38985       if (z === 17) return 20;
38986       if (z === 18) return 40;
38987       if (z > 18)   return 80;
38988   }
38989
38990
38991   function loadTiles$1(which, url, projection) {
38992       var currZoom = Math.floor(geoScaleToZoom(projection.scale()));
38993       var tiles = tiler$1.getTiles(projection);
38994
38995       // abort inflight requests that are no longer needed
38996       var cache = _oscCache[which];
38997       forEach(cache.inflight, function(v, k) {
38998           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
38999
39000           if (!wanted) {
39001               abortRequest$1(v);
39002               delete cache.inflight[k];
39003           }
39004       });
39005
39006       tiles.forEach(function(tile) {
39007           loadNextTilePage$1(which, currZoom, url, tile);
39008       });
39009   }
39010
39011
39012   function loadNextTilePage$1(which, currZoom, url, tile) {
39013       var cache = _oscCache[which];
39014       var bbox = tile.extent.bbox();
39015       var maxPages = maxPageAtZoom$1(currZoom);
39016       var nextPage = cache.nextPage[tile.id] || 1;
39017       var params = utilQsString({
39018           ipp: maxResults$1,
39019           page: nextPage,
39020           // client_id: clientId,
39021           bbTopLeft: [bbox.maxY, bbox.minX].join(','),
39022           bbBottomRight: [bbox.minY, bbox.maxX].join(',')
39023       }, true);
39024
39025       if (nextPage > maxPages) return;
39026
39027       var id = tile.id + ',' + String(nextPage);
39028       if (cache.loaded[id] || cache.inflight[id]) return;
39029
39030       cache.inflight[id] = request(url)
39031           .mimeType('application/json')
39032           .header('Content-type', 'application/x-www-form-urlencoded')
39033           .response(function(xhr) { return JSON.parse(xhr.responseText); })
39034           .post(params, function(err, data) {
39035               cache.loaded[id] = true;
39036               delete cache.inflight[id];
39037               if (err || !data.currentPageItems || !data.currentPageItems.length) return;
39038
39039               function localeDateString(s) {
39040                   if (!s) return null;
39041                   var detected = utilDetect();
39042                   var options = { day: 'numeric', month: 'short', year: 'numeric' };
39043                   var d = new Date(s);
39044                   if (isNaN(d.getTime())) return null;
39045                   return d.toLocaleDateString(detected.locale, options);
39046               }
39047
39048               var features = data.currentPageItems.map(function(item) {
39049                   var loc = [+item.lng, +item.lat];
39050                   var d;
39051
39052                   if (which === 'images') {
39053                       d = {
39054                           loc: loc,
39055                           key: item.id,
39056                           ca: +item.heading,
39057                           captured_at: localeDateString(item.shot_date || item.date_added),
39058                           captured_by: item.username,
39059                           imagePath: item.lth_name,
39060                           sequence_id: item.sequence_id,
39061                           sequence_index: +item.sequence_index
39062                       };
39063
39064                       // cache sequence info
39065                       var seq = _oscCache.sequences[d.sequence_id];
39066                       if (!seq) {
39067                           seq = { rotation: 0, images: [] };
39068                           _oscCache.sequences[d.sequence_id] = seq;
39069                       }
39070                       seq.images[d.sequence_index] = d;
39071                   }
39072
39073                   return {
39074                       minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
39075                   };
39076               });
39077
39078               cache.rtree.load(features);
39079
39080               if (which === 'images') {
39081                   dispatch$2.call('loadedImages');
39082               }
39083
39084               if (data.currentPageItems.length === maxResults$1) {  // more pages to load
39085                   cache.nextPage[tile.id] = nextPage + 1;
39086                   loadNextTilePage$1(which, currZoom, url, tile);
39087               } else {
39088                   cache.nextPage[tile.id] = Infinity;     // no more pages to load
39089               }
39090           });
39091   }
39092
39093
39094   // partition viewport into higher zoom tiles
39095   function partitionViewport$1(projection) {
39096       var z = geoScaleToZoom(projection.scale());
39097       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
39098       var tiler = utilTiler().zoomExtent([z2, z2]);
39099
39100       return tiler.getTiles(projection)
39101           .map(function(tile) { return tile.extent; });
39102   }
39103
39104
39105   // no more than `limit` results per partition.
39106   function searchLimited$1(limit, projection, rtree) {
39107       limit = limit || 5;
39108
39109       return partitionViewport$1(projection)
39110           .reduce(function(result, extent) {
39111               var found = rtree.search(extent.bbox())
39112                   .slice(0, limit)
39113                   .map(function(d) { return d.data; });
39114
39115               return (found.length ? result.concat(found) : result);
39116           }, []);
39117   }
39118
39119
39120   function zoomPan() {
39121       var t = event.transform;
39122       select('#photoviewer .osc-image-wrap')
39123           .call(utilSetTransform, t.x, t.y, t.k);
39124   }
39125
39126
39127   var serviceOpenstreetcam = {
39128
39129       init: function() {
39130           if (!_oscCache) {
39131               this.reset();
39132           }
39133
39134           this.event = utilRebind(this, dispatch$2, 'on');
39135       },
39136
39137       reset: function() {
39138           var cache = _oscCache;
39139
39140           if (cache) {
39141               if (cache.images && cache.images.inflight) {
39142                   forEach(cache.images.inflight, abortRequest$1);
39143               }
39144           }
39145
39146           _oscCache = {
39147               images: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1() },
39148               sequences: {}
39149           };
39150
39151           _oscSelectedImage = null;
39152       },
39153
39154
39155       images: function(projection) {
39156           var limit = 5;
39157           return searchLimited$1(limit, projection, _oscCache.images.rtree);
39158       },
39159
39160
39161       sequences: function(projection) {
39162           var viewport = projection.clipExtent();
39163           var min = [viewport[0][0], viewport[1][1]];
39164           var max = [viewport[1][0], viewport[0][1]];
39165           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
39166           var sequenceKeys = {};
39167
39168           // all sequences for images in viewport
39169           _oscCache.images.rtree.search(bbox)
39170               .forEach(function(d) { sequenceKeys[d.data.sequence_id] = true; });
39171
39172           // make linestrings from those sequences
39173           var lineStrings = [];
39174           Object.keys(sequenceKeys)
39175               .forEach(function(sequenceKey) {
39176                   var seq = _oscCache.sequences[sequenceKey];
39177                   var images = seq && seq.images;
39178                   if (images) {
39179                       lineStrings.push({
39180                           type: 'LineString',
39181                           coordinates: images.map(function (d) { return d.loc; }).filter(Boolean),
39182                           properties: { key: sequenceKey }
39183                       });
39184                   }
39185               });
39186           return lineStrings;
39187       },
39188
39189
39190       loadImages: function(projection) {
39191           var url = apibase$2 + '/1.0/list/nearby-photos/';
39192           loadTiles$1('images', url, projection);
39193       },
39194
39195
39196       loadViewer: function(context) {
39197           var that = this;
39198
39199           // add osc-wrapper
39200           var wrap = select('#photoviewer').selectAll('.osc-wrapper')
39201               .data([0]);
39202
39203           var wrapEnter = wrap.enter()
39204               .append('div')
39205               .attr('class', 'photo-wrapper osc-wrapper')
39206               .classed('hide', true)
39207               .call(imgZoom)
39208               .on('dblclick.zoom', null);
39209
39210           wrapEnter
39211               .append('div')
39212               .attr('class', 'photo-attribution fillD');
39213
39214           var controlsEnter = wrapEnter
39215               .append('div')
39216               .attr('class', 'photo-controls-wrap')
39217               .append('div')
39218               .attr('class', 'photo-controls');
39219
39220           controlsEnter
39221               .append('button')
39222               .on('click.back', step(-1))
39223               .text('◄');
39224
39225           controlsEnter
39226               .append('button')
39227               .on('click.rotate-ccw', rotate(-90))
39228               .text('⤿');
39229
39230           controlsEnter
39231               .append('button')
39232               .on('click.rotate-cw', rotate(90))
39233               .text('⤾');
39234
39235           controlsEnter
39236               .append('button')
39237               .on('click.forward', step(1))
39238               .text('►');
39239
39240           wrapEnter
39241               .append('div')
39242               .attr('class', 'osc-image-wrap');
39243
39244
39245           // Register viewer resize handler
39246           context.ui().photoviewer.on('resize', function(dimensions) {
39247               imgZoom = d3_zoom()
39248                   .extent([[0, 0], dimensions])
39249                   .translateExtent([[0, 0], dimensions])
39250                   .scaleExtent([1, 15])
39251                   .on('zoom', zoomPan);
39252           });
39253
39254
39255           function rotate(deg) {
39256               return function() {
39257                   if (!_oscSelectedImage) return;
39258                   var sequenceKey = _oscSelectedImage.sequence_id;
39259                   var sequence = _oscCache.sequences[sequenceKey];
39260                   if (!sequence) return;
39261
39262                   var r = sequence.rotation || 0;
39263                   r += deg;
39264
39265                   if (r > 180) r -= 360;
39266                   if (r < -180) r += 360;
39267                   sequence.rotation = r;
39268
39269                   var wrap = select('#photoviewer .osc-wrapper');
39270
39271                   wrap
39272                       .transition()
39273                       .duration(100)
39274                       .call(imgZoom.transform, identity$7);
39275
39276                   wrap.selectAll('.osc-image')
39277                       .transition()
39278                       .duration(100)
39279                       .style('transform', 'rotate(' + r + 'deg)');
39280               };
39281           }
39282
39283           function step(stepBy) {
39284               return function() {
39285                   if (!_oscSelectedImage) return;
39286                   var sequenceKey = _oscSelectedImage.sequence_id;
39287                   var sequence = _oscCache.sequences[sequenceKey];
39288                   if (!sequence) return;
39289
39290                   var nextIndex = _oscSelectedImage.sequence_index + stepBy;
39291                   var nextImage = sequence.images[nextIndex];
39292                   if (!nextImage) return;
39293
39294                   context.map().centerEase(nextImage.loc);
39295
39296                   that
39297                       .selectImage(nextImage)
39298                       .updateViewer(nextImage);
39299               };
39300           }
39301       },
39302
39303
39304       showViewer: function() {
39305           var viewer = select('#photoviewer')
39306               .classed('hide', false);
39307
39308           var isHidden = viewer.selectAll('.photo-wrapper.osc-wrapper.hide').size();
39309
39310           if (isHidden) {
39311               viewer
39312                   .selectAll('.photo-wrapper:not(.osc-wrapper)')
39313                   .classed('hide', true);
39314
39315               viewer
39316                   .selectAll('.photo-wrapper.osc-wrapper')
39317                   .classed('hide', false);
39318           }
39319
39320           return this;
39321       },
39322
39323
39324       hideViewer: function() {
39325           _oscSelectedImage = null;
39326
39327           var viewer = select('#photoviewer');
39328           if (!viewer.empty()) viewer.datum(null);
39329
39330           viewer
39331               .classed('hide', true)
39332               .selectAll('.photo-wrapper')
39333               .classed('hide', true);
39334
39335           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
39336               .classed('selected', false);
39337
39338           return this.setStyles(null, true);
39339       },
39340
39341
39342       updateViewer: function(d) {
39343           var wrap = select('#photoviewer .osc-wrapper');
39344           var imageWrap = wrap.selectAll('.osc-image-wrap');
39345           var attribution = wrap.selectAll('.photo-attribution').html('');
39346
39347           wrap
39348               .transition()
39349               .duration(100)
39350               .call(imgZoom.transform, identity$7);
39351
39352           imageWrap
39353               .selectAll('.osc-image')
39354               .remove();
39355
39356           if (d) {
39357               var sequence = _oscCache.sequences[d.sequence_id];
39358               var r = (sequence && sequence.rotation) || 0;
39359
39360               imageWrap
39361                   .append('img')
39362                   .attr('class', 'osc-image')
39363                   .attr('src', apibase$2 + '/' + d.imagePath)
39364                   .style('transform', 'rotate(' + r + 'deg)');
39365
39366               if (d.captured_by) {
39367                   attribution
39368                       .append('a')
39369                       .attr('class', 'captured_by')
39370                       .attr('target', '_blank')
39371                       .attr('href', 'https://openstreetcam.org/user/' + encodeURIComponent(d.captured_by))
39372                       .text('@' + d.captured_by);
39373
39374                   attribution
39375                       .append('span')
39376                       .text('|');
39377               }
39378
39379               if (d.captured_at) {
39380                   attribution
39381                       .append('span')
39382                       .attr('class', 'captured_at')
39383                       .text(d.captured_at);
39384
39385                   attribution
39386                       .append('span')
39387                       .text('|');
39388               }
39389
39390               attribution
39391                   .append('a')
39392                   .attr('class', 'image-link')
39393                   .attr('target', '_blank')
39394                   .attr('href', 'https://openstreetcam.org/details/' + d.sequence_id + '/' + d.sequence_index)
39395                   .text('openstreetcam.org');
39396           }
39397           return this;
39398       },
39399
39400
39401       selectImage: function(d) {
39402           _oscSelectedImage = d;
39403           var viewer = select('#photoviewer');
39404           if (!viewer.empty()) viewer.datum(d);
39405
39406           this.setStyles(null, true);
39407
39408           d3_selectAll('.icon-sign')
39409               .classed('selected', false);
39410
39411           return this;
39412       },
39413
39414
39415       getSelectedImage: function() {
39416           return _oscSelectedImage;
39417       },
39418
39419
39420       getSequenceKeyForImage: function(d) {
39421           return d && d.sequence_id;
39422       },
39423
39424
39425       setStyles: function(hovered, reset) {
39426           if (reset) {  // reset all layers
39427               d3_selectAll('.viewfield-group')
39428                   .classed('highlighted', false)
39429                   .classed('hovered', false)
39430                   .classed('selected', false);
39431
39432               d3_selectAll('.sequence')
39433                   .classed('highlighted', false)
39434                   .classed('selected', false);
39435           }
39436
39437           var hoveredImageKey = hovered && hovered.key;
39438           var hoveredSequenceKey = this.getSequenceKeyForImage(hovered);
39439           var hoveredSequence = hoveredSequenceKey && _oscCache.sequences[hoveredSequenceKey];
39440           var hoveredImageKeys = (hoveredSequence && hoveredSequence.images.map(function (d) { return d.key; })) || [];
39441
39442           var viewer = select('#photoviewer');
39443           var selected = viewer.empty() ? undefined : viewer.datum();
39444           var selectedImageKey = selected && selected.key;
39445           var selectedSequenceKey = this.getSequenceKeyForImage(selected);
39446           var selectedSequence = selectedSequenceKey && _oscCache.sequences[selectedSequenceKey];
39447           var selectedImageKeys = (selectedSequence && selectedSequence.images.map(function (d) { return d.key; })) || [];
39448
39449           // highlight sibling viewfields on either the selected or the hovered sequences
39450           var highlightedImageKeys = union(hoveredImageKeys, selectedImageKeys);
39451
39452           d3_selectAll('.layer-openstreetcam-images .viewfield-group')
39453               .classed('highlighted', function(d) { return highlightedImageKeys.indexOf(d.key) !== -1; })
39454               .classed('hovered', function(d) { return d.key === hoveredImageKey; })
39455               .classed('selected', function(d) { return d.key === selectedImageKey; });
39456
39457           d3_selectAll('.layer-openstreetcam-images .sequence')
39458               .classed('highlighted', function(d) { return d.properties.key === hoveredSequenceKey; })
39459               .classed('selected', function(d) { return d.properties.key === selectedSequenceKey; });
39460
39461           // update viewfields if needed
39462           d3_selectAll('.viewfield-group .viewfield')
39463               .attr('d', viewfieldPath);
39464
39465           function viewfieldPath() {
39466               var d = this.parentNode.__data__;
39467               if (d.pano && d.key !== selectedImageKey) {
39468                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
39469               } else {
39470                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
39471               }
39472           }
39473
39474           return this;
39475       },
39476
39477
39478       cache: function() {
39479           return _oscCache;
39480       }
39481
39482   };
39483
39484   /* Built-in method references for those with the same name as other `lodash` methods. */
39485   var nativeCeil = Math.ceil,
39486       nativeMax$4 = Math.max;
39487
39488   /**
39489    * Creates an array of elements split into groups the length of `size`.
39490    * If `array` can't be split evenly, the final chunk will be the remaining
39491    * elements.
39492    *
39493    * @static
39494    * @memberOf _
39495    * @since 3.0.0
39496    * @category Array
39497    * @param {Array} array The array to process.
39498    * @param {number} [size=1] The length of each chunk
39499    * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.
39500    * @returns {Array} Returns the new array of chunks.
39501    * @example
39502    *
39503    * _.chunk(['a', 'b', 'c', 'd'], 2);
39504    * // => [['a', 'b'], ['c', 'd']]
39505    *
39506    * _.chunk(['a', 'b', 'c', 'd'], 3);
39507    * // => [['a', 'b', 'c'], ['d']]
39508    */
39509   function chunk(array, size, guard) {
39510     if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {
39511       size = 1;
39512     } else {
39513       size = nativeMax$4(toInteger(size), 0);
39514     }
39515     var length = array == null ? 0 : array.length;
39516     if (!length || size < 1) {
39517       return [];
39518     }
39519     var index = 0,
39520         resIndex = 0,
39521         result = Array(nativeCeil(length / size));
39522
39523     while (index < length) {
39524       result[resIndex++] = baseSlice(array, index, (index += size));
39525     }
39526     return result;
39527   }
39528
39529   var hashes = createCommonjsModule(function (module, exports) {
39530   /**
39531    * jshashes - https://github.com/h2non/jshashes
39532    * Released under the "New BSD" license
39533    *
39534    * Algorithms specification:
39535    *
39536    * MD5 - http://www.ietf.org/rfc/rfc1321.txt
39537    * RIPEMD-160 - http://homes.esat.kuleuven.be/~bosselae/ripemd160.html
39538    * SHA1   - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39539    * SHA256 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39540    * SHA512 - http://csrc.nist.gov/publications/fips/fips180-4/fips-180-4.pdf
39541    * HMAC - http://www.ietf.org/rfc/rfc2104.txt
39542    */
39543   (function() {
39544     var Hashes;
39545
39546     function utf8Encode(str) {
39547       var x, y, output = '',
39548         i = -1,
39549         l;
39550
39551       if (str && str.length) {
39552         l = str.length;
39553         while ((i += 1) < l) {
39554           /* Decode utf-16 surrogate pairs */
39555           x = str.charCodeAt(i);
39556           y = i + 1 < l ? str.charCodeAt(i + 1) : 0;
39557           if (0xD800 <= x && x <= 0xDBFF && 0xDC00 <= y && y <= 0xDFFF) {
39558             x = 0x10000 + ((x & 0x03FF) << 10) + (y & 0x03FF);
39559             i += 1;
39560           }
39561           /* Encode output as utf-8 */
39562           if (x <= 0x7F) {
39563             output += String.fromCharCode(x);
39564           } else if (x <= 0x7FF) {
39565             output += String.fromCharCode(0xC0 | ((x >>> 6) & 0x1F),
39566               0x80 | (x & 0x3F));
39567           } else if (x <= 0xFFFF) {
39568             output += String.fromCharCode(0xE0 | ((x >>> 12) & 0x0F),
39569               0x80 | ((x >>> 6) & 0x3F),
39570               0x80 | (x & 0x3F));
39571           } else if (x <= 0x1FFFFF) {
39572             output += String.fromCharCode(0xF0 | ((x >>> 18) & 0x07),
39573               0x80 | ((x >>> 12) & 0x3F),
39574               0x80 | ((x >>> 6) & 0x3F),
39575               0x80 | (x & 0x3F));
39576           }
39577         }
39578       }
39579       return output;
39580     }
39581
39582     function utf8Decode(str) {
39583       var i, ac, c1, c2, c3, arr = [],
39584         l;
39585       i = ac = c1 = c2 = c3 = 0;
39586
39587       if (str && str.length) {
39588         l = str.length;
39589         str += '';
39590
39591         while (i < l) {
39592           c1 = str.charCodeAt(i);
39593           ac += 1;
39594           if (c1 < 128) {
39595             arr[ac] = String.fromCharCode(c1);
39596             i += 1;
39597           } else if (c1 > 191 && c1 < 224) {
39598             c2 = str.charCodeAt(i + 1);
39599             arr[ac] = String.fromCharCode(((c1 & 31) << 6) | (c2 & 63));
39600             i += 2;
39601           } else {
39602             c2 = str.charCodeAt(i + 1);
39603             c3 = str.charCodeAt(i + 2);
39604             arr[ac] = String.fromCharCode(((c1 & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63));
39605             i += 3;
39606           }
39607         }
39608       }
39609       return arr.join('');
39610     }
39611
39612     /**
39613      * Add integers, wrapping at 2^32. This uses 16-bit operations internally
39614      * to work around bugs in some JS interpreters.
39615      */
39616
39617     function safe_add(x, y) {
39618       var lsw = (x & 0xFFFF) + (y & 0xFFFF),
39619         msw = (x >> 16) + (y >> 16) + (lsw >> 16);
39620       return (msw << 16) | (lsw & 0xFFFF);
39621     }
39622
39623     /**
39624      * Bitwise rotate a 32-bit number to the left.
39625      */
39626
39627     function bit_rol(num, cnt) {
39628       return (num << cnt) | (num >>> (32 - cnt));
39629     }
39630
39631     /**
39632      * Convert a raw string to a hex string
39633      */
39634
39635     function rstr2hex(input, hexcase) {
39636       var hex_tab = hexcase ? '0123456789ABCDEF' : '0123456789abcdef',
39637         output = '',
39638         x, i = 0,
39639         l = input.length;
39640       for (; i < l; i += 1) {
39641         x = input.charCodeAt(i);
39642         output += hex_tab.charAt((x >>> 4) & 0x0F) + hex_tab.charAt(x & 0x0F);
39643       }
39644       return output;
39645     }
39646
39647     /**
39648      * Convert an array of big-endian words to a string
39649      */
39650
39651     function binb2rstr(input) {
39652       var i, l = input.length * 32,
39653         output = '';
39654       for (i = 0; i < l; i += 8) {
39655         output += String.fromCharCode((input[i >> 5] >>> (24 - i % 32)) & 0xFF);
39656       }
39657       return output;
39658     }
39659
39660     /**
39661      * Convert an array of little-endian words to a string
39662      */
39663
39664     function binl2rstr(input) {
39665       var i, l = input.length * 32,
39666         output = '';
39667       for (i = 0; i < l; i += 8) {
39668         output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
39669       }
39670       return output;
39671     }
39672
39673     /**
39674      * Convert a raw string to an array of little-endian words
39675      * Characters >255 have their high-byte silently ignored.
39676      */
39677
39678     function rstr2binl(input) {
39679       var i, l = input.length * 8,
39680         output = Array(input.length >> 2),
39681         lo = output.length;
39682       for (i = 0; i < lo; i += 1) {
39683         output[i] = 0;
39684       }
39685       for (i = 0; i < l; i += 8) {
39686         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (i % 32);
39687       }
39688       return output;
39689     }
39690
39691     /**
39692      * Convert a raw string to an array of big-endian words
39693      * Characters >255 have their high-byte silently ignored.
39694      */
39695
39696     function rstr2binb(input) {
39697       var i, l = input.length * 8,
39698         output = Array(input.length >> 2),
39699         lo = output.length;
39700       for (i = 0; i < lo; i += 1) {
39701         output[i] = 0;
39702       }
39703       for (i = 0; i < l; i += 8) {
39704         output[i >> 5] |= (input.charCodeAt(i / 8) & 0xFF) << (24 - i % 32);
39705       }
39706       return output;
39707     }
39708
39709     /**
39710      * Convert a raw string to an arbitrary string encoding
39711      */
39712
39713     function rstr2any(input, encoding) {
39714       var divisor = encoding.length,
39715         remainders = Array(),
39716         i, q, x, ld, quotient, dividend, output, full_length;
39717
39718       /* Convert to an array of 16-bit big-endian values, forming the dividend */
39719       dividend = Array(Math.ceil(input.length / 2));
39720       ld = dividend.length;
39721       for (i = 0; i < ld; i += 1) {
39722         dividend[i] = (input.charCodeAt(i * 2) << 8) | input.charCodeAt(i * 2 + 1);
39723       }
39724
39725       /**
39726        * Repeatedly perform a long division. The binary array forms the dividend,
39727        * the length of the encoding is the divisor. Once computed, the quotient
39728        * forms the dividend for the next step. We stop when the dividend is zerHashes.
39729        * All remainders are stored for later use.
39730        */
39731       while (dividend.length > 0) {
39732         quotient = Array();
39733         x = 0;
39734         for (i = 0; i < dividend.length; i += 1) {
39735           x = (x << 16) + dividend[i];
39736           q = Math.floor(x / divisor);
39737           x -= q * divisor;
39738           if (quotient.length > 0 || q > 0) {
39739             quotient[quotient.length] = q;
39740           }
39741         }
39742         remainders[remainders.length] = x;
39743         dividend = quotient;
39744       }
39745
39746       /* Convert the remainders to the output string */
39747       output = '';
39748       for (i = remainders.length - 1; i >= 0; i--) {
39749         output += encoding.charAt(remainders[i]);
39750       }
39751
39752       /* Append leading zero equivalents */
39753       full_length = Math.ceil(input.length * 8 / (Math.log(encoding.length) / Math.log(2)));
39754       for (i = output.length; i < full_length; i += 1) {
39755         output = encoding[0] + output;
39756       }
39757       return output;
39758     }
39759
39760     /**
39761      * Convert a raw string to a base-64 string
39762      */
39763
39764     function rstr2b64(input, b64pad) {
39765       var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
39766         output = '',
39767         len = input.length,
39768         i, j, triplet;
39769       b64pad = b64pad || '=';
39770       for (i = 0; i < len; i += 3) {
39771         triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
39772         for (j = 0; j < 4; j += 1) {
39773           if (i * 8 + j * 6 > input.length * 8) {
39774             output += b64pad;
39775           } else {
39776             output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
39777           }
39778         }
39779       }
39780       return output;
39781     }
39782
39783     Hashes = {
39784       /**
39785        * @property {String} version
39786        * @readonly
39787        */
39788       VERSION: '1.0.6',
39789       /**
39790        * @member Hashes
39791        * @class Base64
39792        * @constructor
39793        */
39794       Base64: function() {
39795         // private properties
39796         var tab = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/',
39797           pad = '=', // default pad according with the RFC standard
39798           utf8 = true; // by default enable UTF-8 support encoding
39799
39800         // public method for encoding
39801         this.encode = function(input) {
39802           var i, j, triplet,
39803             output = '',
39804             len = input.length;
39805
39806           pad = pad || '=';
39807           input = (utf8) ? utf8Encode(input) : input;
39808
39809           for (i = 0; i < len; i += 3) {
39810             triplet = (input.charCodeAt(i) << 16) | (i + 1 < len ? input.charCodeAt(i + 1) << 8 : 0) | (i + 2 < len ? input.charCodeAt(i + 2) : 0);
39811             for (j = 0; j < 4; j += 1) {
39812               if (i * 8 + j * 6 > len * 8) {
39813                 output += pad;
39814               } else {
39815                 output += tab.charAt((triplet >>> 6 * (3 - j)) & 0x3F);
39816               }
39817             }
39818           }
39819           return output;
39820         };
39821
39822         // public method for decoding
39823         this.decode = function(input) {
39824           // var b64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
39825           var i, o1, o2, o3, h1, h2, h3, h4, bits, ac,
39826             dec = '',
39827             arr = [];
39828           if (!input) {
39829             return input;
39830           }
39831
39832           i = ac = 0;
39833           input = input.replace(new RegExp('\\' + pad, 'gi'), ''); // use '='
39834           //input += '';
39835
39836           do { // unpack four hexets into three octets using index points in b64
39837             h1 = tab.indexOf(input.charAt(i += 1));
39838             h2 = tab.indexOf(input.charAt(i += 1));
39839             h3 = tab.indexOf(input.charAt(i += 1));
39840             h4 = tab.indexOf(input.charAt(i += 1));
39841
39842             bits = h1 << 18 | h2 << 12 | h3 << 6 | h4;
39843
39844             o1 = bits >> 16 & 0xff;
39845             o2 = bits >> 8 & 0xff;
39846             o3 = bits & 0xff;
39847             ac += 1;
39848
39849             if (h3 === 64) {
39850               arr[ac] = String.fromCharCode(o1);
39851             } else if (h4 === 64) {
39852               arr[ac] = String.fromCharCode(o1, o2);
39853             } else {
39854               arr[ac] = String.fromCharCode(o1, o2, o3);
39855             }
39856           } while (i < input.length);
39857
39858           dec = arr.join('');
39859           dec = (utf8) ? utf8Decode(dec) : dec;
39860
39861           return dec;
39862         };
39863
39864         // set custom pad string
39865         this.setPad = function(str) {
39866           pad = str || pad;
39867           return this;
39868         };
39869         // set custom tab string characters
39870         this.setTab = function(str) {
39871           tab = str || tab;
39872           return this;
39873         };
39874         this.setUTF8 = function(bool) {
39875           if (typeof bool === 'boolean') {
39876             utf8 = bool;
39877           }
39878           return this;
39879         };
39880       },
39881
39882       /**
39883        * CRC-32 calculation
39884        * @member Hashes
39885        * @method CRC32
39886        * @static
39887        * @param {String} str Input String
39888        * @return {String}
39889        */
39890       CRC32: function(str) {
39891         var crc = 0,
39892           x = 0,
39893           y = 0,
39894           table, i, iTop;
39895         str = utf8Encode(str);
39896
39897         table = [
39898           '00000000 77073096 EE0E612C 990951BA 076DC419 706AF48F E963A535 9E6495A3 0EDB8832 ',
39899           '79DCB8A4 E0D5E91E 97D2D988 09B64C2B 7EB17CBD E7B82D07 90BF1D91 1DB71064 6AB020F2 F3B97148 ',
39900           '84BE41DE 1ADAD47D 6DDDE4EB F4D4B551 83D385C7 136C9856 646BA8C0 FD62F97A 8A65C9EC 14015C4F ',
39901           '63066CD9 FA0F3D63 8D080DF5 3B6E20C8 4C69105E D56041E4 A2677172 3C03E4D1 4B04D447 D20D85FD ',
39902           'A50AB56B 35B5A8FA 42B2986C DBBBC9D6 ACBCF940 32D86CE3 45DF5C75 DCD60DCF ABD13D59 26D930AC ',
39903           '51DE003A C8D75180 BFD06116 21B4F4B5 56B3C423 CFBA9599 B8BDA50F 2802B89E 5F058808 C60CD9B2 ',
39904           'B10BE924 2F6F7C87 58684C11 C1611DAB B6662D3D 76DC4190 01DB7106 98D220BC EFD5102A 71B18589 ',
39905           '06B6B51F 9FBFE4A5 E8B8D433 7807C9A2 0F00F934 9609A88E E10E9818 7F6A0DBB 086D3D2D 91646C97 ',
39906           'E6635C01 6B6B51F4 1C6C6162 856530D8 F262004E 6C0695ED 1B01A57B 8208F4C1 F50FC457 65B0D9C6 ',
39907           '12B7E950 8BBEB8EA FCB9887C 62DD1DDF 15DA2D49 8CD37CF3 FBD44C65 4DB26158 3AB551CE A3BC0074 ',
39908           'D4BB30E2 4ADFA541 3DD895D7 A4D1C46D D3D6F4FB 4369E96A 346ED9FC AD678846 DA60B8D0 44042D73 ',
39909           '33031DE5 AA0A4C5F DD0D7CC9 5005713C 270241AA BE0B1010 C90C2086 5768B525 206F85B3 B966D409 ',
39910           'CE61E49F 5EDEF90E 29D9C998 B0D09822 C7D7A8B4 59B33D17 2EB40D81 B7BD5C3B C0BA6CAD EDB88320 ',
39911           '9ABFB3B6 03B6E20C 74B1D29A EAD54739 9DD277AF 04DB2615 73DC1683 E3630B12 94643B84 0D6D6A3E ',
39912           '7A6A5AA8 E40ECF0B 9309FF9D 0A00AE27 7D079EB1 F00F9344 8708A3D2 1E01F268 6906C2FE F762575D ',
39913           '806567CB 196C3671 6E6B06E7 FED41B76 89D32BE0 10DA7A5A 67DD4ACC F9B9DF6F 8EBEEFF9 17B7BE43 ',
39914           '60B08ED5 D6D6A3E8 A1D1937E 38D8C2C4 4FDFF252 D1BB67F1 A6BC5767 3FB506DD 48B2364B D80D2BDA ',
39915           'AF0A1B4C 36034AF6 41047A60 DF60EFC3 A867DF55 316E8EEF 4669BE79 CB61B38C BC66831A 256FD2A0 ',
39916           '5268E236 CC0C7795 BB0B4703 220216B9 5505262F C5BA3BBE B2BD0B28 2BB45A92 5CB36A04 C2D7FFA7 ',
39917           'B5D0CF31 2CD99E8B 5BDEAE1D 9B64C2B0 EC63F226 756AA39C 026D930A 9C0906A9 EB0E363F 72076785 ',
39918           '05005713 95BF4A82 E2B87A14 7BB12BAE 0CB61B38 92D28E9B E5D5BE0D 7CDCEFB7 0BDBDF21 86D3D2D4 ',
39919           'F1D4E242 68DDB3F8 1FDA836E 81BE16CD F6B9265B 6FB077E1 18B74777 88085AE6 FF0F6A70 66063BCA ',
39920           '11010B5C 8F659EFF F862AE69 616BFFD3 166CCF45 A00AE278 D70DD2EE 4E048354 3903B3C2 A7672661 ',
39921           'D06016F7 4969474D 3E6E77DB AED16A4A D9D65ADC 40DF0B66 37D83BF0 A9BCAE53 DEBB9EC5 47B2CF7F ',
39922           '30B5FFE9 BDBDF21C CABAC28A 53B39330 24B4A3A6 BAD03605 CDD70693 54DE5729 23D967BF B3667A2E ',
39923           'C4614AB8 5D681B02 2A6F2B94 B40BBE37 C30C8EA1 5A05DF1B 2D02EF8D'
39924         ].join('');
39925
39926         crc = crc ^ (-1);
39927         for (i = 0, iTop = str.length; i < iTop; i += 1) {
39928           y = (crc ^ str.charCodeAt(i)) & 0xFF;
39929           x = '0x' + table.substr(y * 9, 8);
39930           crc = (crc >>> 8) ^ x;
39931         }
39932         // always return a positive number (that's what >>> 0 does)
39933         return (crc ^ (-1)) >>> 0;
39934       },
39935       /**
39936        * @member Hashes
39937        * @class MD5
39938        * @constructor
39939        * @param {Object} [config]
39940        *
39941        * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
39942        * Digest Algorithm, as defined in RFC 1321.
39943        * Version 2.2 Copyright (C) Paul Johnston 1999 - 2009
39944        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
39945        * See <http://pajhome.org.uk/crypt/md5> for more infHashes.
39946        */
39947       MD5: function(options) {
39948         /**
39949          * Private config properties. You may need to tweak these to be compatible with
39950          * the server-side, but the defaults work in most cases.
39951          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
39952          */
39953         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
39954           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
39955           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
39956
39957         // privileged (public) methods
39958         this.hex = function(s) {
39959           return rstr2hex(rstr(s, utf8), hexcase);
39960         };
39961         this.b64 = function(s) {
39962           return rstr2b64(rstr(s), b64pad);
39963         };
39964         this.any = function(s, e) {
39965           return rstr2any(rstr(s, utf8), e);
39966         };
39967         this.raw = function(s) {
39968           return rstr(s, utf8);
39969         };
39970         this.hex_hmac = function(k, d) {
39971           return rstr2hex(rstr_hmac(k, d), hexcase);
39972         };
39973         this.b64_hmac = function(k, d) {
39974           return rstr2b64(rstr_hmac(k, d), b64pad);
39975         };
39976         this.any_hmac = function(k, d, e) {
39977           return rstr2any(rstr_hmac(k, d), e);
39978         };
39979         /**
39980          * Perform a simple self-test to see if the VM is working
39981          * @return {String} Hexadecimal hash sample
39982          */
39983         this.vm_test = function() {
39984           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
39985         };
39986         /**
39987          * Enable/disable uppercase hexadecimal returned string
39988          * @param {Boolean}
39989          * @return {Object} this
39990          */
39991         this.setUpperCase = function(a) {
39992           if (typeof a === 'boolean') {
39993             hexcase = a;
39994           }
39995           return this;
39996         };
39997         /**
39998          * Defines a base64 pad string
39999          * @param {String} Pad
40000          * @return {Object} this
40001          */
40002         this.setPad = function(a) {
40003           b64pad = a || b64pad;
40004           return this;
40005         };
40006         /**
40007          * Defines a base64 pad string
40008          * @param {Boolean}
40009          * @return {Object} [this]
40010          */
40011         this.setUTF8 = function(a) {
40012           if (typeof a === 'boolean') {
40013             utf8 = a;
40014           }
40015           return this;
40016         };
40017
40018         // private methods
40019
40020         /**
40021          * Calculate the MD5 of a raw string
40022          */
40023
40024         function rstr(s) {
40025           s = (utf8) ? utf8Encode(s) : s;
40026           return binl2rstr(binl(rstr2binl(s), s.length * 8));
40027         }
40028
40029         /**
40030          * Calculate the HMAC-MD5, of a key and some data (raw strings)
40031          */
40032
40033         function rstr_hmac(key, data) {
40034           var bkey, ipad, opad, hash, i;
40035
40036           key = (utf8) ? utf8Encode(key) : key;
40037           data = (utf8) ? utf8Encode(data) : data;
40038           bkey = rstr2binl(key);
40039           if (bkey.length > 16) {
40040             bkey = binl(bkey, key.length * 8);
40041           }
40042
40043           ipad = Array(16), opad = Array(16);
40044           for (i = 0; i < 16; i += 1) {
40045             ipad[i] = bkey[i] ^ 0x36363636;
40046             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40047           }
40048           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
40049           return binl2rstr(binl(opad.concat(hash), 512 + 128));
40050         }
40051
40052         /**
40053          * Calculate the MD5 of an array of little-endian words, and a bit length.
40054          */
40055
40056         function binl(x, len) {
40057           var i, olda, oldb, oldc, oldd,
40058             a = 1732584193,
40059             b = -271733879,
40060             c = -1732584194,
40061             d = 271733878;
40062
40063           /* append padding */
40064           x[len >> 5] |= 0x80 << ((len) % 32);
40065           x[(((len + 64) >>> 9) << 4) + 14] = len;
40066
40067           for (i = 0; i < x.length; i += 16) {
40068             olda = a;
40069             oldb = b;
40070             oldc = c;
40071             oldd = d;
40072
40073             a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
40074             d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
40075             c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
40076             b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
40077             a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
40078             d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
40079             c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
40080             b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
40081             a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
40082             d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
40083             c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
40084             b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
40085             a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
40086             d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
40087             c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
40088             b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
40089
40090             a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
40091             d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
40092             c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
40093             b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
40094             a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
40095             d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
40096             c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
40097             b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
40098             a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
40099             d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
40100             c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
40101             b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
40102             a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
40103             d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
40104             c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
40105             b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
40106
40107             a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
40108             d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
40109             c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
40110             b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
40111             a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
40112             d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
40113             c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
40114             b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
40115             a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
40116             d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
40117             c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
40118             b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
40119             a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
40120             d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
40121             c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
40122             b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
40123
40124             a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
40125             d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
40126             c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
40127             b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
40128             a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
40129             d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
40130             c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
40131             b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
40132             a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
40133             d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
40134             c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
40135             b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
40136             a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
40137             d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
40138             c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
40139             b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
40140
40141             a = safe_add(a, olda);
40142             b = safe_add(b, oldb);
40143             c = safe_add(c, oldc);
40144             d = safe_add(d, oldd);
40145           }
40146           return Array(a, b, c, d);
40147         }
40148
40149         /**
40150          * These functions implement the four basic operations the algorithm uses.
40151          */
40152
40153         function md5_cmn(q, a, b, x, s, t) {
40154           return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
40155         }
40156
40157         function md5_ff(a, b, c, d, x, s, t) {
40158           return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
40159         }
40160
40161         function md5_gg(a, b, c, d, x, s, t) {
40162           return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
40163         }
40164
40165         function md5_hh(a, b, c, d, x, s, t) {
40166           return md5_cmn(b ^ c ^ d, a, b, x, s, t);
40167         }
40168
40169         function md5_ii(a, b, c, d, x, s, t) {
40170           return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
40171         }
40172       },
40173       /**
40174        * @member Hashes
40175        * @class Hashes.SHA1
40176        * @param {Object} [config]
40177        * @constructor
40178        *
40179        * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined in FIPS 180-1
40180        * Version 2.2 Copyright Paul Johnston 2000 - 2009.
40181        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40182        * See http://pajhome.org.uk/crypt/md5 for details.
40183        */
40184       SHA1: function(options) {
40185         /**
40186          * Private config properties. You may need to tweak these to be compatible with
40187          * the server-side, but the defaults work in most cases.
40188          * See {@link Hashes.MD5#method-setUpperCase} and {@link Hashes.SHA1#method-setUpperCase}
40189          */
40190         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase
40191           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=', // base-64 pad character. Defaults to '=' for strict RFC compliance
40192           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true; // enable/disable utf8 encoding
40193
40194         // public methods
40195         this.hex = function(s) {
40196           return rstr2hex(rstr(s, utf8), hexcase);
40197         };
40198         this.b64 = function(s) {
40199           return rstr2b64(rstr(s, utf8), b64pad);
40200         };
40201         this.any = function(s, e) {
40202           return rstr2any(rstr(s, utf8), e);
40203         };
40204         this.raw = function(s) {
40205           return rstr(s, utf8);
40206         };
40207         this.hex_hmac = function(k, d) {
40208           return rstr2hex(rstr_hmac(k, d));
40209         };
40210         this.b64_hmac = function(k, d) {
40211           return rstr2b64(rstr_hmac(k, d), b64pad);
40212         };
40213         this.any_hmac = function(k, d, e) {
40214           return rstr2any(rstr_hmac(k, d), e);
40215         };
40216         /**
40217          * Perform a simple self-test to see if the VM is working
40218          * @return {String} Hexadecimal hash sample
40219          * @public
40220          */
40221         this.vm_test = function() {
40222           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40223         };
40224         /**
40225          * @description Enable/disable uppercase hexadecimal returned string
40226          * @param {boolean}
40227          * @return {Object} this
40228          * @public
40229          */
40230         this.setUpperCase = function(a) {
40231           if (typeof a === 'boolean') {
40232             hexcase = a;
40233           }
40234           return this;
40235         };
40236         /**
40237          * @description Defines a base64 pad string
40238          * @param {string} Pad
40239          * @return {Object} this
40240          * @public
40241          */
40242         this.setPad = function(a) {
40243           b64pad = a || b64pad;
40244           return this;
40245         };
40246         /**
40247          * @description Defines a base64 pad string
40248          * @param {boolean}
40249          * @return {Object} this
40250          * @public
40251          */
40252         this.setUTF8 = function(a) {
40253           if (typeof a === 'boolean') {
40254             utf8 = a;
40255           }
40256           return this;
40257         };
40258
40259         // private methods
40260
40261         /**
40262          * Calculate the SHA-512 of a raw string
40263          */
40264
40265         function rstr(s) {
40266           s = (utf8) ? utf8Encode(s) : s;
40267           return binb2rstr(binb(rstr2binb(s), s.length * 8));
40268         }
40269
40270         /**
40271          * Calculate the HMAC-SHA1 of a key and some data (raw strings)
40272          */
40273
40274         function rstr_hmac(key, data) {
40275           var bkey, ipad, opad, i, hash;
40276           key = (utf8) ? utf8Encode(key) : key;
40277           data = (utf8) ? utf8Encode(data) : data;
40278           bkey = rstr2binb(key);
40279
40280           if (bkey.length > 16) {
40281             bkey = binb(bkey, key.length * 8);
40282           }
40283           ipad = Array(16), opad = Array(16);
40284           for (i = 0; i < 16; i += 1) {
40285             ipad[i] = bkey[i] ^ 0x36363636;
40286             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40287           }
40288           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
40289           return binb2rstr(binb(opad.concat(hash), 512 + 160));
40290         }
40291
40292         /**
40293          * Calculate the SHA-1 of an array of big-endian words, and a bit length
40294          */
40295
40296         function binb(x, len) {
40297           var i, j, t, olda, oldb, oldc, oldd, olde,
40298             w = Array(80),
40299             a = 1732584193,
40300             b = -271733879,
40301             c = -1732584194,
40302             d = 271733878,
40303             e = -1009589776;
40304
40305           /* append padding */
40306           x[len >> 5] |= 0x80 << (24 - len % 32);
40307           x[((len + 64 >> 9) << 4) + 15] = len;
40308
40309           for (i = 0; i < x.length; i += 16) {
40310             olda = a;
40311             oldb = b;
40312             oldc = c;
40313             oldd = d;
40314             olde = e;
40315
40316             for (j = 0; j < 80; j += 1) {
40317               if (j < 16) {
40318                 w[j] = x[i + j];
40319               } else {
40320                 w[j] = bit_rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1);
40321               }
40322               t = safe_add(safe_add(bit_rol(a, 5), sha1_ft(j, b, c, d)),
40323                 safe_add(safe_add(e, w[j]), sha1_kt(j)));
40324               e = d;
40325               d = c;
40326               c = bit_rol(b, 30);
40327               b = a;
40328               a = t;
40329             }
40330
40331             a = safe_add(a, olda);
40332             b = safe_add(b, oldb);
40333             c = safe_add(c, oldc);
40334             d = safe_add(d, oldd);
40335             e = safe_add(e, olde);
40336           }
40337           return Array(a, b, c, d, e);
40338         }
40339
40340         /**
40341          * Perform the appropriate triplet combination function for the current
40342          * iteration
40343          */
40344
40345         function sha1_ft(t, b, c, d) {
40346           if (t < 20) {
40347             return (b & c) | ((~b) & d);
40348           }
40349           if (t < 40) {
40350             return b ^ c ^ d;
40351           }
40352           if (t < 60) {
40353             return (b & c) | (b & d) | (c & d);
40354           }
40355           return b ^ c ^ d;
40356         }
40357
40358         /**
40359          * Determine the appropriate additive constant for the current iteration
40360          */
40361
40362         function sha1_kt(t) {
40363           return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 :
40364             (t < 60) ? -1894007588 : -899497514;
40365         }
40366       },
40367       /**
40368        * @class Hashes.SHA256
40369        * @param {config}
40370        *
40371        * A JavaScript implementation of the Secure Hash Algorithm, SHA-256, as defined in FIPS 180-2
40372        * Version 2.2 Copyright Angel Marin, Paul Johnston 2000 - 2009.
40373        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40374        * See http://pajhome.org.uk/crypt/md5 for details.
40375        * Also http://anmar.eu.org/projects/jssha2/
40376        */
40377       SHA256: function(options) {
40378         /**
40379          * Private properties configuration variables. You may need to tweak these to be compatible with
40380          * the server-side, but the defaults work in most cases.
40381          * @see this.setUpperCase() method
40382          * @see this.setPad() method
40383          */
40384         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false, // hexadecimal output case format. false - lowercase; true - uppercase  */
40385           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
40386           /* base-64 pad character. Default '=' for strict RFC compliance   */
40387           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40388           /* enable/disable utf8 encoding */
40389           sha256_K;
40390
40391         /* privileged (public) methods */
40392         this.hex = function(s) {
40393           return rstr2hex(rstr(s, utf8));
40394         };
40395         this.b64 = function(s) {
40396           return rstr2b64(rstr(s, utf8), b64pad);
40397         };
40398         this.any = function(s, e) {
40399           return rstr2any(rstr(s, utf8), e);
40400         };
40401         this.raw = function(s) {
40402           return rstr(s, utf8);
40403         };
40404         this.hex_hmac = function(k, d) {
40405           return rstr2hex(rstr_hmac(k, d));
40406         };
40407         this.b64_hmac = function(k, d) {
40408           return rstr2b64(rstr_hmac(k, d), b64pad);
40409         };
40410         this.any_hmac = function(k, d, e) {
40411           return rstr2any(rstr_hmac(k, d), e);
40412         };
40413         /**
40414          * Perform a simple self-test to see if the VM is working
40415          * @return {String} Hexadecimal hash sample
40416          * @public
40417          */
40418         this.vm_test = function() {
40419           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40420         };
40421         /**
40422          * Enable/disable uppercase hexadecimal returned string
40423          * @param {boolean}
40424          * @return {Object} this
40425          * @public
40426          */
40427         this.setUpperCase = function(a) {
40428           if (typeof a === 'boolean') {
40429             hexcase = a;
40430           }
40431           return this;
40432         };
40433         /**
40434          * @description Defines a base64 pad string
40435          * @param {string} Pad
40436          * @return {Object} this
40437          * @public
40438          */
40439         this.setPad = function(a) {
40440           b64pad = a || b64pad;
40441           return this;
40442         };
40443         /**
40444          * Defines a base64 pad string
40445          * @param {boolean}
40446          * @return {Object} this
40447          * @public
40448          */
40449         this.setUTF8 = function(a) {
40450           if (typeof a === 'boolean') {
40451             utf8 = a;
40452           }
40453           return this;
40454         };
40455
40456         // private methods
40457
40458         /**
40459          * Calculate the SHA-512 of a raw string
40460          */
40461
40462         function rstr(s, utf8) {
40463           s = (utf8) ? utf8Encode(s) : s;
40464           return binb2rstr(binb(rstr2binb(s), s.length * 8));
40465         }
40466
40467         /**
40468          * Calculate the HMAC-sha256 of a key and some data (raw strings)
40469          */
40470
40471         function rstr_hmac(key, data) {
40472           key = (utf8) ? utf8Encode(key) : key;
40473           data = (utf8) ? utf8Encode(data) : data;
40474           var hash, i = 0,
40475             bkey = rstr2binb(key),
40476             ipad = Array(16),
40477             opad = Array(16);
40478
40479           if (bkey.length > 16) {
40480             bkey = binb(bkey, key.length * 8);
40481           }
40482
40483           for (; i < 16; i += 1) {
40484             ipad[i] = bkey[i] ^ 0x36363636;
40485             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40486           }
40487
40488           hash = binb(ipad.concat(rstr2binb(data)), 512 + data.length * 8);
40489           return binb2rstr(binb(opad.concat(hash), 512 + 256));
40490         }
40491
40492         /*
40493          * Main sha256 function, with its support functions
40494          */
40495
40496         function sha256_S(X, n) {
40497           return (X >>> n) | (X << (32 - n));
40498         }
40499
40500         function sha256_R(X, n) {
40501           return (X >>> n);
40502         }
40503
40504         function sha256_Ch(x, y, z) {
40505           return ((x & y) ^ ((~x) & z));
40506         }
40507
40508         function sha256_Maj(x, y, z) {
40509           return ((x & y) ^ (x & z) ^ (y & z));
40510         }
40511
40512         function sha256_Sigma0256(x) {
40513           return (sha256_S(x, 2) ^ sha256_S(x, 13) ^ sha256_S(x, 22));
40514         }
40515
40516         function sha256_Sigma1256(x) {
40517           return (sha256_S(x, 6) ^ sha256_S(x, 11) ^ sha256_S(x, 25));
40518         }
40519
40520         function sha256_Gamma0256(x) {
40521           return (sha256_S(x, 7) ^ sha256_S(x, 18) ^ sha256_R(x, 3));
40522         }
40523
40524         function sha256_Gamma1256(x) {
40525           return (sha256_S(x, 17) ^ sha256_S(x, 19) ^ sha256_R(x, 10));
40526         }
40527
40528         sha256_K = [
40529           1116352408, 1899447441, -1245643825, -373957723, 961987163, 1508970993, -1841331548, -1424204075, -670586216, 310598401, 607225278, 1426881987,
40530           1925078388, -2132889090, -1680079193, -1046744716, -459576895, -272742522,
40531           264347078, 604807628, 770255983, 1249150122, 1555081692, 1996064986, -1740746414, -1473132947, -1341970488, -1084653625, -958395405, -710438585,
40532           113926993, 338241895, 666307205, 773529912, 1294757372, 1396182291,
40533           1695183700, 1986661051, -2117940946, -1838011259, -1564481375, -1474664885, -1035236496, -949202525, -778901479, -694614492, -200395387, 275423344,
40534           430227734, 506948616, 659060556, 883997877, 958139571, 1322822218,
40535           1537002063, 1747873779, 1955562222, 2024104815, -2067236844, -1933114872, -1866530822, -1538233109, -1090935817, -965641998
40536         ];
40537
40538         function binb(m, l) {
40539           var HASH = [1779033703, -1150833019, 1013904242, -1521486534,
40540             1359893119, -1694144372, 528734635, 1541459225
40541           ];
40542           var W = new Array(64);
40543           var a, b, c, d, e, f, g, h;
40544           var i, j, T1, T2;
40545
40546           /* append padding */
40547           m[l >> 5] |= 0x80 << (24 - l % 32);
40548           m[((l + 64 >> 9) << 4) + 15] = l;
40549
40550           for (i = 0; i < m.length; i += 16) {
40551             a = HASH[0];
40552             b = HASH[1];
40553             c = HASH[2];
40554             d = HASH[3];
40555             e = HASH[4];
40556             f = HASH[5];
40557             g = HASH[6];
40558             h = HASH[7];
40559
40560             for (j = 0; j < 64; j += 1) {
40561               if (j < 16) {
40562                 W[j] = m[j + i];
40563               } else {
40564                 W[j] = safe_add(safe_add(safe_add(sha256_Gamma1256(W[j - 2]), W[j - 7]),
40565                   sha256_Gamma0256(W[j - 15])), W[j - 16]);
40566               }
40567
40568               T1 = safe_add(safe_add(safe_add(safe_add(h, sha256_Sigma1256(e)), sha256_Ch(e, f, g)),
40569                 sha256_K[j]), W[j]);
40570               T2 = safe_add(sha256_Sigma0256(a), sha256_Maj(a, b, c));
40571               h = g;
40572               g = f;
40573               f = e;
40574               e = safe_add(d, T1);
40575               d = c;
40576               c = b;
40577               b = a;
40578               a = safe_add(T1, T2);
40579             }
40580
40581             HASH[0] = safe_add(a, HASH[0]);
40582             HASH[1] = safe_add(b, HASH[1]);
40583             HASH[2] = safe_add(c, HASH[2]);
40584             HASH[3] = safe_add(d, HASH[3]);
40585             HASH[4] = safe_add(e, HASH[4]);
40586             HASH[5] = safe_add(f, HASH[5]);
40587             HASH[6] = safe_add(g, HASH[6]);
40588             HASH[7] = safe_add(h, HASH[7]);
40589           }
40590           return HASH;
40591         }
40592
40593       },
40594
40595       /**
40596        * @class Hashes.SHA512
40597        * @param {config}
40598        *
40599        * A JavaScript implementation of the Secure Hash Algorithm, SHA-512, as defined in FIPS 180-2
40600        * Version 2.2 Copyright Anonymous Contributor, Paul Johnston 2000 - 2009.
40601        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40602        * See http://pajhome.org.uk/crypt/md5 for details.
40603        */
40604       SHA512: function(options) {
40605         /**
40606          * Private properties configuration variables. You may need to tweak these to be compatible with
40607          * the server-side, but the defaults work in most cases.
40608          * @see this.setUpperCase() method
40609          * @see this.setPad() method
40610          */
40611         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
40612           /* hexadecimal output case format. false - lowercase; true - uppercase  */
40613           b64pad = (options && typeof options.pad === 'string') ? options.pad : '=',
40614           /* base-64 pad character. Default '=' for strict RFC compliance   */
40615           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40616           /* enable/disable utf8 encoding */
40617           sha512_k;
40618
40619         /* privileged (public) methods */
40620         this.hex = function(s) {
40621           return rstr2hex(rstr(s));
40622         };
40623         this.b64 = function(s) {
40624           return rstr2b64(rstr(s), b64pad);
40625         };
40626         this.any = function(s, e) {
40627           return rstr2any(rstr(s), e);
40628         };
40629         this.raw = function(s) {
40630           return rstr(s, utf8);
40631         };
40632         this.hex_hmac = function(k, d) {
40633           return rstr2hex(rstr_hmac(k, d));
40634         };
40635         this.b64_hmac = function(k, d) {
40636           return rstr2b64(rstr_hmac(k, d), b64pad);
40637         };
40638         this.any_hmac = function(k, d, e) {
40639           return rstr2any(rstr_hmac(k, d), e);
40640         };
40641         /**
40642          * Perform a simple self-test to see if the VM is working
40643          * @return {String} Hexadecimal hash sample
40644          * @public
40645          */
40646         this.vm_test = function() {
40647           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
40648         };
40649         /**
40650          * @description Enable/disable uppercase hexadecimal returned string
40651          * @param {boolean}
40652          * @return {Object} this
40653          * @public
40654          */
40655         this.setUpperCase = function(a) {
40656           if (typeof a === 'boolean') {
40657             hexcase = a;
40658           }
40659           return this;
40660         };
40661         /**
40662          * @description Defines a base64 pad string
40663          * @param {string} Pad
40664          * @return {Object} this
40665          * @public
40666          */
40667         this.setPad = function(a) {
40668           b64pad = a || b64pad;
40669           return this;
40670         };
40671         /**
40672          * @description Defines a base64 pad string
40673          * @param {boolean}
40674          * @return {Object} this
40675          * @public
40676          */
40677         this.setUTF8 = function(a) {
40678           if (typeof a === 'boolean') {
40679             utf8 = a;
40680           }
40681           return this;
40682         };
40683
40684         /* private methods */
40685
40686         /**
40687          * Calculate the SHA-512 of a raw string
40688          */
40689
40690         function rstr(s) {
40691           s = (utf8) ? utf8Encode(s) : s;
40692           return binb2rstr(binb(rstr2binb(s), s.length * 8));
40693         }
40694         /*
40695          * Calculate the HMAC-SHA-512 of a key and some data (raw strings)
40696          */
40697
40698         function rstr_hmac(key, data) {
40699           key = (utf8) ? utf8Encode(key) : key;
40700           data = (utf8) ? utf8Encode(data) : data;
40701
40702           var hash, i = 0,
40703             bkey = rstr2binb(key),
40704             ipad = Array(32),
40705             opad = Array(32);
40706
40707           if (bkey.length > 32) {
40708             bkey = binb(bkey, key.length * 8);
40709           }
40710
40711           for (; i < 32; i += 1) {
40712             ipad[i] = bkey[i] ^ 0x36363636;
40713             opad[i] = bkey[i] ^ 0x5C5C5C5C;
40714           }
40715
40716           hash = binb(ipad.concat(rstr2binb(data)), 1024 + data.length * 8);
40717           return binb2rstr(binb(opad.concat(hash), 1024 + 512));
40718         }
40719
40720         /**
40721          * Calculate the SHA-512 of an array of big-endian dwords, and a bit length
40722          */
40723
40724         function binb(x, len) {
40725           var j, i, l,
40726             W = new Array(80),
40727             hash = new Array(16),
40728             //Initial hash values
40729             H = [
40730               new int64(0x6a09e667, -205731576),
40731               new int64(-1150833019, -2067093701),
40732               new int64(0x3c6ef372, -23791573),
40733               new int64(-1521486534, 0x5f1d36f1),
40734               new int64(0x510e527f, -1377402159),
40735               new int64(-1694144372, 0x2b3e6c1f),
40736               new int64(0x1f83d9ab, -79577749),
40737               new int64(0x5be0cd19, 0x137e2179)
40738             ],
40739             T1 = new int64(0, 0),
40740             T2 = new int64(0, 0),
40741             a = new int64(0, 0),
40742             b = new int64(0, 0),
40743             c = new int64(0, 0),
40744             d = new int64(0, 0),
40745             e = new int64(0, 0),
40746             f = new int64(0, 0),
40747             g = new int64(0, 0),
40748             h = new int64(0, 0),
40749             //Temporary variables not specified by the document
40750             s0 = new int64(0, 0),
40751             s1 = new int64(0, 0),
40752             Ch = new int64(0, 0),
40753             Maj = new int64(0, 0),
40754             r1 = new int64(0, 0),
40755             r2 = new int64(0, 0),
40756             r3 = new int64(0, 0);
40757
40758           if (sha512_k === undefined) {
40759             //SHA512 constants
40760             sha512_k = [
40761               new int64(0x428a2f98, -685199838), new int64(0x71374491, 0x23ef65cd),
40762               new int64(-1245643825, -330482897), new int64(-373957723, -2121671748),
40763               new int64(0x3956c25b, -213338824), new int64(0x59f111f1, -1241133031),
40764               new int64(-1841331548, -1357295717), new int64(-1424204075, -630357736),
40765               new int64(-670586216, -1560083902), new int64(0x12835b01, 0x45706fbe),
40766               new int64(0x243185be, 0x4ee4b28c), new int64(0x550c7dc3, -704662302),
40767               new int64(0x72be5d74, -226784913), new int64(-2132889090, 0x3b1696b1),
40768               new int64(-1680079193, 0x25c71235), new int64(-1046744716, -815192428),
40769               new int64(-459576895, -1628353838), new int64(-272742522, 0x384f25e3),
40770               new int64(0xfc19dc6, -1953704523), new int64(0x240ca1cc, 0x77ac9c65),
40771               new int64(0x2de92c6f, 0x592b0275), new int64(0x4a7484aa, 0x6ea6e483),
40772               new int64(0x5cb0a9dc, -1119749164), new int64(0x76f988da, -2096016459),
40773               new int64(-1740746414, -295247957), new int64(-1473132947, 0x2db43210),
40774               new int64(-1341970488, -1728372417), new int64(-1084653625, -1091629340),
40775               new int64(-958395405, 0x3da88fc2), new int64(-710438585, -1828018395),
40776               new int64(0x6ca6351, -536640913), new int64(0x14292967, 0xa0e6e70),
40777               new int64(0x27b70a85, 0x46d22ffc), new int64(0x2e1b2138, 0x5c26c926),
40778               new int64(0x4d2c6dfc, 0x5ac42aed), new int64(0x53380d13, -1651133473),
40779               new int64(0x650a7354, -1951439906), new int64(0x766a0abb, 0x3c77b2a8),
40780               new int64(-2117940946, 0x47edaee6), new int64(-1838011259, 0x1482353b),
40781               new int64(-1564481375, 0x4cf10364), new int64(-1474664885, -1136513023),
40782               new int64(-1035236496, -789014639), new int64(-949202525, 0x654be30),
40783               new int64(-778901479, -688958952), new int64(-694614492, 0x5565a910),
40784               new int64(-200395387, 0x5771202a), new int64(0x106aa070, 0x32bbd1b8),
40785               new int64(0x19a4c116, -1194143544), new int64(0x1e376c08, 0x5141ab53),
40786               new int64(0x2748774c, -544281703), new int64(0x34b0bcb5, -509917016),
40787               new int64(0x391c0cb3, -976659869), new int64(0x4ed8aa4a, -482243893),
40788               new int64(0x5b9cca4f, 0x7763e373), new int64(0x682e6ff3, -692930397),
40789               new int64(0x748f82ee, 0x5defb2fc), new int64(0x78a5636f, 0x43172f60),
40790               new int64(-2067236844, -1578062990), new int64(-1933114872, 0x1a6439ec),
40791               new int64(-1866530822, 0x23631e28), new int64(-1538233109, -561857047),
40792               new int64(-1090935817, -1295615723), new int64(-965641998, -479046869),
40793               new int64(-903397682, -366583396), new int64(-779700025, 0x21c0c207),
40794               new int64(-354779690, -840897762), new int64(-176337025, -294727304),
40795               new int64(0x6f067aa, 0x72176fba), new int64(0xa637dc5, -1563912026),
40796               new int64(0x113f9804, -1090974290), new int64(0x1b710b35, 0x131c471b),
40797               new int64(0x28db77f5, 0x23047d84), new int64(0x32caab7b, 0x40c72493),
40798               new int64(0x3c9ebe0a, 0x15c9bebc), new int64(0x431d67c4, -1676669620),
40799               new int64(0x4cc5d4be, -885112138), new int64(0x597f299c, -60457430),
40800               new int64(0x5fcb6fab, 0x3ad6faec), new int64(0x6c44198c, 0x4a475817)
40801             ];
40802           }
40803
40804           for (i = 0; i < 80; i += 1) {
40805             W[i] = new int64(0, 0);
40806           }
40807
40808           // append padding to the source string. The format is described in the FIPS.
40809           x[len >> 5] |= 0x80 << (24 - (len & 0x1f));
40810           x[((len + 128 >> 10) << 5) + 31] = len;
40811           l = x.length;
40812           for (i = 0; i < l; i += 32) { //32 dwords is the block size
40813             int64copy(a, H[0]);
40814             int64copy(b, H[1]);
40815             int64copy(c, H[2]);
40816             int64copy(d, H[3]);
40817             int64copy(e, H[4]);
40818             int64copy(f, H[5]);
40819             int64copy(g, H[6]);
40820             int64copy(h, H[7]);
40821
40822             for (j = 0; j < 16; j += 1) {
40823               W[j].h = x[i + 2 * j];
40824               W[j].l = x[i + 2 * j + 1];
40825             }
40826
40827             for (j = 16; j < 80; j += 1) {
40828               //sigma1
40829               int64rrot(r1, W[j - 2], 19);
40830               int64revrrot(r2, W[j - 2], 29);
40831               int64shr(r3, W[j - 2], 6);
40832               s1.l = r1.l ^ r2.l ^ r3.l;
40833               s1.h = r1.h ^ r2.h ^ r3.h;
40834               //sigma0
40835               int64rrot(r1, W[j - 15], 1);
40836               int64rrot(r2, W[j - 15], 8);
40837               int64shr(r3, W[j - 15], 7);
40838               s0.l = r1.l ^ r2.l ^ r3.l;
40839               s0.h = r1.h ^ r2.h ^ r3.h;
40840
40841               int64add4(W[j], s1, W[j - 7], s0, W[j - 16]);
40842             }
40843
40844             for (j = 0; j < 80; j += 1) {
40845               //Ch
40846               Ch.l = (e.l & f.l) ^ (~e.l & g.l);
40847               Ch.h = (e.h & f.h) ^ (~e.h & g.h);
40848
40849               //Sigma1
40850               int64rrot(r1, e, 14);
40851               int64rrot(r2, e, 18);
40852               int64revrrot(r3, e, 9);
40853               s1.l = r1.l ^ r2.l ^ r3.l;
40854               s1.h = r1.h ^ r2.h ^ r3.h;
40855
40856               //Sigma0
40857               int64rrot(r1, a, 28);
40858               int64revrrot(r2, a, 2);
40859               int64revrrot(r3, a, 7);
40860               s0.l = r1.l ^ r2.l ^ r3.l;
40861               s0.h = r1.h ^ r2.h ^ r3.h;
40862
40863               //Maj
40864               Maj.l = (a.l & b.l) ^ (a.l & c.l) ^ (b.l & c.l);
40865               Maj.h = (a.h & b.h) ^ (a.h & c.h) ^ (b.h & c.h);
40866
40867               int64add5(T1, h, s1, Ch, sha512_k[j], W[j]);
40868               int64add(T2, s0, Maj);
40869
40870               int64copy(h, g);
40871               int64copy(g, f);
40872               int64copy(f, e);
40873               int64add(e, d, T1);
40874               int64copy(d, c);
40875               int64copy(c, b);
40876               int64copy(b, a);
40877               int64add(a, T1, T2);
40878             }
40879             int64add(H[0], H[0], a);
40880             int64add(H[1], H[1], b);
40881             int64add(H[2], H[2], c);
40882             int64add(H[3], H[3], d);
40883             int64add(H[4], H[4], e);
40884             int64add(H[5], H[5], f);
40885             int64add(H[6], H[6], g);
40886             int64add(H[7], H[7], h);
40887           }
40888
40889           //represent the hash as an array of 32-bit dwords
40890           for (i = 0; i < 8; i += 1) {
40891             hash[2 * i] = H[i].h;
40892             hash[2 * i + 1] = H[i].l;
40893           }
40894           return hash;
40895         }
40896
40897         //A constructor for 64-bit numbers
40898
40899         function int64(h, l) {
40900           this.h = h;
40901           this.l = l;
40902           //this.toString = int64toString;
40903         }
40904
40905         //Copies src into dst, assuming both are 64-bit numbers
40906
40907         function int64copy(dst, src) {
40908           dst.h = src.h;
40909           dst.l = src.l;
40910         }
40911
40912         //Right-rotates a 64-bit number by shift
40913         //Won't handle cases of shift>=32
40914         //The function revrrot() is for that
40915
40916         function int64rrot(dst, x, shift) {
40917           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
40918           dst.h = (x.h >>> shift) | (x.l << (32 - shift));
40919         }
40920
40921         //Reverses the dwords of the source and then rotates right by shift.
40922         //This is equivalent to rotation by 32+shift
40923
40924         function int64revrrot(dst, x, shift) {
40925           dst.l = (x.h >>> shift) | (x.l << (32 - shift));
40926           dst.h = (x.l >>> shift) | (x.h << (32 - shift));
40927         }
40928
40929         //Bitwise-shifts right a 64-bit number by shift
40930         //Won't handle shift>=32, but it's never needed in SHA512
40931
40932         function int64shr(dst, x, shift) {
40933           dst.l = (x.l >>> shift) | (x.h << (32 - shift));
40934           dst.h = (x.h >>> shift);
40935         }
40936
40937         //Adds two 64-bit numbers
40938         //Like the original implementation, does not rely on 32-bit operations
40939
40940         function int64add(dst, x, y) {
40941           var w0 = (x.l & 0xffff) + (y.l & 0xffff);
40942           var w1 = (x.l >>> 16) + (y.l >>> 16) + (w0 >>> 16);
40943           var w2 = (x.h & 0xffff) + (y.h & 0xffff) + (w1 >>> 16);
40944           var w3 = (x.h >>> 16) + (y.h >>> 16) + (w2 >>> 16);
40945           dst.l = (w0 & 0xffff) | (w1 << 16);
40946           dst.h = (w2 & 0xffff) | (w3 << 16);
40947         }
40948
40949         //Same, except with 4 addends. Works faster than adding them one by one.
40950
40951         function int64add4(dst, a, b, c, d) {
40952           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff);
40953           var w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (w0 >>> 16);
40954           var w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (w1 >>> 16);
40955           var w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (w2 >>> 16);
40956           dst.l = (w0 & 0xffff) | (w1 << 16);
40957           dst.h = (w2 & 0xffff) | (w3 << 16);
40958         }
40959
40960         //Same, except with 5 addends
40961
40962         function int64add5(dst, a, b, c, d, e) {
40963           var w0 = (a.l & 0xffff) + (b.l & 0xffff) + (c.l & 0xffff) + (d.l & 0xffff) + (e.l & 0xffff),
40964             w1 = (a.l >>> 16) + (b.l >>> 16) + (c.l >>> 16) + (d.l >>> 16) + (e.l >>> 16) + (w0 >>> 16),
40965             w2 = (a.h & 0xffff) + (b.h & 0xffff) + (c.h & 0xffff) + (d.h & 0xffff) + (e.h & 0xffff) + (w1 >>> 16),
40966             w3 = (a.h >>> 16) + (b.h >>> 16) + (c.h >>> 16) + (d.h >>> 16) + (e.h >>> 16) + (w2 >>> 16);
40967           dst.l = (w0 & 0xffff) | (w1 << 16);
40968           dst.h = (w2 & 0xffff) | (w3 << 16);
40969         }
40970       },
40971       /**
40972        * @class Hashes.RMD160
40973        * @constructor
40974        * @param {Object} [config]
40975        *
40976        * A JavaScript implementation of the RIPEMD-160 Algorithm
40977        * Version 2.2 Copyright Jeremy Lin, Paul Johnston 2000 - 2009.
40978        * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
40979        * See http://pajhome.org.uk/crypt/md5 for details.
40980        * Also http://www.ocf.berkeley.edu/~jjlin/jsotp/
40981        */
40982       RMD160: function(options) {
40983         /**
40984          * Private properties configuration variables. You may need to tweak these to be compatible with
40985          * the server-side, but the defaults work in most cases.
40986          * @see this.setUpperCase() method
40987          * @see this.setPad() method
40988          */
40989         var hexcase = (options && typeof options.uppercase === 'boolean') ? options.uppercase : false,
40990           /* hexadecimal output case format. false - lowercase; true - uppercase  */
40991           b64pad = (options && typeof options.pad === 'string') ? options.pa : '=',
40992           /* base-64 pad character. Default '=' for strict RFC compliance   */
40993           utf8 = (options && typeof options.utf8 === 'boolean') ? options.utf8 : true,
40994           /* enable/disable utf8 encoding */
40995           rmd160_r1 = [
40996             0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
40997             7, 4, 13, 1, 10, 6, 15, 3, 12, 0, 9, 5, 2, 14, 11, 8,
40998             3, 10, 14, 4, 9, 15, 8, 1, 2, 7, 0, 6, 13, 11, 5, 12,
40999             1, 9, 11, 10, 0, 8, 12, 4, 13, 3, 7, 15, 14, 5, 6, 2,
41000             4, 0, 5, 9, 7, 12, 2, 10, 14, 1, 3, 8, 11, 6, 15, 13
41001           ],
41002           rmd160_r2 = [
41003             5, 14, 7, 0, 9, 2, 11, 4, 13, 6, 15, 8, 1, 10, 3, 12,
41004             6, 11, 3, 7, 0, 13, 5, 10, 14, 15, 8, 12, 4, 9, 1, 2,
41005             15, 5, 1, 3, 7, 14, 6, 9, 11, 8, 12, 2, 10, 0, 4, 13,
41006             8, 6, 4, 1, 3, 11, 15, 0, 5, 12, 2, 13, 9, 7, 10, 14,
41007             12, 15, 10, 4, 1, 5, 8, 7, 6, 2, 13, 14, 0, 3, 9, 11
41008           ],
41009           rmd160_s1 = [
41010             11, 14, 15, 12, 5, 8, 7, 9, 11, 13, 14, 15, 6, 7, 9, 8,
41011             7, 6, 8, 13, 11, 9, 7, 15, 7, 12, 15, 9, 11, 7, 13, 12,
41012             11, 13, 6, 7, 14, 9, 13, 15, 14, 8, 13, 6, 5, 12, 7, 5,
41013             11, 12, 14, 15, 14, 15, 9, 8, 9, 14, 5, 6, 8, 6, 5, 12,
41014             9, 15, 5, 11, 6, 8, 13, 12, 5, 12, 13, 14, 11, 8, 5, 6
41015           ],
41016           rmd160_s2 = [
41017             8, 9, 9, 11, 13, 15, 15, 5, 7, 7, 8, 11, 14, 14, 12, 6,
41018             9, 13, 15, 7, 12, 8, 9, 11, 7, 7, 12, 7, 6, 15, 13, 11,
41019             9, 7, 15, 11, 8, 6, 6, 14, 12, 13, 5, 14, 13, 13, 7, 5,
41020             15, 5, 8, 11, 14, 14, 6, 14, 6, 9, 12, 9, 12, 5, 15, 8,
41021             8, 5, 12, 9, 12, 5, 14, 6, 8, 13, 6, 5, 15, 13, 11, 11
41022           ];
41023
41024         /* privileged (public) methods */
41025         this.hex = function(s) {
41026           return rstr2hex(rstr(s, utf8));
41027         };
41028         this.b64 = function(s) {
41029           return rstr2b64(rstr(s, utf8), b64pad);
41030         };
41031         this.any = function(s, e) {
41032           return rstr2any(rstr(s, utf8), e);
41033         };
41034         this.raw = function(s) {
41035           return rstr(s, utf8);
41036         };
41037         this.hex_hmac = function(k, d) {
41038           return rstr2hex(rstr_hmac(k, d));
41039         };
41040         this.b64_hmac = function(k, d) {
41041           return rstr2b64(rstr_hmac(k, d), b64pad);
41042         };
41043         this.any_hmac = function(k, d, e) {
41044           return rstr2any(rstr_hmac(k, d), e);
41045         };
41046         /**
41047          * Perform a simple self-test to see if the VM is working
41048          * @return {String} Hexadecimal hash sample
41049          * @public
41050          */
41051         this.vm_test = function() {
41052           return hex('abc').toLowerCase() === '900150983cd24fb0d6963f7d28e17f72';
41053         };
41054         /**
41055          * @description Enable/disable uppercase hexadecimal returned string
41056          * @param {boolean}
41057          * @return {Object} this
41058          * @public
41059          */
41060         this.setUpperCase = function(a) {
41061           if (typeof a === 'boolean') {
41062             hexcase = a;
41063           }
41064           return this;
41065         };
41066         /**
41067          * @description Defines a base64 pad string
41068          * @param {string} Pad
41069          * @return {Object} this
41070          * @public
41071          */
41072         this.setPad = function(a) {
41073           if (typeof a !== 'undefined') {
41074             b64pad = a;
41075           }
41076           return this;
41077         };
41078         /**
41079          * @description Defines a base64 pad string
41080          * @param {boolean}
41081          * @return {Object} this
41082          * @public
41083          */
41084         this.setUTF8 = function(a) {
41085           if (typeof a === 'boolean') {
41086             utf8 = a;
41087           }
41088           return this;
41089         };
41090
41091         /* private methods */
41092
41093         /**
41094          * Calculate the rmd160 of a raw string
41095          */
41096
41097         function rstr(s) {
41098           s = (utf8) ? utf8Encode(s) : s;
41099           return binl2rstr(binl(rstr2binl(s), s.length * 8));
41100         }
41101
41102         /**
41103          * Calculate the HMAC-rmd160 of a key and some data (raw strings)
41104          */
41105
41106         function rstr_hmac(key, data) {
41107           key = (utf8) ? utf8Encode(key) : key;
41108           data = (utf8) ? utf8Encode(data) : data;
41109           var i, hash,
41110             bkey = rstr2binl(key),
41111             ipad = Array(16),
41112             opad = Array(16);
41113
41114           if (bkey.length > 16) {
41115             bkey = binl(bkey, key.length * 8);
41116           }
41117
41118           for (i = 0; i < 16; i += 1) {
41119             ipad[i] = bkey[i] ^ 0x36363636;
41120             opad[i] = bkey[i] ^ 0x5C5C5C5C;
41121           }
41122           hash = binl(ipad.concat(rstr2binl(data)), 512 + data.length * 8);
41123           return binl2rstr(binl(opad.concat(hash), 512 + 160));
41124         }
41125
41126         /**
41127          * Convert an array of little-endian words to a string
41128          */
41129
41130         function binl2rstr(input) {
41131           var i, output = '',
41132             l = input.length * 32;
41133           for (i = 0; i < l; i += 8) {
41134             output += String.fromCharCode((input[i >> 5] >>> (i % 32)) & 0xFF);
41135           }
41136           return output;
41137         }
41138
41139         /**
41140          * Calculate the RIPE-MD160 of an array of little-endian words, and a bit length.
41141          */
41142
41143         function binl(x, len) {
41144           var T, j, i, l,
41145             h0 = 0x67452301,
41146             h1 = 0xefcdab89,
41147             h2 = 0x98badcfe,
41148             h3 = 0x10325476,
41149             h4 = 0xc3d2e1f0,
41150             A1, B1, C1, D1, E1,
41151             A2, B2, C2, D2, E2;
41152
41153           /* append padding */
41154           x[len >> 5] |= 0x80 << (len % 32);
41155           x[(((len + 64) >>> 9) << 4) + 14] = len;
41156           l = x.length;
41157
41158           for (i = 0; i < l; i += 16) {
41159             A1 = A2 = h0;
41160             B1 = B2 = h1;
41161             C1 = C2 = h2;
41162             D1 = D2 = h3;
41163             E1 = E2 = h4;
41164             for (j = 0; j <= 79; j += 1) {
41165               T = safe_add(A1, rmd160_f(j, B1, C1, D1));
41166               T = safe_add(T, x[i + rmd160_r1[j]]);
41167               T = safe_add(T, rmd160_K1(j));
41168               T = safe_add(bit_rol(T, rmd160_s1[j]), E1);
41169               A1 = E1;
41170               E1 = D1;
41171               D1 = bit_rol(C1, 10);
41172               C1 = B1;
41173               B1 = T;
41174               T = safe_add(A2, rmd160_f(79 - j, B2, C2, D2));
41175               T = safe_add(T, x[i + rmd160_r2[j]]);
41176               T = safe_add(T, rmd160_K2(j));
41177               T = safe_add(bit_rol(T, rmd160_s2[j]), E2);
41178               A2 = E2;
41179               E2 = D2;
41180               D2 = bit_rol(C2, 10);
41181               C2 = B2;
41182               B2 = T;
41183             }
41184
41185             T = safe_add(h1, safe_add(C1, D2));
41186             h1 = safe_add(h2, safe_add(D1, E2));
41187             h2 = safe_add(h3, safe_add(E1, A2));
41188             h3 = safe_add(h4, safe_add(A1, B2));
41189             h4 = safe_add(h0, safe_add(B1, C2));
41190             h0 = T;
41191           }
41192           return [h0, h1, h2, h3, h4];
41193         }
41194
41195         // specific algorithm methods
41196
41197         function rmd160_f(j, x, y, z) {
41198           return (0 <= j && j <= 15) ? (x ^ y ^ z) :
41199             (16 <= j && j <= 31) ? (x & y) | (~x & z) :
41200             (32 <= j && j <= 47) ? (x | ~y) ^ z :
41201             (48 <= j && j <= 63) ? (x & z) | (y & ~z) :
41202             (64 <= j && j <= 79) ? x ^ (y | ~z) :
41203             'rmd160_f: j out of range';
41204         }
41205
41206         function rmd160_K1(j) {
41207           return (0 <= j && j <= 15) ? 0x00000000 :
41208             (16 <= j && j <= 31) ? 0x5a827999 :
41209             (32 <= j && j <= 47) ? 0x6ed9eba1 :
41210             (48 <= j && j <= 63) ? 0x8f1bbcdc :
41211             (64 <= j && j <= 79) ? 0xa953fd4e :
41212             'rmd160_K1: j out of range';
41213         }
41214
41215         function rmd160_K2(j) {
41216           return (0 <= j && j <= 15) ? 0x50a28be6 :
41217             (16 <= j && j <= 31) ? 0x5c4dd124 :
41218             (32 <= j && j <= 47) ? 0x6d703ef3 :
41219             (48 <= j && j <= 63) ? 0x7a6d76e9 :
41220             (64 <= j && j <= 79) ? 0x00000000 :
41221             'rmd160_K2: j out of range';
41222         }
41223       }
41224     };
41225
41226     // exposes Hashes
41227     (function(window, undefined) {
41228       var freeExports = false;
41229       {
41230         freeExports = exports;
41231         if (exports && typeof commonjsGlobal === 'object' && commonjsGlobal && commonjsGlobal === commonjsGlobal.global) {
41232           window = commonjsGlobal;
41233         }
41234       }
41235
41236       if (typeof undefined === 'function' && typeof undefined.amd === 'object' && undefined.amd) {
41237         // define as an anonymous module, so, through path mapping, it can be aliased
41238         undefined(function() {
41239           return Hashes;
41240         });
41241       } else if (freeExports) {
41242         // in Node.js or RingoJS v0.8.0+
41243         if (module && module.exports === freeExports) {
41244           module.exports = Hashes;
41245         }
41246         // in Narwhal or RingoJS v0.7.0-
41247         else {
41248           freeExports.Hashes = Hashes;
41249         }
41250       } else {
41251         // in a browser or Rhino
41252         window.Hashes = Hashes;
41253       }
41254     }(this));
41255   }()); // IIFE
41256   });
41257
41258   var immutable = extend$2;
41259
41260   var hasOwnProperty$g = Object.prototype.hasOwnProperty;
41261
41262   function extend$2() {
41263       var target = {};
41264
41265       for (var i = 0; i < arguments.length; i++) {
41266           var source = arguments[i];
41267
41268           for (var key in source) {
41269               if (hasOwnProperty$g.call(source, key)) {
41270                   target[key] = source[key];
41271               }
41272           }
41273       }
41274
41275       return target
41276   }
41277
41278   var sha1 = new hashes.SHA1();
41279
41280   var ohauth = {};
41281
41282   ohauth.qsString = function(obj) {
41283       return Object.keys(obj).sort().map(function(key) {
41284           return ohauth.percentEncode(key) + '=' +
41285               ohauth.percentEncode(obj[key]);
41286       }).join('&');
41287   };
41288
41289   ohauth.stringQs = function(str) {
41290       return str.split('&').filter(function (pair) {
41291           return pair !== '';
41292       }).reduce(function(obj, pair){
41293           var parts = pair.split('=');
41294           obj[decodeURIComponent(parts[0])] = (null === parts[1]) ?
41295               '' : decodeURIComponent(parts[1]);
41296           return obj;
41297       }, {});
41298   };
41299
41300   ohauth.rawxhr = function(method, url, data, headers, callback) {
41301       var xhr = new XMLHttpRequest(),
41302           twoHundred = /^20\d$/;
41303       xhr.onreadystatechange = function() {
41304           if (4 === xhr.readyState && 0 !== xhr.status) {
41305               if (twoHundred.test(xhr.status)) callback(null, xhr);
41306               else return callback(xhr, null);
41307           }
41308       };
41309       xhr.onerror = function(e) { return callback(e, null); };
41310       xhr.open(method, url, true);
41311       for (var h in headers) xhr.setRequestHeader(h, headers[h]);
41312       xhr.send(data);
41313       return xhr;
41314   };
41315
41316   ohauth.xhr = function(method, url, auth, data, options, callback) {
41317       var headers = (options && options.header) || {
41318           'Content-Type': 'application/x-www-form-urlencoded'
41319       };
41320       headers.Authorization = 'OAuth ' + ohauth.authHeader(auth);
41321       return ohauth.rawxhr(method, url, data, headers, callback);
41322   };
41323
41324   ohauth.nonce = function() {
41325       for (var o = ''; o.length < 6;) {
41326           o += '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz'[Math.floor(Math.random() * 61)];
41327       }
41328       return o;
41329   };
41330
41331   ohauth.authHeader = function(obj) {
41332       return Object.keys(obj).sort().map(function(key) {
41333           return encodeURIComponent(key) + '="' + encodeURIComponent(obj[key]) + '"';
41334       }).join(', ');
41335   };
41336
41337   ohauth.timestamp = function() { return ~~((+new Date()) / 1000); };
41338
41339   ohauth.percentEncode = function(s) {
41340       return encodeURIComponent(s)
41341           .replace(/\!/g, '%21').replace(/\'/g, '%27')
41342           .replace(/\*/g, '%2A').replace(/\(/g, '%28').replace(/\)/g, '%29');
41343   };
41344
41345   ohauth.baseString = function(method, url, params) {
41346       if (params.oauth_signature) delete params.oauth_signature;
41347       return [
41348           method,
41349           ohauth.percentEncode(url),
41350           ohauth.percentEncode(ohauth.qsString(params))].join('&');
41351   };
41352
41353   ohauth.signature = function(oauth_secret, token_secret, baseString) {
41354       return sha1.b64_hmac(
41355           ohauth.percentEncode(oauth_secret) + '&' +
41356           ohauth.percentEncode(token_secret),
41357           baseString);
41358   };
41359
41360   /**
41361    * Takes an options object for configuration (consumer_key,
41362    * consumer_secret, version, signature_method, token, token_secret)
41363    * and returns a function that generates the Authorization header
41364    * for given data.
41365    *
41366    * The returned function takes these parameters:
41367    * - method: GET/POST/...
41368    * - uri: full URI with protocol, port, path and query string
41369    * - extra_params: any extra parameters (that are passed in the POST data),
41370    *   can be an object or a from-urlencoded string.
41371    *
41372    * Returned function returns full OAuth header with "OAuth" string in it.
41373    */
41374
41375   ohauth.headerGenerator = function(options) {
41376       options = options || {};
41377       var consumer_key = options.consumer_key || '',
41378           consumer_secret = options.consumer_secret || '',
41379           signature_method = options.signature_method || 'HMAC-SHA1',
41380           version = options.version || '1.0',
41381           token = options.token || '',
41382           token_secret = options.token_secret || '';
41383
41384       return function(method, uri, extra_params) {
41385           method = method.toUpperCase();
41386           if (typeof extra_params === 'string' && extra_params.length > 0) {
41387               extra_params = ohauth.stringQs(extra_params);
41388           }
41389
41390           var uri_parts = uri.split('?', 2),
41391           base_uri = uri_parts[0];
41392
41393           var query_params = uri_parts.length === 2 ?
41394               ohauth.stringQs(uri_parts[1]) : {};
41395
41396           var oauth_params = {
41397               oauth_consumer_key: consumer_key,
41398               oauth_signature_method: signature_method,
41399               oauth_version: version,
41400               oauth_timestamp: ohauth.timestamp(),
41401               oauth_nonce: ohauth.nonce()
41402           };
41403
41404           if (token) oauth_params.oauth_token = token;
41405
41406           var all_params = immutable({}, oauth_params, query_params, extra_params),
41407               base_str = ohauth.baseString(method, base_uri, all_params);
41408
41409           oauth_params.oauth_signature = ohauth.signature(consumer_secret, token_secret, base_str);
41410
41411           return 'OAuth ' + ohauth.authHeader(oauth_params);
41412       };
41413   };
41414
41415   var ohauth_1 = ohauth;
41416
41417   var resolveUrl = createCommonjsModule(function (module, exports) {
41418   // Copyright 2014 Simon Lydell
41419   // X11 (“MIT”) Licensed. (See LICENSE.)
41420
41421   void (function(root, factory) {
41422     {
41423       module.exports = factory();
41424     }
41425   }(commonjsGlobal, function() {
41426
41427     function resolveUrl(/* ...urls */) {
41428       var numUrls = arguments.length;
41429
41430       if (numUrls === 0) {
41431         throw new Error("resolveUrl requires at least one argument; got none.")
41432       }
41433
41434       var base = document.createElement("base");
41435       base.href = arguments[0];
41436
41437       if (numUrls === 1) {
41438         return base.href
41439       }
41440
41441       var head = document.getElementsByTagName("head")[0];
41442       head.insertBefore(base, head.firstChild);
41443
41444       var a = document.createElement("a");
41445       var resolved;
41446
41447       for (var index = 1; index < numUrls; index++) {
41448         a.href = arguments[index];
41449         resolved = a.href;
41450         base.href = resolved;
41451       }
41452
41453       head.removeChild(base);
41454
41455       return resolved
41456     }
41457
41458     return resolveUrl
41459
41460   }));
41461   });
41462
41463   var assign$1 = make_assign();
41464   var create$2 = make_create();
41465   var trim = make_trim();
41466   var Global = (typeof window !== 'undefined' ? window : commonjsGlobal);
41467
41468   var util = {
41469         assign: assign$1,
41470         create: create$2,
41471         trim: trim,
41472         bind: bind,
41473         slice: slice$7,
41474         each: each,
41475         map: map$4,
41476         pluck: pluck,
41477         isList: isList,
41478         isFunction: isFunction$1,
41479         isObject: isObject$1,
41480         Global: Global
41481   };
41482
41483   function make_assign() {
41484         if (Object.assign) {
41485                 return Object.assign
41486         } else {
41487                 return function shimAssign(obj, props1, props2, etc) {
41488                         for (var i = 1; i < arguments.length; i++) {
41489                                 each(Object(arguments[i]), function(val, key) {
41490                                         obj[key] = val;
41491                                 });
41492                         }                       
41493                         return obj
41494                 }
41495         }
41496   }
41497
41498   function make_create() {
41499         if (Object.create) {
41500                 return function create(obj, assignProps1, assignProps2, etc) {
41501                         var assignArgsList = slice$7(arguments, 1);
41502                         return assign$1.apply(this, [Object.create(obj)].concat(assignArgsList))
41503                 }
41504         } else {
41505                 function F() {} // eslint-disable-line no-inner-declarations
41506                 return function create(obj, assignProps1, assignProps2, etc) {
41507                         var assignArgsList = slice$7(arguments, 1);
41508                         F.prototype = obj;
41509                         return assign$1.apply(this, [new F()].concat(assignArgsList))
41510                 }
41511         }
41512   }
41513
41514   function make_trim() {
41515         if (String.prototype.trim) {
41516                 return function trim(str) {
41517                         return String.prototype.trim.call(str)
41518                 }
41519         } else {
41520                 return function trim(str) {
41521                         return str.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
41522                 }
41523         }
41524   }
41525
41526   function bind(obj, fn) {
41527         return function() {
41528                 return fn.apply(obj, Array.prototype.slice.call(arguments, 0))
41529         }
41530   }
41531
41532   function slice$7(arr, index) {
41533         return Array.prototype.slice.call(arr, index || 0)
41534   }
41535
41536   function each(obj, fn) {
41537         pluck(obj, function(val, key) {
41538                 fn(val, key);
41539                 return false
41540         });
41541   }
41542
41543   function map$4(obj, fn) {
41544         var res = (isList(obj) ? [] : {});
41545         pluck(obj, function(v, k) {
41546                 res[k] = fn(v, k);
41547                 return false
41548         });
41549         return res
41550   }
41551
41552   function pluck(obj, fn) {
41553         if (isList(obj)) {
41554                 for (var i=0; i<obj.length; i++) {
41555                         if (fn(obj[i], i)) {
41556                                 return obj[i]
41557                         }
41558                 }
41559         } else {
41560                 for (var key in obj) {
41561                         if (obj.hasOwnProperty(key)) {
41562                                 if (fn(obj[key], key)) {
41563                                         return obj[key]
41564                                 }
41565                         }
41566                 }
41567         }
41568   }
41569
41570   function isList(val) {
41571         return (val != null && typeof val != 'function' && typeof val.length == 'number')
41572   }
41573
41574   function isFunction$1(val) {
41575         return val && {}.toString.call(val) === '[object Function]'
41576   }
41577
41578   function isObject$1(val) {
41579         return val && {}.toString.call(val) === '[object Object]'
41580   }
41581
41582   var slice$8 = util.slice;
41583   var pluck$1 = util.pluck;
41584   var each$1 = util.each;
41585   var bind$1 = util.bind;
41586   var create$3 = util.create;
41587   var isList$1 = util.isList;
41588   var isFunction$2 = util.isFunction;
41589   var isObject$2 = util.isObject;
41590
41591   var storeEngine = {
41592         createStore: createStore
41593   };
41594
41595   var storeAPI = {
41596         version: '2.0.12',
41597         enabled: false,
41598         
41599         // get returns the value of the given key. If that value
41600         // is undefined, it returns optionalDefaultValue instead.
41601         get: function(key, optionalDefaultValue) {
41602                 var data = this.storage.read(this._namespacePrefix + key);
41603                 return this._deserialize(data, optionalDefaultValue)
41604         },
41605
41606         // set will store the given value at key and returns value.
41607         // Calling set with value === undefined is equivalent to calling remove.
41608         set: function(key, value) {
41609                 if (value === undefined) {
41610                         return this.remove(key)
41611                 }
41612                 this.storage.write(this._namespacePrefix + key, this._serialize(value));
41613                 return value
41614         },
41615
41616         // remove deletes the key and value stored at the given key.
41617         remove: function(key) {
41618                 this.storage.remove(this._namespacePrefix + key);
41619         },
41620
41621         // each will call the given callback once for each key-value pair
41622         // in this store.
41623         each: function(callback) {
41624                 var self = this;
41625                 this.storage.each(function(val, namespacedKey) {
41626                         callback.call(self, self._deserialize(val), (namespacedKey || '').replace(self._namespaceRegexp, ''));
41627                 });
41628         },
41629
41630         // clearAll will remove all the stored key-value pairs in this store.
41631         clearAll: function() {
41632                 this.storage.clearAll();
41633         },
41634
41635         // additional functionality that can't live in plugins
41636         // ---------------------------------------------------
41637
41638         // hasNamespace returns true if this store instance has the given namespace.
41639         hasNamespace: function(namespace) {
41640                 return (this._namespacePrefix == '__storejs_'+namespace+'_')
41641         },
41642
41643         // createStore creates a store.js instance with the first
41644         // functioning storage in the list of storage candidates,
41645         // and applies the the given mixins to the instance.
41646         createStore: function() {
41647                 return createStore.apply(this, arguments)
41648         },
41649         
41650         addPlugin: function(plugin) {
41651                 this._addPlugin(plugin);
41652         },
41653         
41654         namespace: function(namespace) {
41655                 return createStore(this.storage, this.plugins, namespace)
41656         }
41657   };
41658
41659   function _warn() {
41660         var _console = (typeof console == 'undefined' ? null : console);
41661         if (!_console) { return }
41662         var fn = (_console.warn ? _console.warn : _console.log);
41663         fn.apply(_console, arguments);
41664   }
41665
41666   function createStore(storages, plugins, namespace) {
41667         if (!namespace) {
41668                 namespace = '';
41669         }
41670         if (storages && !isList$1(storages)) {
41671                 storages = [storages];
41672         }
41673         if (plugins && !isList$1(plugins)) {
41674                 plugins = [plugins];
41675         }
41676
41677         var namespacePrefix = (namespace ? '__storejs_'+namespace+'_' : '');
41678         var namespaceRegexp = (namespace ? new RegExp('^'+namespacePrefix) : null);
41679         var legalNamespaces = /^[a-zA-Z0-9_\-]*$/; // alpha-numeric + underscore and dash
41680         if (!legalNamespaces.test(namespace)) {
41681                 throw new Error('store.js namespaces can only have alphanumerics + underscores and dashes')
41682         }
41683         
41684         var _privateStoreProps = {
41685                 _namespacePrefix: namespacePrefix,
41686                 _namespaceRegexp: namespaceRegexp,
41687
41688                 _testStorage: function(storage) {
41689                         try {
41690                                 var testStr = '__storejs__test__';
41691                                 storage.write(testStr, testStr);
41692                                 var ok = (storage.read(testStr) === testStr);
41693                                 storage.remove(testStr);
41694                                 return ok
41695                         } catch(e) {
41696                                 return false
41697                         }
41698                 },
41699
41700                 _assignPluginFnProp: function(pluginFnProp, propName) {
41701                         var oldFn = this[propName];
41702                         this[propName] = function pluginFn() {
41703                                 var args = slice$8(arguments, 0);
41704                                 var self = this;
41705
41706                                 // super_fn calls the old function which was overwritten by
41707                                 // this mixin.
41708                                 function super_fn() {
41709                                         if (!oldFn) { return }
41710                                         each$1(arguments, function(arg, i) {
41711                                                 args[i] = arg;
41712                                         });
41713                                         return oldFn.apply(self, args)
41714                                 }
41715
41716                                 // Give mixing function access to super_fn by prefixing all mixin function
41717                                 // arguments with super_fn.
41718                                 var newFnArgs = [super_fn].concat(args);
41719
41720                                 return pluginFnProp.apply(self, newFnArgs)
41721                         };
41722                 },
41723
41724                 _serialize: function(obj) {
41725                         return JSON.stringify(obj)
41726                 },
41727
41728                 _deserialize: function(strVal, defaultVal) {
41729                         if (!strVal) { return defaultVal }
41730                         // It is possible that a raw string value has been previously stored
41731                         // in a storage without using store.js, meaning it will be a raw
41732                         // string value instead of a JSON serialized string. By defaulting
41733                         // to the raw string value in case of a JSON parse error, we allow
41734                         // for past stored values to be forwards-compatible with store.js
41735                         var val = '';
41736                         try { val = JSON.parse(strVal); }
41737                         catch(e) { val = strVal; }
41738
41739                         return (val !== undefined ? val : defaultVal)
41740                 },
41741                 
41742                 _addStorage: function(storage) {
41743                         if (this.enabled) { return }
41744                         if (this._testStorage(storage)) {
41745                                 this.storage = storage;
41746                                 this.enabled = true;
41747                         }
41748                 },
41749
41750                 _addPlugin: function(plugin) {
41751                         var self = this;
41752
41753                         // If the plugin is an array, then add all plugins in the array.
41754                         // This allows for a plugin to depend on other plugins.
41755                         if (isList$1(plugin)) {
41756                                 each$1(plugin, function(plugin) {
41757                                         self._addPlugin(plugin);
41758                                 });
41759                                 return
41760                         }
41761
41762                         // Keep track of all plugins we've seen so far, so that we
41763                         // don't add any of them twice.
41764                         var seenPlugin = pluck$1(this.plugins, function(seenPlugin) {
41765                                 return (plugin === seenPlugin)
41766                         });
41767                         if (seenPlugin) {
41768                                 return
41769                         }
41770                         this.plugins.push(plugin);
41771
41772                         // Check that the plugin is properly formed
41773                         if (!isFunction$2(plugin)) {
41774                                 throw new Error('Plugins must be function values that return objects')
41775                         }
41776
41777                         var pluginProperties = plugin.call(this);
41778                         if (!isObject$2(pluginProperties)) {
41779                                 throw new Error('Plugins must return an object of function properties')
41780                         }
41781
41782                         // Add the plugin function properties to this store instance.
41783                         each$1(pluginProperties, function(pluginFnProp, propName) {
41784                                 if (!isFunction$2(pluginFnProp)) {
41785                                         throw new Error('Bad plugin property: '+propName+' from plugin '+plugin.name+'. Plugins should only return functions.')
41786                                 }
41787                                 self._assignPluginFnProp(pluginFnProp, propName);
41788                         });
41789                 },
41790                 
41791                 // Put deprecated properties in the private API, so as to not expose it to accidential
41792                 // discovery through inspection of the store object.
41793                 
41794                 // Deprecated: addStorage
41795                 addStorage: function(storage) {
41796                         _warn('store.addStorage(storage) is deprecated. Use createStore([storages])');
41797                         this._addStorage(storage);
41798                 }
41799         };
41800
41801         var store = create$3(_privateStoreProps, storeAPI, {
41802                 plugins: []
41803         });
41804         store.raw = {};
41805         each$1(store, function(prop, propName) {
41806                 if (isFunction$2(prop)) {
41807                         store.raw[propName] = bind$1(store, prop);                      
41808                 }
41809         });
41810         each$1(storages, function(storage) {
41811                 store._addStorage(storage);
41812         });
41813         each$1(plugins, function(plugin) {
41814                 store._addPlugin(plugin);
41815         });
41816         return store
41817   }
41818
41819   var Global$1 = util.Global;
41820
41821   var localStorage_1 = {
41822         name: 'localStorage',
41823         read: read,
41824         write: write,
41825         each: each$2,
41826         remove: remove$2,
41827         clearAll: clearAll,
41828   };
41829
41830   function localStorage$1() {
41831         return Global$1.localStorage
41832   }
41833
41834   function read(key) {
41835         return localStorage$1().getItem(key)
41836   }
41837
41838   function write(key, data) {
41839         return localStorage$1().setItem(key, data)
41840   }
41841
41842   function each$2(fn) {
41843         for (var i = localStorage$1().length - 1; i >= 0; i--) {
41844                 var key = localStorage$1().key(i);
41845                 fn(read(key), key);
41846         }
41847   }
41848
41849   function remove$2(key) {
41850         return localStorage$1().removeItem(key)
41851   }
41852
41853   function clearAll() {
41854         return localStorage$1().clear()
41855   }
41856
41857   // oldFF-globalStorage provides storage for Firefox
41858   // versions 6 and 7, where no localStorage, etc
41859   // is available.
41860
41861
41862   var Global$2 = util.Global;
41863
41864   var oldFFGlobalStorage = {
41865         name: 'oldFF-globalStorage',
41866         read: read$1,
41867         write: write$1,
41868         each: each$3,
41869         remove: remove$3,
41870         clearAll: clearAll$1,
41871   };
41872
41873   var globalStorage = Global$2.globalStorage;
41874
41875   function read$1(key) {
41876         return globalStorage[key]
41877   }
41878
41879   function write$1(key, data) {
41880         globalStorage[key] = data;
41881   }
41882
41883   function each$3(fn) {
41884         for (var i = globalStorage.length - 1; i >= 0; i--) {
41885                 var key = globalStorage.key(i);
41886                 fn(globalStorage[key], key);
41887         }
41888   }
41889
41890   function remove$3(key) {
41891         return globalStorage.removeItem(key)
41892   }
41893
41894   function clearAll$1() {
41895         each$3(function(key, _) {
41896                 delete globalStorage[key];
41897         });
41898   }
41899
41900   // oldIE-userDataStorage provides storage for Internet Explorer
41901   // versions 6 and 7, where no localStorage, sessionStorage, etc
41902   // is available.
41903
41904
41905   var Global$3 = util.Global;
41906
41907   var oldIEUserDataStorage = {
41908         name: 'oldIE-userDataStorage',
41909         write: write$2,
41910         read: read$2,
41911         each: each$4,
41912         remove: remove$4,
41913         clearAll: clearAll$2,
41914   };
41915
41916   var storageName = 'storejs';
41917   var doc = Global$3.document;
41918   var _withStorageEl = _makeIEStorageElFunction();
41919   var disable = (Global$3.navigator ? Global$3.navigator.userAgent : '').match(/ (MSIE 8|MSIE 9|MSIE 10)\./); // MSIE 9.x, MSIE 10.x
41920
41921   function write$2(unfixedKey, data) {
41922         if (disable) { return }
41923         var fixedKey = fixKey(unfixedKey);
41924         _withStorageEl(function(storageEl) {
41925                 storageEl.setAttribute(fixedKey, data);
41926                 storageEl.save(storageName);
41927         });
41928   }
41929
41930   function read$2(unfixedKey) {
41931         if (disable) { return }
41932         var fixedKey = fixKey(unfixedKey);
41933         var res = null;
41934         _withStorageEl(function(storageEl) {
41935                 res = storageEl.getAttribute(fixedKey);
41936         });
41937         return res
41938   }
41939
41940   function each$4(callback) {
41941         _withStorageEl(function(storageEl) {
41942                 var attributes = storageEl.XMLDocument.documentElement.attributes;
41943                 for (var i=attributes.length-1; i>=0; i--) {
41944                         var attr = attributes[i];
41945                         callback(storageEl.getAttribute(attr.name), attr.name);
41946                 }
41947         });
41948   }
41949
41950   function remove$4(unfixedKey) {
41951         var fixedKey = fixKey(unfixedKey);
41952         _withStorageEl(function(storageEl) {
41953                 storageEl.removeAttribute(fixedKey);
41954                 storageEl.save(storageName);
41955         });
41956   }
41957
41958   function clearAll$2() {
41959         _withStorageEl(function(storageEl) {
41960                 var attributes = storageEl.XMLDocument.documentElement.attributes;
41961                 storageEl.load(storageName);
41962                 for (var i=attributes.length-1; i>=0; i--) {
41963                         storageEl.removeAttribute(attributes[i].name);
41964                 }
41965                 storageEl.save(storageName);
41966         });
41967   }
41968
41969   // Helpers
41970   //////////
41971
41972   // In IE7, keys cannot start with a digit or contain certain chars.
41973   // See https://github.com/marcuswestin/store.js/issues/40
41974   // See https://github.com/marcuswestin/store.js/issues/83
41975   var forbiddenCharsRegex = new RegExp("[!\"#$%&'()*+,/\\\\:;<=>?@[\\]^`{|}~]", "g");
41976   function fixKey(key) {
41977         return key.replace(/^\d/, '___$&').replace(forbiddenCharsRegex, '___')
41978   }
41979
41980   function _makeIEStorageElFunction() {
41981         if (!doc || !doc.documentElement || !doc.documentElement.addBehavior) {
41982                 return null
41983         }
41984         var scriptTag = 'script',
41985                 storageOwner,
41986                 storageContainer,
41987                 storageEl;
41988
41989         // Since #userData storage applies only to specific paths, we need to
41990         // somehow link our data to a specific path.  We choose /favicon.ico
41991         // as a pretty safe option, since all browsers already make a request to
41992         // this URL anyway and being a 404 will not hurt us here.  We wrap an
41993         // iframe pointing to the favicon in an ActiveXObject(htmlfile) object
41994         // (see: http://msdn.microsoft.com/en-us/library/aa752574(v=VS.85).aspx)
41995         // since the iframe access rules appear to allow direct access and
41996         // manipulation of the document element, even for a 404 page.  This
41997         // document can be used instead of the current document (which would
41998         // have been limited to the current path) to perform #userData storage.
41999         try {
42000                 /* global ActiveXObject */
42001                 storageContainer = new ActiveXObject('htmlfile');
42002                 storageContainer.open();
42003                 storageContainer.write('<'+scriptTag+'>document.w=window</'+scriptTag+'><iframe src="/favicon.ico"></iframe>');
42004                 storageContainer.close();
42005                 storageOwner = storageContainer.w.frames[0].document;
42006                 storageEl = storageOwner.createElement('div');
42007         } catch(e) {
42008                 // somehow ActiveXObject instantiation failed (perhaps some special
42009                 // security settings or otherwse), fall back to per-path storage
42010                 storageEl = doc.createElement('div');
42011                 storageOwner = doc.body;
42012         }
42013
42014         return function(storeFunction) {
42015                 var args = [].slice.call(arguments, 0);
42016                 args.unshift(storageEl);
42017                 // See http://msdn.microsoft.com/en-us/library/ms531081(v=VS.85).aspx
42018                 // and http://msdn.microsoft.com/en-us/library/ms531424(v=VS.85).aspx
42019                 storageOwner.appendChild(storageEl);
42020                 storageEl.addBehavior('#default#userData');
42021                 storageEl.load(storageName);
42022                 storeFunction.apply(this, args);
42023                 storageOwner.removeChild(storageEl);
42024                 return
42025         }
42026   }
42027
42028   // cookieStorage is useful Safari private browser mode, where localStorage
42029   // doesn't work but cookies do. This implementation is adopted from
42030   // https://developer.mozilla.org/en-US/docs/Web/API/Storage/LocalStorage
42031
42032
42033   var Global$4 = util.Global;
42034   var trim$1 = util.trim;
42035
42036   var cookieStorage = {
42037         name: 'cookieStorage',
42038         read: read$3,
42039         write: write$3,
42040         each: each$5,
42041         remove: remove$5,
42042         clearAll: clearAll$3,
42043   };
42044
42045   var doc$1 = Global$4.document;
42046
42047   function read$3(key) {
42048         if (!key || !_has(key)) { return null }
42049         var regexpStr = "(?:^|.*;\\s*)" +
42050                 escape(key).replace(/[\-\.\+\*]/g, "\\$&") +
42051                 "\\s*\\=\\s*((?:[^;](?!;))*[^;]?).*";
42052         return unescape(doc$1.cookie.replace(new RegExp(regexpStr), "$1"))
42053   }
42054
42055   function each$5(callback) {
42056         var cookies = doc$1.cookie.split(/; ?/g);
42057         for (var i = cookies.length - 1; i >= 0; i--) {
42058                 if (!trim$1(cookies[i])) {
42059                         continue
42060                 }
42061                 var kvp = cookies[i].split('=');
42062                 var key = unescape(kvp[0]);
42063                 var val = unescape(kvp[1]);
42064                 callback(val, key);
42065         }
42066   }
42067
42068   function write$3(key, data) {
42069         if(!key) { return }
42070         doc$1.cookie = escape(key) + "=" + escape(data) + "; expires=Tue, 19 Jan 2038 03:14:07 GMT; path=/";
42071   }
42072
42073   function remove$5(key) {
42074         if (!key || !_has(key)) {
42075                 return
42076         }
42077         doc$1.cookie = escape(key) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT; path=/";
42078   }
42079
42080   function clearAll$3() {
42081         each$5(function(_, key) {
42082                 remove$5(key);
42083         });
42084   }
42085
42086   function _has(key) {
42087         return (new RegExp("(?:^|;\\s*)" + escape(key).replace(/[\-\.\+\*]/g, "\\$&") + "\\s*\\=")).test(doc$1.cookie)
42088   }
42089
42090   var Global$5 = util.Global;
42091
42092   var sessionStorage_1 = {
42093         name: 'sessionStorage',
42094         read: read$4,
42095         write: write$4,
42096         each: each$6,
42097         remove: remove$6,
42098         clearAll: clearAll$4
42099   };
42100
42101   function sessionStorage() {
42102         return Global$5.sessionStorage
42103   }
42104
42105   function read$4(key) {
42106         return sessionStorage().getItem(key)
42107   }
42108
42109   function write$4(key, data) {
42110         return sessionStorage().setItem(key, data)
42111   }
42112
42113   function each$6(fn) {
42114         for (var i = sessionStorage().length - 1; i >= 0; i--) {
42115                 var key = sessionStorage().key(i);
42116                 fn(read$4(key), key);
42117         }
42118   }
42119
42120   function remove$6(key) {
42121         return sessionStorage().removeItem(key)
42122   }
42123
42124   function clearAll$4() {
42125         return sessionStorage().clear()
42126   }
42127
42128   // memoryStorage is a useful last fallback to ensure that the store
42129   // is functions (meaning store.get(), store.set(), etc will all function).
42130   // However, stored values will not persist when the browser navigates to
42131   // a new page or reloads the current page.
42132
42133   var memoryStorage_1 = {
42134         name: 'memoryStorage',
42135         read: read$5,
42136         write: write$5,
42137         each: each$7,
42138         remove: remove$7,
42139         clearAll: clearAll$5,
42140   };
42141
42142   var memoryStorage = {};
42143
42144   function read$5(key) {
42145         return memoryStorage[key]
42146   }
42147
42148   function write$5(key, data) {
42149         memoryStorage[key] = data;
42150   }
42151
42152   function each$7(callback) {
42153         for (var key in memoryStorage) {
42154                 if (memoryStorage.hasOwnProperty(key)) {
42155                         callback(memoryStorage[key], key);
42156                 }
42157         }
42158   }
42159
42160   function remove$7(key) {
42161         delete memoryStorage[key];
42162   }
42163
42164   function clearAll$5(key) {
42165         memoryStorage = {};
42166   }
42167
42168   var all = [
42169         // Listed in order of usage preference
42170         localStorage_1,
42171         oldFFGlobalStorage,
42172         oldIEUserDataStorage,
42173         cookieStorage,
42174         sessionStorage_1,
42175         memoryStorage_1
42176   ];
42177
42178   /* eslint-disable */
42179
42180   //  json2.js
42181   //  2016-10-28
42182   //  Public Domain.
42183   //  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
42184   //  See http://www.JSON.org/js.html
42185   //  This code should be minified before deployment.
42186   //  See http://javascript.crockford.com/jsmin.html
42187
42188   //  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
42189   //  NOT CONTROL.
42190
42191   //  This file creates a global JSON object containing two methods: stringify
42192   //  and parse. This file provides the ES5 JSON capability to ES3 systems.
42193   //  If a project might run on IE8 or earlier, then this file should be included.
42194   //  This file does nothing on ES5 systems.
42195
42196   //      JSON.stringify(value, replacer, space)
42197   //          value       any JavaScript value, usually an object or array.
42198   //          replacer    an optional parameter that determines how object
42199   //                      values are stringified for objects. It can be a
42200   //                      function or an array of strings.
42201   //          space       an optional parameter that specifies the indentation
42202   //                      of nested structures. If it is omitted, the text will
42203   //                      be packed without extra whitespace. If it is a number,
42204   //                      it will specify the number of spaces to indent at each
42205   //                      level. If it is a string (such as "\t" or "&nbsp;"),
42206   //                      it contains the characters used to indent at each level.
42207   //          This method produces a JSON text from a JavaScript value.
42208   //          When an object value is found, if the object contains a toJSON
42209   //          method, its toJSON method will be called and the result will be
42210   //          stringified. A toJSON method does not serialize: it returns the
42211   //          value represented by the name/value pair that should be serialized,
42212   //          or undefined if nothing should be serialized. The toJSON method
42213   //          will be passed the key associated with the value, and this will be
42214   //          bound to the value.
42215
42216   //          For example, this would serialize Dates as ISO strings.
42217
42218   //              Date.prototype.toJSON = function (key) {
42219   //                  function f(n) {
42220   //                      // Format integers to have at least two digits.
42221   //                      return (n < 10)
42222   //                          ? "0" + n
42223   //                          : n;
42224   //                  }
42225   //                  return this.getUTCFullYear()   + "-" +
42226   //                       f(this.getUTCMonth() + 1) + "-" +
42227   //                       f(this.getUTCDate())      + "T" +
42228   //                       f(this.getUTCHours())     + ":" +
42229   //                       f(this.getUTCMinutes())   + ":" +
42230   //                       f(this.getUTCSeconds())   + "Z";
42231   //              };
42232
42233   //          You can provide an optional replacer method. It will be passed the
42234   //          key and value of each member, with this bound to the containing
42235   //          object. The value that is returned from your method will be
42236   //          serialized. If your method returns undefined, then the member will
42237   //          be excluded from the serialization.
42238
42239   //          If the replacer parameter is an array of strings, then it will be
42240   //          used to select the members to be serialized. It filters the results
42241   //          such that only members with keys listed in the replacer array are
42242   //          stringified.
42243
42244   //          Values that do not have JSON representations, such as undefined or
42245   //          functions, will not be serialized. Such values in objects will be
42246   //          dropped; in arrays they will be replaced with null. You can use
42247   //          a replacer function to replace those with JSON values.
42248
42249   //          JSON.stringify(undefined) returns undefined.
42250
42251   //          The optional space parameter produces a stringification of the
42252   //          value that is filled with line breaks and indentation to make it
42253   //          easier to read.
42254
42255   //          If the space parameter is a non-empty string, then that string will
42256   //          be used for indentation. If the space parameter is a number, then
42257   //          the indentation will be that many spaces.
42258
42259   //          Example:
42260
42261   //          text = JSON.stringify(["e", {pluribus: "unum"}]);
42262   //          // text is '["e",{"pluribus":"unum"}]'
42263
42264   //          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
42265   //          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
42266
42267   //          text = JSON.stringify([new Date()], function (key, value) {
42268   //              return this[key] instanceof Date
42269   //                  ? "Date(" + this[key] + ")"
42270   //                  : value;
42271   //          });
42272   //          // text is '["Date(---current time---)"]'
42273
42274   //      JSON.parse(text, reviver)
42275   //          This method parses a JSON text to produce an object or array.
42276   //          It can throw a SyntaxError exception.
42277
42278   //          The optional reviver parameter is a function that can filter and
42279   //          transform the results. It receives each of the keys and values,
42280   //          and its return value is used instead of the original value.
42281   //          If it returns what it received, then the structure is not modified.
42282   //          If it returns undefined then the member is deleted.
42283
42284   //          Example:
42285
42286   //          // Parse the text. Values that look like ISO date strings will
42287   //          // be converted to Date objects.
42288
42289   //          myData = JSON.parse(text, function (key, value) {
42290   //              var a;
42291   //              if (typeof value === "string") {
42292   //                  a =
42293   //   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
42294   //                  if (a) {
42295   //                      return new Date(Date.UTC(+a[1], +a[2] - 1, +a[3], +a[4],
42296   //                          +a[5], +a[6]));
42297   //                  }
42298   //              }
42299   //              return value;
42300   //          });
42301
42302   //          myData = JSON.parse('["Date(09/09/2001)"]', function (key, value) {
42303   //              var d;
42304   //              if (typeof value === "string" &&
42305   //                      value.slice(0, 5) === "Date(" &&
42306   //                      value.slice(-1) === ")") {
42307   //                  d = new Date(value.slice(5, -1));
42308   //                  if (d) {
42309   //                      return d;
42310   //                  }
42311   //              }
42312   //              return value;
42313   //          });
42314
42315   //  This is a reference implementation. You are free to copy, modify, or
42316   //  redistribute.
42317
42318   /*jslint
42319       eval, for, this
42320   */
42321
42322   /*property
42323       JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
42324       getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
42325       lastIndex, length, parse, prototype, push, replace, slice, stringify,
42326       test, toJSON, toString, valueOf
42327   */
42328
42329
42330   // Create a JSON object only if one does not already exist. We create the
42331   // methods in a closure to avoid creating global variables.
42332
42333   if (typeof JSON !== "object") {
42334       JSON = {};
42335   }
42336
42337   (function () {
42338
42339       var rx_one = /^[\],:{}\s]*$/;
42340       var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
42341       var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
42342       var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
42343       var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
42344       var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
42345
42346       function f(n) {
42347           // Format integers to have at least two digits.
42348           return n < 10
42349               ? "0" + n
42350               : n;
42351       }
42352
42353       function this_value() {
42354           return this.valueOf();
42355       }
42356
42357       if (typeof Date.prototype.toJSON !== "function") {
42358
42359           Date.prototype.toJSON = function () {
42360
42361               return isFinite(this.valueOf())
42362                   ? this.getUTCFullYear() + "-" +
42363                           f(this.getUTCMonth() + 1) + "-" +
42364                           f(this.getUTCDate()) + "T" +
42365                           f(this.getUTCHours()) + ":" +
42366                           f(this.getUTCMinutes()) + ":" +
42367                           f(this.getUTCSeconds()) + "Z"
42368                   : null;
42369           };
42370
42371           Boolean.prototype.toJSON = this_value;
42372           Number.prototype.toJSON = this_value;
42373           String.prototype.toJSON = this_value;
42374       }
42375
42376       var gap;
42377       var indent;
42378       var meta;
42379       var rep;
42380
42381
42382       function quote(string) {
42383
42384   // If the string contains no control characters, no quote characters, and no
42385   // backslash characters, then we can safely slap some quotes around it.
42386   // Otherwise we must also replace the offending characters with safe escape
42387   // sequences.
42388
42389           rx_escapable.lastIndex = 0;
42390           return rx_escapable.test(string)
42391               ? "\"" + string.replace(rx_escapable, function (a) {
42392                   var c = meta[a];
42393                   return typeof c === "string"
42394                       ? c
42395                       : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
42396               }) + "\""
42397               : "\"" + string + "\"";
42398       }
42399
42400
42401       function str(key, holder) {
42402
42403   // Produce a string from holder[key].
42404
42405           var i;          // The loop counter.
42406           var k;          // The member key.
42407           var v;          // The member value.
42408           var length;
42409           var mind = gap;
42410           var partial;
42411           var value = holder[key];
42412
42413   // If the value has a toJSON method, call it to obtain a replacement value.
42414
42415           if (value && typeof value === "object" &&
42416                   typeof value.toJSON === "function") {
42417               value = value.toJSON(key);
42418           }
42419
42420   // If we were called with a replacer function, then call the replacer to
42421   // obtain a replacement value.
42422
42423           if (typeof rep === "function") {
42424               value = rep.call(holder, key, value);
42425           }
42426
42427   // What happens next depends on the value's type.
42428
42429           switch (typeof value) {
42430           case "string":
42431               return quote(value);
42432
42433           case "number":
42434
42435   // JSON numbers must be finite. Encode non-finite numbers as null.
42436
42437               return isFinite(value)
42438                   ? String(value)
42439                   : "null";
42440
42441           case "boolean":
42442           case "null":
42443
42444   // If the value is a boolean or null, convert it to a string. Note:
42445   // typeof null does not produce "null". The case is included here in
42446   // the remote chance that this gets fixed someday.
42447
42448               return String(value);
42449
42450   // If the type is "object", we might be dealing with an object or an array or
42451   // null.
42452
42453           case "object":
42454
42455   // Due to a specification blunder in ECMAScript, typeof null is "object",
42456   // so watch out for that case.
42457
42458               if (!value) {
42459                   return "null";
42460               }
42461
42462   // Make an array to hold the partial results of stringifying this object value.
42463
42464               gap += indent;
42465               partial = [];
42466
42467   // Is the value an array?
42468
42469               if (Object.prototype.toString.apply(value) === "[object Array]") {
42470
42471   // The value is an array. Stringify every element. Use null as a placeholder
42472   // for non-JSON values.
42473
42474                   length = value.length;
42475                   for (i = 0; i < length; i += 1) {
42476                       partial[i] = str(i, value) || "null";
42477                   }
42478
42479   // Join all of the elements together, separated with commas, and wrap them in
42480   // brackets.
42481
42482                   v = partial.length === 0
42483                       ? "[]"
42484                       : gap
42485                           ? "[\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "]"
42486                           : "[" + partial.join(",") + "]";
42487                   gap = mind;
42488                   return v;
42489               }
42490
42491   // If the replacer is an array, use it to select the members to be stringified.
42492
42493               if (rep && typeof rep === "object") {
42494                   length = rep.length;
42495                   for (i = 0; i < length; i += 1) {
42496                       if (typeof rep[i] === "string") {
42497                           k = rep[i];
42498                           v = str(k, value);
42499                           if (v) {
42500                               partial.push(quote(k) + (
42501                                   gap
42502                                       ? ": "
42503                                       : ":"
42504                               ) + v);
42505                           }
42506                       }
42507                   }
42508               } else {
42509
42510   // Otherwise, iterate through all of the keys in the object.
42511
42512                   for (k in value) {
42513                       if (Object.prototype.hasOwnProperty.call(value, k)) {
42514                           v = str(k, value);
42515                           if (v) {
42516                               partial.push(quote(k) + (
42517                                   gap
42518                                       ? ": "
42519                                       : ":"
42520                               ) + v);
42521                           }
42522                       }
42523                   }
42524               }
42525
42526   // Join all of the member texts together, separated with commas,
42527   // and wrap them in braces.
42528
42529               v = partial.length === 0
42530                   ? "{}"
42531                   : gap
42532                       ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
42533                       : "{" + partial.join(",") + "}";
42534               gap = mind;
42535               return v;
42536           }
42537       }
42538
42539   // If the JSON object does not yet have a stringify method, give it one.
42540
42541       if (typeof JSON.stringify !== "function") {
42542           meta = {    // table of character substitutions
42543               "\b": "\\b",
42544               "\t": "\\t",
42545               "\n": "\\n",
42546               "\f": "\\f",
42547               "\r": "\\r",
42548               "\"": "\\\"",
42549               "\\": "\\\\"
42550           };
42551           JSON.stringify = function (value, replacer, space) {
42552
42553   // The stringify method takes a value and an optional replacer, and an optional
42554   // space parameter, and returns a JSON text. The replacer can be a function
42555   // that can replace values, or an array of strings that will select the keys.
42556   // A default replacer method can be provided. Use of the space parameter can
42557   // produce text that is more easily readable.
42558
42559               var i;
42560               gap = "";
42561               indent = "";
42562
42563   // If the space parameter is a number, make an indent string containing that
42564   // many spaces.
42565
42566               if (typeof space === "number") {
42567                   for (i = 0; i < space; i += 1) {
42568                       indent += " ";
42569                   }
42570
42571   // If the space parameter is a string, it will be used as the indent string.
42572
42573               } else if (typeof space === "string") {
42574                   indent = space;
42575               }
42576
42577   // If there is a replacer, it must be a function or an array.
42578   // Otherwise, throw an error.
42579
42580               rep = replacer;
42581               if (replacer && typeof replacer !== "function" &&
42582                       (typeof replacer !== "object" ||
42583                       typeof replacer.length !== "number")) {
42584                   throw new Error("JSON.stringify");
42585               }
42586
42587   // Make a fake root object containing our value under the key of "".
42588   // Return the result of stringifying the value.
42589
42590               return str("", {"": value});
42591           };
42592       }
42593
42594
42595   // If the JSON object does not yet have a parse method, give it one.
42596
42597       if (typeof JSON.parse !== "function") {
42598           JSON.parse = function (text, reviver) {
42599
42600   // The parse method takes a text and an optional reviver function, and returns
42601   // a JavaScript value if the text is a valid JSON text.
42602
42603               var j;
42604
42605               function walk(holder, key) {
42606
42607   // The walk method is used to recursively walk the resulting structure so
42608   // that modifications can be made.
42609
42610                   var k;
42611                   var v;
42612                   var value = holder[key];
42613                   if (value && typeof value === "object") {
42614                       for (k in value) {
42615                           if (Object.prototype.hasOwnProperty.call(value, k)) {
42616                               v = walk(value, k);
42617                               if (v !== undefined) {
42618                                   value[k] = v;
42619                               } else {
42620                                   delete value[k];
42621                               }
42622                           }
42623                       }
42624                   }
42625                   return reviver.call(holder, key, value);
42626               }
42627
42628
42629   // Parsing happens in four stages. In the first stage, we replace certain
42630   // Unicode characters with escape sequences. JavaScript handles many characters
42631   // incorrectly, either silently deleting them, or treating them as line endings.
42632
42633               text = String(text);
42634               rx_dangerous.lastIndex = 0;
42635               if (rx_dangerous.test(text)) {
42636                   text = text.replace(rx_dangerous, function (a) {
42637                       return "\\u" +
42638                               ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
42639                   });
42640               }
42641
42642   // In the second stage, we run the text against regular expressions that look
42643   // for non-JSON patterns. We are especially concerned with "()" and "new"
42644   // because they can cause invocation, and "=" because it can cause mutation.
42645   // But just to be safe, we want to reject all unexpected forms.
42646
42647   // We split the second stage into 4 regexp operations in order to work around
42648   // crippling inefficiencies in IE's and Safari's regexp engines. First we
42649   // replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
42650   // replace all simple value tokens with "]" characters. Third, we delete all
42651   // open brackets that follow a colon or comma or that begin the text. Finally,
42652   // we look to see that the remaining characters are only whitespace or "]" or
42653   // "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
42654
42655               if (
42656                   rx_one.test(
42657                       text
42658                           .replace(rx_two, "@")
42659                           .replace(rx_three, "]")
42660                           .replace(rx_four, "")
42661                   )
42662               ) {
42663
42664   // In the third stage we use the eval function to compile the text into a
42665   // JavaScript structure. The "{" operator is subject to a syntactic ambiguity
42666   // in JavaScript: it can begin a block or an object literal. We wrap the text
42667   // in parens to eliminate the ambiguity.
42668
42669                   j = eval("(" + text + ")");
42670
42671   // In the optional fourth stage, we recursively walk the new structure, passing
42672   // each name/value pair to a reviver function for possible transformation.
42673
42674                   return (typeof reviver === "function")
42675                       ? walk({"": j}, "")
42676                       : j;
42677               }
42678
42679   // If the text is not JSON parseable, then a SyntaxError is thrown.
42680
42681               throw new SyntaxError("JSON.parse");
42682           };
42683       }
42684   }());
42685
42686   var json2 = json2Plugin;
42687
42688   function json2Plugin() {
42689         
42690         return {}
42691   }
42692
42693   var plugins = [json2];
42694
42695   var store_legacy = storeEngine.createStore(all, plugins);
42696
42697   // # osm-auth
42698   //
42699   // This code is only compatible with IE10+ because the [XDomainRequest](http://bit.ly/LfO7xo)
42700   // object, IE<10's idea of [CORS](http://en.wikipedia.org/wiki/Cross-origin_resource_sharing),
42701   // does not support custom headers, which this uses everywhere.
42702   var osmAuth = function(o) {
42703
42704       var oauth = {};
42705
42706       // authenticated users will also have a request token secret, but it's
42707       // not used in transactions with the server
42708       oauth.authenticated = function() {
42709           return !!(token('oauth_token') && token('oauth_token_secret'));
42710       };
42711
42712       oauth.logout = function() {
42713           token('oauth_token', '');
42714           token('oauth_token_secret', '');
42715           token('oauth_request_token_secret', '');
42716           return oauth;
42717       };
42718
42719       // TODO: detect lack of click event
42720       oauth.authenticate = function(callback) {
42721           if (oauth.authenticated()) return callback();
42722
42723           oauth.logout();
42724
42725           // ## Getting a request token
42726           var params = timenonce(getAuth(o)),
42727               url = o.url + '/oauth/request_token';
42728
42729           params.oauth_signature = ohauth_1.signature(
42730               o.oauth_secret, '',
42731               ohauth_1.baseString('POST', url, params));
42732
42733           if (!o.singlepage) {
42734               // Create a 600x550 popup window in the center of the screen
42735               var w = 600, h = 550,
42736                   settings = [
42737                       ['width', w], ['height', h],
42738                       ['left', screen.width / 2 - w / 2],
42739                       ['top', screen.height / 2 - h / 2]].map(function(x) {
42740                           return x.join('=');
42741                       }).join(','),
42742                   popup = window.open('about:blank', 'oauth_window', settings);
42743           }
42744
42745           // Request a request token. When this is complete, the popup
42746           // window is redirected to OSM's authorization page.
42747           ohauth_1.xhr('POST', url, params, null, {}, reqTokenDone);
42748           o.loading();
42749
42750           function reqTokenDone(err, xhr) {
42751               o.done();
42752               if (err) return callback(err);
42753               var resp = ohauth_1.stringQs(xhr.response);
42754               token('oauth_request_token_secret', resp.oauth_token_secret);
42755               var authorize_url = o.url + '/oauth/authorize?' + ohauth_1.qsString({
42756                   oauth_token: resp.oauth_token,
42757                   oauth_callback: resolveUrl(o.landing)
42758               });
42759
42760               if (o.singlepage) {
42761                   location.href = authorize_url;
42762               } else {
42763                   popup.location = authorize_url;
42764               }
42765           }
42766
42767           // Called by a function in a landing page, in the popup window. The
42768           // window closes itself.
42769           window.authComplete = function(token) {
42770               var oauth_token = ohauth_1.stringQs(token.split('?')[1]);
42771               get_access_token(oauth_token.oauth_token);
42772               delete window.authComplete;
42773           };
42774
42775           // ## Getting an request token
42776           //
42777           // At this point we have an `oauth_token`, brought in from a function
42778           // call on a landing page popup.
42779           function get_access_token(oauth_token) {
42780               var url = o.url + '/oauth/access_token',
42781                   params = timenonce(getAuth(o)),
42782                   request_token_secret = token('oauth_request_token_secret');
42783               params.oauth_token = oauth_token;
42784               params.oauth_signature = ohauth_1.signature(
42785                   o.oauth_secret,
42786                   request_token_secret,
42787                   ohauth_1.baseString('POST', url, params));
42788
42789               // ## Getting an access token
42790               //
42791               // The final token required for authentication. At this point
42792               // we have a `request token secret`
42793               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
42794               o.loading();
42795           }
42796
42797           function accessTokenDone(err, xhr) {
42798               o.done();
42799               if (err) return callback(err);
42800               var access_token = ohauth_1.stringQs(xhr.response);
42801               token('oauth_token', access_token.oauth_token);
42802               token('oauth_token_secret', access_token.oauth_token_secret);
42803               callback(null, oauth);
42804           }
42805       };
42806
42807       oauth.bootstrapToken = function(oauth_token, callback) {
42808           // ## Getting an request token
42809           // At this point we have an `oauth_token`, brought in from a function
42810           // call on a landing page popup.
42811           function get_access_token(oauth_token) {
42812               var url = o.url + '/oauth/access_token',
42813                   params = timenonce(getAuth(o)),
42814                   request_token_secret = token('oauth_request_token_secret');
42815               params.oauth_token = oauth_token;
42816               params.oauth_signature = ohauth_1.signature(
42817                   o.oauth_secret,
42818                   request_token_secret,
42819                   ohauth_1.baseString('POST', url, params));
42820
42821               // ## Getting an access token
42822               // The final token required for authentication. At this point
42823               // we have a `request token secret`
42824               ohauth_1.xhr('POST', url, params, null, {}, accessTokenDone);
42825               o.loading();
42826           }
42827
42828           function accessTokenDone(err, xhr) {
42829               o.done();
42830               if (err) return callback(err);
42831               var access_token = ohauth_1.stringQs(xhr.response);
42832               token('oauth_token', access_token.oauth_token);
42833               token('oauth_token_secret', access_token.oauth_token_secret);
42834               callback(null, oauth);
42835           }
42836
42837           get_access_token(oauth_token);
42838       };
42839
42840       // # xhr
42841       //
42842       // A single XMLHttpRequest wrapper that does authenticated calls if the
42843       // user has logged in.
42844       oauth.xhr = function(options, callback) {
42845           if (!oauth.authenticated()) {
42846               if (o.auto) {
42847                   return oauth.authenticate(run);
42848               } else {
42849                   callback('not authenticated', null);
42850                   return;
42851               }
42852           } else {
42853               return run();
42854           }
42855
42856           function run() {
42857               var params = timenonce(getAuth(o)),
42858                   oauth_token_secret = token('oauth_token_secret'),
42859                   url = (options.prefix !== false) ? o.url + options.path : options.path,
42860                   url_parts = url.replace(/#.*$/, '').split('?', 2),
42861                   base_url = url_parts[0],
42862                   query = (url_parts.length === 2) ? url_parts[1] : '';
42863
42864               // https://tools.ietf.org/html/rfc5849#section-3.4.1.3.1
42865               if ((!options.options || !options.options.header ||
42866                   options.options.header['Content-Type'] === 'application/x-www-form-urlencoded') &&
42867                   options.content) {
42868                   params = immutable(params, ohauth_1.stringQs(options.content));
42869               }
42870
42871               params.oauth_token = token('oauth_token');
42872               params.oauth_signature = ohauth_1.signature(
42873                   o.oauth_secret,
42874                   oauth_token_secret,
42875                   ohauth_1.baseString(options.method, base_url, immutable(params, ohauth_1.stringQs(query)))
42876               );
42877
42878               return ohauth_1.xhr(options.method, url, params, options.content, options.options, done);
42879           }
42880
42881           function done(err, xhr) {
42882               if (err) return callback(err);
42883               else if (xhr.responseXML) return callback(err, xhr.responseXML);
42884               else return callback(err, xhr.response);
42885           }
42886       };
42887
42888       // pre-authorize this object, if we can just get a token and token_secret
42889       // from the start
42890       oauth.preauth = function(c) {
42891           if (!c) return;
42892           if (c.oauth_token) token('oauth_token', c.oauth_token);
42893           if (c.oauth_token_secret) token('oauth_token_secret', c.oauth_token_secret);
42894           return oauth;
42895       };
42896
42897       oauth.options = function(_) {
42898           if (!arguments.length) return o;
42899
42900           o = _;
42901           o.url = o.url || 'https://www.openstreetmap.org';
42902           o.landing = o.landing || 'land.html';
42903           o.singlepage = o.singlepage || false;
42904
42905           // Optional loading and loading-done functions for nice UI feedback.
42906           // by default, no-ops
42907           o.loading = o.loading || function() {};
42908           o.done = o.done || function() {};
42909
42910           return oauth.preauth(o);
42911       };
42912
42913       // 'stamp' an authentication object from `getAuth()`
42914       // with a [nonce](http://en.wikipedia.org/wiki/Cryptographic_nonce)
42915       // and timestamp
42916       function timenonce(o) {
42917           o.oauth_timestamp = ohauth_1.timestamp();
42918           o.oauth_nonce = ohauth_1.nonce();
42919           return o;
42920       }
42921
42922       // get/set tokens. These are prefixed with the base URL so that `osm-auth`
42923       // can be used with multiple APIs and the keys in `localStorage`
42924       // will not clash
42925       var token;
42926
42927       if (store_legacy.enabled) {
42928           token = function (x, y) {
42929               if (arguments.length === 1) return store_legacy.get(o.url + x);
42930               else if (arguments.length === 2) return store_legacy.set(o.url + x, y);
42931           };
42932       } else {
42933           var storage = {};
42934           token = function (x, y) {
42935               if (arguments.length === 1) return storage[o.url + x];
42936               else if (arguments.length === 2) return storage[o.url + x] = y;
42937           };
42938       }
42939
42940       // Get an authentication object. If you just add and remove properties
42941       // from a single object, you'll need to use `delete` to make sure that
42942       // it doesn't contain undesired properties for authentication
42943       function getAuth(o) {
42944           return {
42945               oauth_consumer_key: o.oauth_consumer_key,
42946               oauth_signature_method: 'HMAC-SHA1'
42947           };
42948       }
42949
42950       // potentially pre-authorize
42951       oauth.options(o);
42952
42953       return oauth;
42954   };
42955
42956   var JXON = new (function () {
42957     var
42958       sValueProp = 'keyValue', sAttributesProp = 'keyAttributes', sAttrPref = '@', /* you can customize these values */
42959       aCache = [], rIsNull = /^\s*$/, rIsBool = /^(?:true|false)$/i;
42960
42961     function parseText (sValue) {
42962       if (rIsNull.test(sValue)) { return null; }
42963       if (rIsBool.test(sValue)) { return sValue.toLowerCase() === 'true'; }
42964       if (isFinite(sValue)) { return parseFloat(sValue); }
42965       if (isFinite(Date.parse(sValue))) { return new Date(sValue); }
42966       return sValue;
42967     }
42968
42969     function EmptyTree () { }
42970     EmptyTree.prototype.toString = function () { return 'null'; };
42971     EmptyTree.prototype.valueOf = function () { return null; };
42972
42973     function objectify (vValue) {
42974       return vValue === null ? new EmptyTree() : vValue instanceof Object ? vValue : new vValue.constructor(vValue);
42975     }
42976
42977     function createObjTree (oParentNode, nVerb, bFreeze, bNesteAttr) {
42978       var
42979         nLevelStart = aCache.length, bChildren = oParentNode.hasChildNodes(),
42980         bAttributes = oParentNode.hasAttributes(), bHighVerb = Boolean(nVerb & 2);
42981
42982       var
42983         sProp, vContent, nLength = 0, sCollectedTxt = '',
42984         vResult = bHighVerb ? {} : /* put here the default value for empty nodes: */ true;
42985
42986       if (bChildren) {
42987         for (var oNode, nItem = 0; nItem < oParentNode.childNodes.length; nItem++) {
42988           oNode = oParentNode.childNodes.item(nItem);
42989           if (oNode.nodeType === 4) { sCollectedTxt += oNode.nodeValue; } /* nodeType is 'CDATASection' (4) */
42990           else if (oNode.nodeType === 3) { sCollectedTxt += oNode.nodeValue.trim(); } /* nodeType is 'Text' (3) */
42991           else if (oNode.nodeType === 1 && !oNode.prefix) { aCache.push(oNode); } /* nodeType is 'Element' (1) */
42992         }
42993       }
42994
42995       var nLevelEnd = aCache.length, vBuiltVal = parseText(sCollectedTxt);
42996
42997       if (!bHighVerb && (bChildren || bAttributes)) { vResult = nVerb === 0 ? objectify(vBuiltVal) : {}; }
42998
42999       for (var nElId = nLevelStart; nElId < nLevelEnd; nElId++) {
43000         sProp = aCache[nElId].nodeName.toLowerCase();
43001         vContent = createObjTree(aCache[nElId], nVerb, bFreeze, bNesteAttr);
43002         if (vResult.hasOwnProperty(sProp)) {
43003           if (vResult[sProp].constructor !== Array) { vResult[sProp] = [vResult[sProp]]; }
43004           vResult[sProp].push(vContent);
43005         } else {
43006           vResult[sProp] = vContent;
43007           nLength++;
43008         }
43009       }
43010
43011       if (bAttributes) {
43012         var
43013           nAttrLen = oParentNode.attributes.length,
43014           sAPrefix = bNesteAttr ? '' : sAttrPref, oAttrParent = bNesteAttr ? {} : vResult;
43015
43016         for (var oAttrib, nAttrib = 0; nAttrib < nAttrLen; nLength++, nAttrib++) {
43017           oAttrib = oParentNode.attributes.item(nAttrib);
43018           oAttrParent[sAPrefix + oAttrib.name.toLowerCase()] = parseText(oAttrib.value.trim());
43019         }
43020
43021         if (bNesteAttr) {
43022           if (bFreeze) { Object.freeze(oAttrParent); }
43023           vResult[sAttributesProp] = oAttrParent;
43024           nLength -= nAttrLen - 1;
43025         }
43026       }
43027
43028       if (nVerb === 3 || (nVerb === 2 || nVerb === 1 && nLength > 0) && sCollectedTxt) {
43029         vResult[sValueProp] = vBuiltVal;
43030       } else if (!bHighVerb && nLength === 0 && sCollectedTxt) {
43031         vResult = vBuiltVal;
43032       }
43033
43034       if (bFreeze && (bHighVerb || nLength > 0)) { Object.freeze(vResult); }
43035
43036       aCache.length = nLevelStart;
43037
43038       return vResult;
43039     }
43040
43041     function loadObjTree (oXMLDoc, oParentEl, oParentObj) {
43042       var vValue, oChild;
43043
43044       if (oParentObj instanceof String || oParentObj instanceof Number || oParentObj instanceof Boolean) {
43045         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toString())); /* verbosity level is 0 */
43046       } else if (oParentObj.constructor === Date) {
43047         oParentEl.appendChild(oXMLDoc.createTextNode(oParentObj.toGMTString()));    
43048       }
43049
43050       for (var sName in oParentObj) {
43051         vValue = oParentObj[sName];
43052         if (isFinite(sName) || vValue instanceof Function) { continue; } /* verbosity level is 0 */
43053         if (sName === sValueProp) {
43054           if (vValue !== null && vValue !== true) { oParentEl.appendChild(oXMLDoc.createTextNode(vValue.constructor === Date ? vValue.toGMTString() : String(vValue))); }
43055         } else if (sName === sAttributesProp) { /* verbosity level is 3 */
43056           for (var sAttrib in vValue) { oParentEl.setAttribute(sAttrib, vValue[sAttrib]); }
43057         } else if (sName.charAt(0) === sAttrPref) {
43058           oParentEl.setAttribute(sName.slice(1), vValue);
43059         } else if (vValue.constructor === Array) {
43060           for (var nItem = 0; nItem < vValue.length; nItem++) {
43061             oChild = oXMLDoc.createElement(sName);
43062             loadObjTree(oXMLDoc, oChild, vValue[nItem]);
43063             oParentEl.appendChild(oChild);
43064           }
43065         } else {
43066           oChild = oXMLDoc.createElement(sName);
43067           if (vValue instanceof Object) {
43068             loadObjTree(oXMLDoc, oChild, vValue);
43069           } else if (vValue !== null && vValue !== true) {
43070             oChild.appendChild(oXMLDoc.createTextNode(vValue.toString()));
43071           }
43072           oParentEl.appendChild(oChild);
43073        }
43074      }
43075     }
43076
43077     this.build = function (oXMLParent, nVerbosity /* optional */, bFreeze /* optional */, bNesteAttributes /* optional */) {
43078       var _nVerb = arguments.length > 1 && typeof nVerbosity === 'number' ? nVerbosity & 3 : /* put here the default verbosity level: */ 1;
43079       return createObjTree(oXMLParent, _nVerb, bFreeze || false, arguments.length > 3 ? bNesteAttributes : _nVerb === 3);    
43080     };
43081
43082     this.unbuild = function (oObjTree) {    
43083       var oNewDoc = document.implementation.createDocument('', '', null);
43084       loadObjTree(oNewDoc, oNewDoc, oObjTree);
43085       return oNewDoc;
43086     };
43087
43088     this.stringify = function (oObjTree) {
43089       return (new XMLSerializer()).serializeToString(JXON.unbuild(oObjTree));
43090     };
43091   })();
43092
43093   // var myObject = JXON.build(doc);
43094   // we got our javascript object! try: alert(JSON.stringify(myObject));
43095
43096   // var newDoc = JXON.unbuild(myObject);
43097   // we got our Document instance! try: alert((new XMLSerializer()).serializeToString(newDoc));
43098
43099   var tiler$2 = utilTiler();
43100   var dispatch$3 = dispatch('authLoading', 'authDone', 'change', 'loading', 'loaded', 'loadedNotes');
43101   var urlroot = 'https://www.openstreetmap.org';
43102   var oauth = osmAuth({
43103       url: urlroot,
43104       oauth_consumer_key: '5A043yRSEugj4DJ5TljuapfnrflWDte8jTOcWLlT',
43105       oauth_secret: 'aB3jKq1TRsCOUrfOIZ6oQMEDmv2ptV76PA54NGLL',
43106       loading: authLoading,
43107       done: authDone
43108   });
43109
43110   var _blacklists = ['.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*'];
43111   var _tileCache = { loaded: {}, inflight: {}, seen: {} };
43112   var _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, rtree: rbush_1() };
43113   var _userCache = { toLoad: {}, user: {} };
43114   var _changeset = {};
43115
43116   var _connectionID = 1;
43117   var _tileZoom = 16;
43118   var _noteZoom = 12;
43119   var _rateLimitError;
43120   var _userChangesets;
43121   var _userDetails;
43122   var _off;
43123
43124
43125   function authLoading() {
43126       dispatch$3.call('authLoading');
43127   }
43128
43129
43130   function authDone() {
43131       dispatch$3.call('authDone');
43132   }
43133
43134
43135   function abortRequest$2(i) {
43136       if (i) {
43137           i.abort();
43138       }
43139   }
43140
43141
43142   function abortUnwantedRequests(cache, tiles) {
43143       forEach(cache.inflight, function(v, k) {
43144           var wanted = find$1(tiles, function(tile) { return k === tile.id; });
43145           if (!wanted) {
43146               abortRequest$2(v);
43147               delete cache.inflight[k];
43148           }
43149       });
43150   }
43151
43152
43153   function getLoc(attrs) {
43154       var lon = attrs.lon && attrs.lon.value;
43155       var lat = attrs.lat && attrs.lat.value;
43156       return [parseFloat(lon), parseFloat(lat)];
43157   }
43158
43159
43160   function getNodes(obj) {
43161       var elems = obj.getElementsByTagName('nd');
43162       var nodes = new Array(elems.length);
43163       for (var i = 0, l = elems.length; i < l; i++) {
43164           nodes[i] = 'n' + elems[i].attributes.ref.value;
43165       }
43166       return nodes;
43167   }
43168
43169
43170   function getTags(obj) {
43171       var elems = obj.getElementsByTagName('tag');
43172       var tags = {};
43173       for (var i = 0, l = elems.length; i < l; i++) {
43174           var attrs = elems[i].attributes;
43175           tags[attrs.k.value] = attrs.v.value;
43176       }
43177
43178       return tags;
43179   }
43180
43181
43182   function getMembers(obj) {
43183       var elems = obj.getElementsByTagName('member');
43184       var members = new Array(elems.length);
43185       for (var i = 0, l = elems.length; i < l; i++) {
43186           var attrs = elems[i].attributes;
43187           members[i] = {
43188               id: attrs.type.value[0] + attrs.ref.value,
43189               type: attrs.type.value,
43190               role: attrs.role.value
43191           };
43192       }
43193       return members;
43194   }
43195
43196
43197   function getVisible(attrs) {
43198       return (!attrs.visible || attrs.visible.value !== 'false');
43199   }
43200
43201
43202   function parseComments(comments) {
43203       var parsedComments = [];
43204
43205       // for each comment
43206       for (var i = 0; i < comments.length; i++) {
43207           var comment = comments[i];
43208           if (comment.nodeName === 'comment') {
43209               var childNodes = comment.childNodes;
43210               var parsedComment = {};
43211
43212               for (var j = 0; j < childNodes.length; j++) {
43213                   var node = childNodes[j];
43214                   var nodeName = node.nodeName;
43215                   if (nodeName === '#text') continue;
43216                   parsedComment[nodeName] = node.textContent;
43217
43218                   if (nodeName === 'uid') {
43219                       var uid = node.textContent;
43220                       if (uid && !_userCache.user[uid]) {
43221                           _userCache.toLoad[uid] = true;
43222                       }
43223                   }
43224               }
43225
43226               if (parsedComment) {
43227                   parsedComments.push(parsedComment);
43228               }
43229           }
43230       }
43231       return parsedComments;
43232   }
43233
43234
43235   function encodeNoteRtree(note) {
43236       return {
43237           minX: note.loc[0],
43238           minY: note.loc[1],
43239           maxX: note.loc[0],
43240           maxY: note.loc[1],
43241           data: note
43242       };
43243   }
43244
43245
43246   var parsers = {
43247       node: function nodeData(obj, uid) {
43248           var attrs = obj.attributes;
43249           return new osmNode({
43250               id: uid,
43251               visible: getVisible(attrs),
43252               version: attrs.version.value,
43253               changeset: attrs.changeset && attrs.changeset.value,
43254               timestamp: attrs.timestamp && attrs.timestamp.value,
43255               user: attrs.user && attrs.user.value,
43256               uid: attrs.uid && attrs.uid.value,
43257               loc: getLoc(attrs),
43258               tags: getTags(obj)
43259           });
43260       },
43261
43262       way: function wayData(obj, uid) {
43263           var attrs = obj.attributes;
43264           return new osmWay({
43265               id: uid,
43266               visible: getVisible(attrs),
43267               version: attrs.version.value,
43268               changeset: attrs.changeset && attrs.changeset.value,
43269               timestamp: attrs.timestamp && attrs.timestamp.value,
43270               user: attrs.user && attrs.user.value,
43271               uid: attrs.uid && attrs.uid.value,
43272               tags: getTags(obj),
43273               nodes: getNodes(obj),
43274           });
43275       },
43276
43277       relation: function relationData(obj, uid) {
43278           var attrs = obj.attributes;
43279           return new osmRelation({
43280               id: uid,
43281               visible: getVisible(attrs),
43282               version: attrs.version.value,
43283               changeset: attrs.changeset && attrs.changeset.value,
43284               timestamp: attrs.timestamp && attrs.timestamp.value,
43285               user: attrs.user && attrs.user.value,
43286               uid: attrs.uid && attrs.uid.value,
43287               tags: getTags(obj),
43288               members: getMembers(obj)
43289           });
43290       },
43291
43292       note: function parseNote(obj, uid) {
43293           var attrs = obj.attributes;
43294           var childNodes = obj.childNodes;
43295           var props = {};
43296
43297           props.id = uid;
43298           props.loc = getLoc(attrs);
43299
43300           // if notes are coincident, move them apart slightly
43301           var coincident = false;
43302           var epsilon = 0.00001;
43303           do {
43304               if (coincident) {
43305                   props.loc = geoVecAdd(props.loc, [epsilon, epsilon]);
43306               }
43307               var bbox = geoExtent$$1(props.loc).bbox();
43308               coincident = _noteCache.rtree.search(bbox).length;
43309           } while (coincident);
43310
43311           // parse note contents
43312           for (var i = 0; i < childNodes.length; i++) {
43313               var node = childNodes[i];
43314               var nodeName = node.nodeName;
43315               if (nodeName === '#text') continue;
43316
43317               // if the element is comments, parse the comments
43318               if (nodeName === 'comments') {
43319                   props[nodeName] = parseComments(node.childNodes);
43320               } else {
43321                   props[nodeName] = node.textContent;
43322               }
43323           }
43324
43325           var note = new osmNote(props);
43326           var item = encodeNoteRtree(note);
43327           _noteCache.note[note.id] = note;
43328           _noteCache.rtree.insert(item);
43329
43330           return note;
43331       },
43332
43333       user: function parseUser(obj, uid) {
43334           var attrs = obj.attributes;
43335           var user = {
43336               id: uid,
43337               display_name: attrs.display_name && attrs.display_name.value,
43338               account_created: attrs.account_created && attrs.account_created.value,
43339               changesets_count: 0
43340           };
43341
43342           var img = obj.getElementsByTagName('img');
43343           if (img && img[0] && img[0].getAttribute('href')) {
43344               user.image_url = img[0].getAttribute('href');
43345           }
43346
43347           var changesets = obj.getElementsByTagName('changesets');
43348           if (changesets && changesets[0] && changesets[0].getAttribute('count')) {
43349               user.changesets_count = changesets[0].getAttribute('count');
43350           }
43351
43352           _userCache.user[uid] = user;
43353           delete _userCache.toLoad[uid];
43354           return user;
43355       }
43356   };
43357
43358
43359   function parseXML(xml$$1, callback, options) {
43360       options = assignIn({ skipSeen: true }, options);
43361       if (!xml$$1 || !xml$$1.childNodes) {
43362           return callback({ message: 'No XML', status: -1 });
43363       }
43364
43365       var root = xml$$1.childNodes[0];
43366       var children = root.childNodes;
43367       utilIdleWorker(children, parseChild, done);
43368
43369
43370       function done(results) {
43371           callback(null, results);
43372       }
43373
43374       function parseChild(child) {
43375           var parser = parsers[child.nodeName];
43376           if (!parser) return null;
43377
43378           var uid;
43379           if (child.nodeName === 'user') {
43380               uid = child.attributes.id.value;
43381               if (options.skipSeen && _userCache.user[uid]) {
43382                   delete _userCache.toLoad[uid];
43383                   return null;
43384               }
43385
43386           } else if (child.nodeName === 'note') {
43387               uid = child.getElementsByTagName('id')[0].textContent;
43388
43389           } else {
43390               uid = osmEntity$$1.id.fromOSM(child.nodeName, child.attributes.id.value);
43391               if (options.skipSeen) {
43392                   if (_tileCache.seen[uid]) return null;  // avoid reparsing a "seen" entity
43393                   _tileCache.seen[uid] = true;
43394               }
43395           }
43396
43397           return parser(child, uid);
43398       }
43399   }
43400
43401
43402   // replace or remove note from rtree
43403   function updateRtree(item, replace) {
43404       _noteCache.rtree.remove(item, function isEql(a, b) { return a.data.id === b.data.id; });
43405
43406       if (replace) {
43407           _noteCache.rtree.insert(item);
43408       }
43409   }
43410
43411
43412   function wrapcb(thisArg, callback, cid) {
43413       return function(err, result) {
43414           if (err) {
43415               // 400 Bad Request, 401 Unauthorized, 403 Forbidden..
43416               if (err.status === 400 || err.status === 401 || err.status === 403) {
43417                   thisArg.logout();
43418               }
43419               return callback.call(thisArg, err);
43420
43421           } else if (thisArg.getConnectionId() !== cid) {
43422               return callback.call(thisArg, { message: 'Connection Switched', status: -1 });
43423
43424           } else {
43425               return callback.call(thisArg, err, result);
43426           }
43427       };
43428   }
43429
43430
43431   var serviceOsm = {
43432
43433       init: function() {
43434           utilRebind(this, dispatch$3, 'on');
43435       },
43436
43437
43438       reset: function() {
43439           _connectionID++;
43440           _userChangesets = undefined;
43441           _userDetails = undefined;
43442           _rateLimitError = undefined;
43443
43444           forEach(_tileCache.inflight, abortRequest$2);
43445           forEach(_noteCache.inflight, abortRequest$2);
43446           forEach(_noteCache.inflightPost, abortRequest$2);
43447           if (_changeset.inflight) abortRequest$2(_changeset.inflight);
43448
43449           _tileCache = { loaded: {}, inflight: {}, seen: {} };
43450           _noteCache = { loaded: {}, inflight: {}, inflightPost: {}, note: {}, rtree: rbush_1() };
43451           _userCache = { toLoad: {}, user: {} };
43452           _changeset = {};
43453
43454           return this;
43455       },
43456
43457
43458       getConnectionId: function() {
43459           return _connectionID;
43460       },
43461
43462
43463       changesetURL: function(changesetID) {
43464           return urlroot + '/changeset/' + changesetID;
43465       },
43466
43467
43468       changesetsURL: function(center, zoom) {
43469           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
43470           return urlroot + '/history#map=' +
43471               Math.floor(zoom) + '/' +
43472               center[1].toFixed(precision) + '/' +
43473               center[0].toFixed(precision);
43474       },
43475
43476
43477       entityURL: function(entity) {
43478           return urlroot + '/' + entity.type + '/' + entity.osmId();
43479       },
43480
43481
43482       historyURL: function(entity) {
43483           return urlroot + '/' + entity.type + '/' + entity.osmId() + '/history';
43484       },
43485
43486
43487       userURL: function(username) {
43488           return urlroot + '/user/' + username;
43489       },
43490
43491
43492       noteURL: function(note) {
43493           return urlroot + '/note/' + note.id;
43494       },
43495
43496
43497       // Generic method to load data from the OSM API
43498       // Can handle either auth or unauth calls.
43499       loadFromAPI: function(path, callback, options) {
43500           options = assignIn({ skipSeen: true }, options);
43501           var that = this;
43502           var cid = _connectionID;
43503
43504           function done(err, xml$$1) {
43505               if (that.getConnectionId() !== cid) {
43506                   if (callback) callback({ message: 'Connection Switched', status: -1 });
43507                   return;
43508               }
43509
43510               var isAuthenticated = that.authenticated();
43511
43512               // 400 Bad Request, 401 Unauthorized, 403 Forbidden
43513               // Logout and retry the request..
43514               if (isAuthenticated && err && (err.status === 400 || err.status === 401 || err.status === 403)) {
43515                   that.logout();
43516                   that.loadFromAPI(path, callback, options);
43517
43518               // else, no retry..
43519               } else {
43520                   // 509 Bandwidth Limit Exceeded, 429 Too Many Requests
43521                   // Set the rateLimitError flag and trigger a warning..
43522                   if (!isAuthenticated && !_rateLimitError && err &&
43523                           (err.status === 509 || err.status === 429)) {
43524                       _rateLimitError = err;
43525                       dispatch$3.call('change');
43526                   }
43527
43528                   if (callback) {
43529                       if (err) {
43530                           return callback(err);
43531                       } else {
43532                           return parseXML(xml$$1, callback, options);
43533                       }
43534                   }
43535               }
43536           }
43537
43538           if (this.authenticated()) {
43539               return oauth.xhr({ method: 'GET', path: path }, done);
43540           } else {
43541               var url = urlroot + path;
43542               return d3_xml(url).get(done);
43543           }
43544       },
43545
43546
43547       // Load a single entity by id (ways and relations use the `/full` call)
43548       // GET /api/0.6/node/#id
43549       // GET /api/0.6/[way|relation]/#id/full
43550       loadEntity: function(id, callback) {
43551           var type = osmEntity$$1.id.type(id);
43552           var osmID = osmEntity$$1.id.toOSM(id);
43553           var options = { skipSeen: false };
43554
43555           this.loadFromAPI(
43556               '/api/0.6/' + type + '/' + osmID + (type !== 'node' ? '/full' : ''),
43557               function(err, entities) {
43558                   if (callback) callback(err, { data: entities });
43559               },
43560               options
43561           );
43562       },
43563
43564
43565       // Load a single entity with a specific version
43566       // GET /api/0.6/[node|way|relation]/#id/#version
43567       loadEntityVersion: function(id, version, callback) {
43568           var type = osmEntity$$1.id.type(id);
43569           var osmID = osmEntity$$1.id.toOSM(id);
43570           var options = { skipSeen: false };
43571
43572           this.loadFromAPI(
43573               '/api/0.6/' + type + '/' + osmID + '/' + version,
43574               function(err, entities) {
43575                   if (callback) callback(err, { data: entities });
43576               },
43577               options
43578           );
43579       },
43580
43581
43582       // Load multiple entities in chunks
43583       // (note: callback may be called multiple times)
43584       // GET /api/0.6/[nodes|ways|relations]?#parameters
43585       loadMultiple: function(ids, callback) {
43586           var that = this;
43587
43588           forEach(groupBy(uniq(ids), osmEntity$$1.id.type), function(v, k) {
43589               var type = k + 's';
43590               var osmIDs = map$3(v, osmEntity$$1.id.toOSM);
43591               var options = { skipSeen: false };
43592
43593               forEach(chunk(osmIDs, 150), function(arr) {
43594                   that.loadFromAPI(
43595                       '/api/0.6/' + type + '?' + type + '=' + arr.join(),
43596                       function(err, entities) {
43597                           if (callback) callback(err, { data: entities });
43598                       },
43599                       options
43600                   );
43601               });
43602           });
43603       },
43604
43605
43606       // Create, upload, and close a changeset
43607       // PUT /api/0.6/changeset/create
43608       // POST /api/0.6/changeset/#id/upload
43609       // PUT /api/0.6/changeset/#id/close
43610       putChangeset: function(changeset, changes, callback) {
43611           var cid = _connectionID;
43612
43613           if (_changeset.inflight) {
43614               return callback({ message: 'Changeset already inflight', status: -2 }, changeset);
43615
43616           } else if (_changeset.open) {   // reuse existing open changeset..
43617               return createdChangeset.call(this, null, _changeset.open);
43618
43619           } else {   // Open a new changeset..
43620               var options = {
43621                   method: 'PUT',
43622                   path: '/api/0.6/changeset/create',
43623                   options: { header: { 'Content-Type': 'text/xml' } },
43624                   content: JXON.stringify(changeset.asJXON())
43625               };
43626               _changeset.inflight = oauth.xhr(
43627                   options,
43628                   wrapcb(this, createdChangeset, cid)
43629               );
43630           }
43631
43632
43633           function createdChangeset(err, changesetID) {
43634               _changeset.inflight = null;
43635               if (err) { return callback(err, changeset); }
43636
43637               _changeset.open = changesetID;
43638               changeset = changeset.update({ id: changesetID });
43639
43640               // Upload the changeset..
43641               var options = {
43642                   method: 'POST',
43643                   path: '/api/0.6/changeset/' + changesetID + '/upload',
43644                   options: { header: { 'Content-Type': 'text/xml' } },
43645                   content: JXON.stringify(changeset.osmChangeJXON(changes))
43646               };
43647               _changeset.inflight = oauth.xhr(
43648                   options,
43649                   wrapcb(this, uploadedChangeset, cid)
43650               );
43651           }
43652
43653
43654           function uploadedChangeset(err) {
43655               _changeset.inflight = null;
43656               if (err) return callback(err, changeset);
43657
43658               // Upload was successful, safe to call the callback.
43659               // Add delay to allow for postgres replication #1646 #2678
43660               window.setTimeout(function() { callback(null, changeset); }, 2500);
43661               _changeset.open = null;
43662
43663               // At this point, we don't really care if the connection was switched..
43664               // Only try to close the changeset if we're still talking to the same server.
43665               if (this.getConnectionId() === cid) {
43666                   // Still attempt to close changeset, but ignore response because #2667
43667                   oauth.xhr({
43668                       method: 'PUT',
43669                       path: '/api/0.6/changeset/' + changeset.id + '/close',
43670                       options: { header: { 'Content-Type': 'text/xml' } }
43671                   }, function() { return true; });
43672               }
43673           }
43674       },
43675
43676
43677       // Load multiple users in chunks
43678       // (note: callback may be called multiple times)
43679       // GET /api/0.6/users?users=#id1,#id2,...,#idn
43680       loadUsers: function(uids, callback) {
43681           var toLoad = [];
43682           var cached = [];
43683
43684           uniq(uids).forEach(function(uid) {
43685               if (_userCache.user[uid]) {
43686                   delete _userCache.toLoad[uid];
43687                   cached.push(_userCache.user[uid]);
43688               } else {
43689                   toLoad.push(uid);
43690               }
43691           });
43692
43693           if (cached.length || !this.authenticated()) {
43694               callback(undefined, cached);
43695               if (!this.authenticated()) return;  // require auth
43696           }
43697
43698           chunk(toLoad, 150).forEach(function(arr) {
43699               oauth.xhr(
43700                   { method: 'GET', path: '/api/0.6/users?users=' + arr.join() },
43701                   wrapcb(this, done, _connectionID)
43702               );
43703           }.bind(this));
43704
43705           function done(err, xml$$1) {
43706               if (err) { return callback(err); }
43707
43708               var options = { skipSeen: true };
43709               return parseXML(xml$$1, function(err, results) {
43710                   if (err) {
43711                       return callback(err);
43712                   } else {
43713                       return callback(undefined, results);
43714                   }
43715               }, options);
43716           }
43717       },
43718
43719
43720       // Load a given user by id
43721       // GET /api/0.6/user/#id
43722       loadUser: function(uid, callback) {
43723           if (_userCache.user[uid] || !this.authenticated()) {   // require auth
43724               delete _userCache.toLoad[uid];
43725               return callback(undefined, _userCache.user[uid]);
43726           }
43727
43728           oauth.xhr(
43729               { method: 'GET', path: '/api/0.6/user/' + uid },
43730               wrapcb(this, done, _connectionID)
43731           );
43732
43733           function done(err, xml$$1) {
43734               if (err) { return callback(err); }
43735
43736               var options = { skipSeen: true };
43737               return parseXML(xml$$1, function(err, results) {
43738                   if (err) {
43739                       return callback(err);
43740                   } else {
43741                       return callback(undefined, results[0]);
43742                   }
43743               }, options);
43744           }
43745       },
43746
43747
43748       // Load the details of the logged-in user
43749       // GET /api/0.6/user/details
43750       userDetails: function(callback) {
43751           if (_userDetails) {    // retrieve cached
43752               return callback(undefined, _userDetails);
43753           }
43754
43755           oauth.xhr(
43756               { method: 'GET', path: '/api/0.6/user/details' },
43757               wrapcb(this, done, _connectionID)
43758           );
43759
43760           function done(err, xml$$1) {
43761               if (err) { return callback(err); }
43762
43763               var options = { skipSeen: false };
43764               return parseXML(xml$$1, function(err, results) {
43765                   if (err) {
43766                       return callback(err);
43767                   } else {
43768                       _userDetails = results[0];
43769                       return callback(undefined, _userDetails);
43770                   }
43771               }, options);
43772           }
43773       },
43774
43775
43776       // Load previous changesets for the logged in user
43777       // GET /api/0.6/changesets?user=#id
43778       userChangesets: function(callback) {
43779           if (_userChangesets) {    // retrieve cached
43780               return callback(undefined, _userChangesets);
43781           }
43782
43783           this.userDetails(
43784               wrapcb(this, gotDetails, _connectionID)
43785           );
43786
43787
43788           function gotDetails(err, user) {
43789               if (err) { return callback(err); }
43790
43791               oauth.xhr(
43792                   { method: 'GET', path: '/api/0.6/changesets?user=' + user.id },
43793                   wrapcb(this, done, _connectionID)
43794               );
43795           }
43796
43797           function done(err, xml$$1) {
43798               if (err) { return callback(err); }
43799
43800               _userChangesets = Array.prototype.map.call(
43801                   xml$$1.getElementsByTagName('changeset'),
43802                   function (changeset) { return { tags: getTags(changeset) }; }
43803               ).filter(function (changeset) {
43804                   var comment = changeset.tags.comment;
43805                   return comment && comment !== '';
43806               });
43807
43808               return callback(undefined, _userChangesets);
43809           }
43810       },
43811
43812
43813       // Fetch the status of the OSM API
43814       // GET /api/capabilities
43815       status: function(callback) {
43816           d3_xml(urlroot + '/api/capabilities').get(
43817               wrapcb(this, done, _connectionID)
43818           );
43819
43820           function done(err, xml$$1) {
43821               if (err) { return callback(err); }
43822
43823               // update blacklists
43824               var elements = xml$$1.getElementsByTagName('blacklist');
43825               var regexes = [];
43826               for (var i = 0; i < elements.length; i++) {
43827                   var regex = elements[i].getAttribute('regex');  // needs unencode?
43828                   if (regex) {
43829                       regexes.push(regex);
43830                   }
43831               }
43832               if (regexes.length) {
43833                   _blacklists = regexes;
43834               }
43835
43836               if (_rateLimitError) {
43837                   return callback(_rateLimitError, 'rateLimited');
43838               } else {
43839                   var apiStatus = xml$$1.getElementsByTagName('status');
43840                   var val = apiStatus[0].getAttribute('api');
43841                   return callback(undefined, val);
43842               }
43843           }
43844       },
43845
43846
43847       // Load data (entities) from the API in tiles
43848       // GET /api/0.6/map?bbox=
43849       loadTiles: function(projection, callback) {
43850           if (_off) return;
43851
43852           var that = this;
43853           var path = '/api/0.6/map?bbox=';
43854
43855           // determine the needed tiles to cover the view
43856           var tiles = tiler$2.zoomExtent([_tileZoom, _tileZoom]).getTiles(projection);
43857
43858           // abort inflight requests that are no longer needed
43859           var hadRequests = !isEmpty(_tileCache.inflight);
43860           abortUnwantedRequests(_tileCache, tiles);
43861           if (hadRequests && isEmpty(_tileCache.inflight)) {
43862               dispatch$3.call('loaded');    // stop the spinner
43863           }
43864
43865           // issue new requests..
43866           tiles.forEach(function(tile) {
43867               if (_tileCache.loaded[tile.id] || _tileCache.inflight[tile.id]) return;
43868               if (isEmpty(_tileCache.inflight)) {
43869                   dispatch$3.call('loading');   // start the spinner
43870               }
43871
43872               var options = { skipSeen: true };
43873               _tileCache.inflight[tile.id] = that.loadFromAPI(
43874                   path + tile.extent.toParam(),
43875                   function(err, parsed) {
43876                       delete _tileCache.inflight[tile.id];
43877                       if (!err) {
43878                           _tileCache.loaded[tile.id] = true;
43879                       }
43880                       if (callback) {
43881                           callback(err, assignIn({ data: parsed }, tile));
43882                       }
43883                       if (isEmpty(_tileCache.inflight)) {
43884                           dispatch$3.call('loaded');     // stop the spinner
43885                       }
43886                   },
43887                   options
43888               );
43889           });
43890       },
43891
43892
43893       // Load notes from the API in tiles
43894       // GET /api/0.6/notes?bbox=
43895       loadNotes: function(projection, noteOptions) {
43896           noteOptions = assignIn({ limit: 10000, closed: 7 }, noteOptions);
43897           if (_off) return;
43898
43899           var that = this;
43900           var path = '/api/0.6/notes?limit=' + noteOptions.limit + '&closed=' + noteOptions.closed + '&bbox=';
43901           var throttleLoadUsers = throttle(function() {
43902               var uids = Object.keys(_userCache.toLoad);
43903               if (!uids.length) return;
43904               that.loadUsers(uids, function() {});  // eagerly load user details
43905           }, 750);
43906
43907           // determine the needed tiles to cover the view
43908           var tiles = tiler$2.zoomExtent([_noteZoom, _noteZoom]).getTiles(projection);
43909
43910           // abort inflight requests that are no longer needed
43911           abortUnwantedRequests(_noteCache, tiles);
43912
43913           // issue new requests..
43914           tiles.forEach(function(tile) {
43915               if (_noteCache.loaded[tile.id] || _noteCache.inflight[tile.id]) return;
43916
43917               var options = { skipSeen: false };
43918               _noteCache.inflight[tile.id] = that.loadFromAPI(
43919                   path + tile.extent.toParam(),
43920                   function(err) {
43921                       delete _noteCache.inflight[tile.id];
43922                       if (!err) {
43923                           _noteCache.loaded[tile.id] = true;
43924                       }
43925                       throttleLoadUsers();
43926                       dispatch$3.call('loadedNotes');
43927                   },
43928                   options
43929               );
43930           });
43931       },
43932
43933
43934       // Create a note
43935       // POST /api/0.6/notes?params
43936       postNoteCreate: function(note, callback) {
43937           if (!this.authenticated()) {
43938               return callback({ message: 'Not Authenticated', status: -3 }, note);
43939           }
43940           if (_noteCache.inflightPost[note.id]) {
43941               return callback({ message: 'Note update already inflight', status: -2 }, note);
43942           }
43943
43944           if (!note.loc[0] || !note.loc[1] || !note.newComment) return; // location & description required
43945
43946           var comment = note.newComment;
43947           if (note.newCategory && note.newCategory !== 'None') { comment += ' #' + note.newCategory; }
43948
43949           var path = '/api/0.6/notes?' + utilQsString({ lon: note.loc[0], lat: note.loc[1], text: comment });
43950
43951           _noteCache.inflightPost[note.id] = oauth.xhr(
43952               { method: 'POST', path: path },
43953               wrapcb(this, done, _connectionID)
43954           );
43955
43956
43957           function done(err, xml$$1) {
43958               delete _noteCache.inflightPost[note.id];
43959               if (err) { return callback(err); }
43960
43961               // we get the updated note back, remove from caches and reparse..
43962               this.removeNote(note);
43963
43964               var options = { skipSeen: false };
43965               return parseXML(xml$$1, function(err, results) {
43966                   if (err) {
43967                       return callback(err);
43968                   } else {
43969                       return callback(undefined, results[0]);
43970                   }
43971               }, options);
43972           }
43973       },
43974
43975
43976       // Update a note
43977       // POST /api/0.6/notes/#id/comment?text=comment
43978       // POST /api/0.6/notes/#id/close?text=comment
43979       // POST /api/0.6/notes/#id/reopen?text=comment
43980       postNoteUpdate: function(note, newStatus, callback) {
43981           if (!this.authenticated()) {
43982               return callback({ message: 'Not Authenticated', status: -3 }, note);
43983           }
43984           if (_noteCache.inflightPost[note.id]) {
43985               return callback({ message: 'Note update already inflight', status: -2 }, note);
43986           }
43987
43988           var action;
43989           if (note.status !== 'closed' && newStatus === 'closed') {
43990               action = 'close';
43991           } else if (note.status !== 'open' && newStatus === 'open') {
43992               action = 'reopen';
43993           } else {
43994               action = 'comment';
43995               if (!note.newComment) return; // when commenting, comment required
43996           }
43997
43998           var path = '/api/0.6/notes/' + note.id + '/' + action;
43999           if (note.newComment) {
44000               path += '?' + utilQsString({ text: note.newComment });
44001           }
44002
44003           _noteCache.inflightPost[note.id] = oauth.xhr(
44004               { method: 'POST', path: path },
44005               wrapcb(this, done, _connectionID)
44006           );
44007
44008
44009           function done(err, xml$$1) {
44010               delete _noteCache.inflightPost[note.id];
44011               if (err) { return callback(err); }
44012
44013               // we get the updated note back, remove from caches and reparse..
44014               this.removeNote(note);
44015
44016               var options = { skipSeen: false };
44017               return parseXML(xml$$1, function(err, results) {
44018                   if (err) {
44019                       return callback(err);
44020                   } else {
44021                       return callback(undefined, results[0]);
44022                   }
44023               }, options);
44024           }
44025       },
44026
44027
44028       switch: function(options) {
44029           urlroot = options.urlroot;
44030
44031           oauth.options(assignIn({
44032               url: urlroot,
44033               loading: authLoading,
44034               done: authDone
44035           }, options));
44036
44037           this.reset();
44038           this.userChangesets(function() {});  // eagerly load user details/changesets
44039           dispatch$3.call('change');
44040           return this;
44041       },
44042
44043
44044       toggle: function(_) {
44045           _off = !_;
44046           return this;
44047       },
44048
44049
44050       isChangesetInflight: function() {
44051           return !!_changeset.inflight;
44052       },
44053
44054
44055       // get/set cached data
44056       // This is used to save/restore the state when entering/exiting the walkthrough
44057       // Also used for testing purposes.
44058       caches: function(obj) {
44059           if (!arguments.length) {
44060               return {
44061                   tile: cloneDeep(_tileCache),
44062                   note: cloneDeep(_noteCache),
44063                   user: cloneDeep(_userCache)
44064               };
44065           }
44066
44067           // access caches directly for testing (e.g., loading notes rtree)
44068           if (obj === 'get') {
44069               return {
44070                   tile: _tileCache,
44071                   note: _noteCache,
44072                   user: _userCache
44073               };
44074           }
44075
44076           if (obj.tile) {
44077               _tileCache = obj.tile;
44078               _tileCache.inflight = {};
44079           }
44080           if (obj.note) {
44081               _noteCache = obj.note;
44082               _noteCache.inflight = {};
44083               _noteCache.inflightPost = {};
44084           }
44085           if (obj.user) {
44086               _userCache = obj.user;
44087           }
44088
44089           return this;
44090       },
44091
44092
44093       logout: function() {
44094           _userChangesets = undefined;
44095           _userDetails = undefined;
44096           oauth.logout();
44097           dispatch$3.call('change');
44098           return this;
44099       },
44100
44101
44102       authenticated: function() {
44103           return oauth.authenticated();
44104       },
44105
44106
44107       authenticate: function(callback) {
44108           var that = this;
44109           var cid = _connectionID;
44110           _userChangesets = undefined;
44111           _userDetails = undefined;
44112
44113           function done(err, res) {
44114               if (err) {
44115                   if (callback) callback(err);
44116                   return;
44117               }
44118               if (that.getConnectionId() !== cid) {
44119                   if (callback) callback({ message: 'Connection Switched', status: -1 });
44120                   return;
44121               }
44122               _rateLimitError = undefined;
44123               dispatch$3.call('change');
44124               if (callback) callback(err, res);
44125               that.userChangesets(function() {});  // eagerly load user details/changesets
44126           }
44127
44128           return oauth.authenticate(done);
44129       },
44130
44131
44132       imageryBlacklists: function() {
44133           return _blacklists;
44134       },
44135
44136
44137       tileZoom: function(_) {
44138           if (!arguments.length) return _tileZoom;
44139           _tileZoom = _;
44140           return this;
44141       },
44142
44143
44144       // get all cached notes covering the viewport
44145       notes: function(projection) {
44146           var viewport = projection.clipExtent();
44147           var min = [viewport[0][0], viewport[1][1]];
44148           var max = [viewport[1][0], viewport[0][1]];
44149           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
44150
44151           return _noteCache.rtree.search(bbox)
44152               .map(function(d) { return d.data; });
44153       },
44154
44155
44156       // get a single note from the cache
44157       getNote: function(id) {
44158           return _noteCache.note[id];
44159       },
44160
44161
44162       // remove a single note from the cache
44163       removeNote: function(note) {
44164           if (!(note instanceof osmNote) || !note.id) return;
44165
44166           delete _noteCache.note[note.id];
44167           updateRtree(encodeNoteRtree(note), false);  // false = remove
44168       },
44169
44170
44171       // replace a single note in the cache
44172       replaceNote: function(note) {
44173           if (!(note instanceof osmNote) || !note.id) return;
44174
44175           _noteCache.note[note.id] = note;
44176           updateRtree(encodeNoteRtree(note), true);  // true = replace
44177           return note;
44178       }
44179
44180   };
44181
44182   var jsonpCache = {};
44183   window.jsonpCache = jsonpCache;
44184
44185   function jsonpRequest(url, callback) {
44186       var request = {
44187           abort: function() {}
44188       };
44189
44190       if (window.JSONP_FIX) {
44191           if (window.JSONP_DELAY === 0) {
44192               callback(window.JSONP_FIX);
44193           } else {
44194               var t = window.setTimeout(function() {
44195                   callback(window.JSONP_FIX);
44196               }, window.JSONP_DELAY || 0);
44197
44198               request.abort = function() { window.clearTimeout(t); };
44199           }
44200
44201           return request;
44202       }
44203
44204       function rand() {
44205           var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
44206           var c = '';
44207           var i = -1;
44208           while (++i < 15) c += chars.charAt(Math.floor(Math.random() * 52));
44209           return c;
44210       }
44211
44212       function create$$1(url) {
44213           var e = url.match(/callback=(\w+)/);
44214           var c = e ? e[1] : rand();
44215
44216           jsonpCache[c] = function(data) {
44217               if (jsonpCache[c]) {
44218                   callback(data);
44219               }
44220               finalize();
44221           };
44222
44223           function finalize() {
44224               delete jsonpCache[c];
44225               script.remove();
44226           }
44227
44228           request.abort = finalize;
44229           return 'jsonpCache.' + c;
44230       }
44231
44232       var cb = create$$1(url);
44233
44234       var script = select('head')
44235           .append('script')
44236           .attr('type', 'text/javascript')
44237           .attr('src', url.replace(/(\{|%7B)callback(\}|%7D)/, cb));
44238
44239       return request;
44240   }
44241
44242   var q = createCommonjsModule(function (module, exports) {
44243   // vim:ts=4:sts=4:sw=4:
44244   /*!
44245    *
44246    * Copyright 2009-2017 Kris Kowal under the terms of the MIT
44247    * license found at https://github.com/kriskowal/q/blob/v1/LICENSE
44248    *
44249    * With parts by Tyler Close
44250    * Copyright 2007-2009 Tyler Close under the terms of the MIT X license found
44251    * at http://www.opensource.org/licenses/mit-license.html
44252    * Forked at ref_send.js version: 2009-05-11
44253    *
44254    * With parts by Mark Miller
44255    * Copyright (C) 2011 Google Inc.
44256    *
44257    * Licensed under the Apache License, Version 2.0 (the "License");
44258    * you may not use this file except in compliance with the License.
44259    * You may obtain a copy of the License at
44260    *
44261    * http://www.apache.org/licenses/LICENSE-2.0
44262    *
44263    * Unless required by applicable law or agreed to in writing, software
44264    * distributed under the License is distributed on an "AS IS" BASIS,
44265    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
44266    * See the License for the specific language governing permissions and
44267    * limitations under the License.
44268    *
44269    */
44270
44271   (function (definition) {
44272
44273       // This file will function properly as a <script> tag, or a module
44274       // using CommonJS and NodeJS or RequireJS module formats.  In
44275       // Common/Node/RequireJS, the module exports the Q API and when
44276       // executed as a simple <script>, it creates a Q global instead.
44277
44278       // Montage Require
44279       if (typeof bootstrap === "function") {
44280           bootstrap("promise", definition);
44281
44282       // CommonJS
44283       } else {
44284           module.exports = definition();
44285
44286       // RequireJS
44287       }
44288
44289   })(function () {
44290
44291   var hasStacks = false;
44292   try {
44293       throw new Error();
44294   } catch (e) {
44295       hasStacks = !!e.stack;
44296   }
44297
44298   // All code after this point will be filtered from stack traces reported
44299   // by Q.
44300   var qStartingLine = captureLine();
44301   var qFileName;
44302
44303   // shims
44304
44305   // used for fallback in "allResolved"
44306   var noop = function () {};
44307
44308   // Use the fastest possible means to execute a task in a future turn
44309   // of the event loop.
44310   var nextTick =(function () {
44311       // linked list of tasks (single, with head node)
44312       var head = {task: void 0, next: null};
44313       var tail = head;
44314       var flushing = false;
44315       var requestTick = void 0;
44316       var isNodeJS = false;
44317       // queue for late tasks, used by unhandled rejection tracking
44318       var laterQueue = [];
44319
44320       function flush() {
44321           /* jshint loopfunc: true */
44322           var task, domain;
44323
44324           while (head.next) {
44325               head = head.next;
44326               task = head.task;
44327               head.task = void 0;
44328               domain = head.domain;
44329
44330               if (domain) {
44331                   head.domain = void 0;
44332                   domain.enter();
44333               }
44334               runSingle(task, domain);
44335
44336           }
44337           while (laterQueue.length) {
44338               task = laterQueue.pop();
44339               runSingle(task);
44340           }
44341           flushing = false;
44342       }
44343       // runs a single function in the async queue
44344       function runSingle(task, domain) {
44345           try {
44346               task();
44347
44348           } catch (e) {
44349               if (isNodeJS) {
44350                   // In node, uncaught exceptions are considered fatal errors.
44351                   // Re-throw them synchronously to interrupt flushing!
44352
44353                   // Ensure continuation if the uncaught exception is suppressed
44354                   // listening "uncaughtException" events (as domains does).
44355                   // Continue in next event to avoid tick recursion.
44356                   if (domain) {
44357                       domain.exit();
44358                   }
44359                   setTimeout(flush, 0);
44360                   if (domain) {
44361                       domain.enter();
44362                   }
44363
44364                   throw e;
44365
44366               } else {
44367                   // In browsers, uncaught exceptions are not fatal.
44368                   // Re-throw them asynchronously to avoid slow-downs.
44369                   setTimeout(function () {
44370                       throw e;
44371                   }, 0);
44372               }
44373           }
44374
44375           if (domain) {
44376               domain.exit();
44377           }
44378       }
44379
44380       nextTick = function (task) {
44381           tail = tail.next = {
44382               task: task,
44383               domain: isNodeJS && process.domain,
44384               next: null
44385           };
44386
44387           if (!flushing) {
44388               flushing = true;
44389               requestTick();
44390           }
44391       };
44392
44393       if (typeof process === "object" &&
44394           process.toString() === "[object process]" && process.nextTick) {
44395           // Ensure Q is in a real Node environment, with a `process.nextTick`.
44396           // To see through fake Node environments:
44397           // * Mocha test runner - exposes a `process` global without a `nextTick`
44398           // * Browserify - exposes a `process.nexTick` function that uses
44399           //   `setTimeout`. In this case `setImmediate` is preferred because
44400           //    it is faster. Browserify's `process.toString()` yields
44401           //   "[object Object]", while in a real Node environment
44402           //   `process.toString()` yields "[object process]".
44403           isNodeJS = true;
44404
44405           requestTick = function () {
44406               process.nextTick(flush);
44407           };
44408
44409       } else if (typeof setImmediate === "function") {
44410           // In IE10, Node.js 0.9+, or https://github.com/NobleJS/setImmediate
44411           if (typeof window !== "undefined") {
44412               requestTick = setImmediate.bind(window, flush);
44413           } else {
44414               requestTick = function () {
44415                   setImmediate(flush);
44416               };
44417           }
44418
44419       } else if (typeof MessageChannel !== "undefined") {
44420           // modern browsers
44421           // http://www.nonblocking.io/2011/06/windownexttick.html
44422           var channel = new MessageChannel();
44423           // At least Safari Version 6.0.5 (8536.30.1) intermittently cannot create
44424           // working message ports the first time a page loads.
44425           channel.port1.onmessage = function () {
44426               requestTick = requestPortTick;
44427               channel.port1.onmessage = flush;
44428               flush();
44429           };
44430           var requestPortTick = function () {
44431               // Opera requires us to provide a message payload, regardless of
44432               // whether we use it.
44433               channel.port2.postMessage(0);
44434           };
44435           requestTick = function () {
44436               setTimeout(flush, 0);
44437               requestPortTick();
44438           };
44439
44440       } else {
44441           // old browsers
44442           requestTick = function () {
44443               setTimeout(flush, 0);
44444           };
44445       }
44446       // runs a task after all other tasks have been run
44447       // this is useful for unhandled rejection tracking that needs to happen
44448       // after all `then`d tasks have been run.
44449       nextTick.runAfter = function (task) {
44450           laterQueue.push(task);
44451           if (!flushing) {
44452               flushing = true;
44453               requestTick();
44454           }
44455       };
44456       return nextTick;
44457   })();
44458
44459   // Attempt to make generics safe in the face of downstream
44460   // modifications.
44461   // There is no situation where this is necessary.
44462   // If you need a security guarantee, these primordials need to be
44463   // deeply frozen anyway, and if you don’t need a security guarantee,
44464   // this is just plain paranoid.
44465   // However, this **might** have the nice side-effect of reducing the size of
44466   // the minified code by reducing x.call() to merely x()
44467   // See Mark Miller’s explanation of what this does.
44468   // http://wiki.ecmascript.org/doku.php?id=conventions:safe_meta_programming
44469   var call = Function.call;
44470   function uncurryThis(f) {
44471       return function () {
44472           return call.apply(f, arguments);
44473       };
44474   }
44475   // This is equivalent, but slower:
44476   // uncurryThis = Function_bind.bind(Function_bind.call);
44477   // http://jsperf.com/uncurrythis
44478
44479   var array_slice = uncurryThis(Array.prototype.slice);
44480
44481   var array_reduce = uncurryThis(
44482       Array.prototype.reduce || function (callback, basis) {
44483           var index = 0,
44484               length = this.length;
44485           // concerning the initial value, if one is not provided
44486           if (arguments.length === 1) {
44487               // seek to the first value in the array, accounting
44488               // for the possibility that is is a sparse array
44489               do {
44490                   if (index in this) {
44491                       basis = this[index++];
44492                       break;
44493                   }
44494                   if (++index >= length) {
44495                       throw new TypeError();
44496                   }
44497               } while (1);
44498           }
44499           // reduce
44500           for (; index < length; index++) {
44501               // account for the possibility that the array is sparse
44502               if (index in this) {
44503                   basis = callback(basis, this[index], index);
44504               }
44505           }
44506           return basis;
44507       }
44508   );
44509
44510   var array_indexOf = uncurryThis(
44511       Array.prototype.indexOf || function (value) {
44512           // not a very good shim, but good enough for our one use of it
44513           for (var i = 0; i < this.length; i++) {
44514               if (this[i] === value) {
44515                   return i;
44516               }
44517           }
44518           return -1;
44519       }
44520   );
44521
44522   var array_map = uncurryThis(
44523       Array.prototype.map || function (callback, thisp) {
44524           var self = this;
44525           var collect = [];
44526           array_reduce(self, function (undefined, value, index) {
44527               collect.push(callback.call(thisp, value, index, self));
44528           }, void 0);
44529           return collect;
44530       }
44531   );
44532
44533   var object_create = Object.create || function (prototype) {
44534       function Type() { }
44535       Type.prototype = prototype;
44536       return new Type();
44537   };
44538
44539   var object_defineProperty = Object.defineProperty || function (obj, prop, descriptor) {
44540       obj[prop] = descriptor.value;
44541       return obj;
44542   };
44543
44544   var object_hasOwnProperty = uncurryThis(Object.prototype.hasOwnProperty);
44545
44546   var object_keys = Object.keys || function (object) {
44547       var keys = [];
44548       for (var key in object) {
44549           if (object_hasOwnProperty(object, key)) {
44550               keys.push(key);
44551           }
44552       }
44553       return keys;
44554   };
44555
44556   var object_toString = uncurryThis(Object.prototype.toString);
44557
44558   function isObject(value) {
44559       return value === Object(value);
44560   }
44561
44562   // generator related shims
44563
44564   // FIXME: Remove this function once ES6 generators are in SpiderMonkey.
44565   function isStopIteration(exception) {
44566       return (
44567           object_toString(exception) === "[object StopIteration]" ||
44568           exception instanceof QReturnValue
44569       );
44570   }
44571
44572   // FIXME: Remove this helper and Q.return once ES6 generators are in
44573   // SpiderMonkey.
44574   var QReturnValue;
44575   if (typeof ReturnValue !== "undefined") {
44576       QReturnValue = ReturnValue;
44577   } else {
44578       QReturnValue = function (value) {
44579           this.value = value;
44580       };
44581   }
44582
44583   // long stack traces
44584
44585   var STACK_JUMP_SEPARATOR = "From previous event:";
44586
44587   function makeStackTraceLong(error, promise) {
44588       // If possible, transform the error stack trace by removing Node and Q
44589       // cruft, then concatenating with the stack trace of `promise`. See #57.
44590       if (hasStacks &&
44591           promise.stack &&
44592           typeof error === "object" &&
44593           error !== null &&
44594           error.stack
44595       ) {
44596           var stacks = [];
44597           for (var p = promise; !!p; p = p.source) {
44598               if (p.stack && (!error.__minimumStackCounter__ || error.__minimumStackCounter__ > p.stackCounter)) {
44599                   object_defineProperty(error, "__minimumStackCounter__", {value: p.stackCounter, configurable: true});
44600                   stacks.unshift(p.stack);
44601               }
44602           }
44603           stacks.unshift(error.stack);
44604
44605           var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
44606           var stack = filterStackString(concatedStacks);
44607           object_defineProperty(error, "stack", {value: stack, configurable: true});
44608       }
44609   }
44610
44611   function filterStackString(stackString) {
44612       var lines = stackString.split("\n");
44613       var desiredLines = [];
44614       for (var i = 0; i < lines.length; ++i) {
44615           var line = lines[i];
44616
44617           if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
44618               desiredLines.push(line);
44619           }
44620       }
44621       return desiredLines.join("\n");
44622   }
44623
44624   function isNodeFrame(stackLine) {
44625       return stackLine.indexOf("(module.js:") !== -1 ||
44626              stackLine.indexOf("(node.js:") !== -1;
44627   }
44628
44629   function getFileNameAndLineNumber(stackLine) {
44630       // Named functions: "at functionName (filename:lineNumber:columnNumber)"
44631       // In IE10 function name can have spaces ("Anonymous function") O_o
44632       var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
44633       if (attempt1) {
44634           return [attempt1[1], Number(attempt1[2])];
44635       }
44636
44637       // Anonymous functions: "at filename:lineNumber:columnNumber"
44638       var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
44639       if (attempt2) {
44640           return [attempt2[1], Number(attempt2[2])];
44641       }
44642
44643       // Firefox style: "function@filename:lineNumber or @filename:lineNumber"
44644       var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
44645       if (attempt3) {
44646           return [attempt3[1], Number(attempt3[2])];
44647       }
44648   }
44649
44650   function isInternalFrame(stackLine) {
44651       var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
44652
44653       if (!fileNameAndLineNumber) {
44654           return false;
44655       }
44656
44657       var fileName = fileNameAndLineNumber[0];
44658       var lineNumber = fileNameAndLineNumber[1];
44659
44660       return fileName === qFileName &&
44661           lineNumber >= qStartingLine &&
44662           lineNumber <= qEndingLine;
44663   }
44664
44665   // discover own file name and line number range for filtering stack
44666   // traces
44667   function captureLine() {
44668       if (!hasStacks) {
44669           return;
44670       }
44671
44672       try {
44673           throw new Error();
44674       } catch (e) {
44675           var lines = e.stack.split("\n");
44676           var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
44677           var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
44678           if (!fileNameAndLineNumber) {
44679               return;
44680           }
44681
44682           qFileName = fileNameAndLineNumber[0];
44683           return fileNameAndLineNumber[1];
44684       }
44685   }
44686
44687   function deprecate(callback, name, alternative) {
44688       return function () {
44689           if (typeof console !== "undefined" &&
44690               typeof console.warn === "function") {
44691               console.warn(name + " is deprecated, use " + alternative +
44692                            " instead.", new Error("").stack);
44693           }
44694           return callback.apply(callback, arguments);
44695       };
44696   }
44697
44698   // end of shims
44699   // beginning of real work
44700
44701   /**
44702    * Constructs a promise for an immediate reference, passes promises through, or
44703    * coerces promises from different systems.
44704    * @param value immediate reference or promise
44705    */
44706   function Q(value) {
44707       // If the object is already a Promise, return it directly.  This enables
44708       // the resolve function to both be used to created references from objects,
44709       // but to tolerably coerce non-promises to promises.
44710       if (value instanceof Promise) {
44711           return value;
44712       }
44713
44714       // assimilate thenables
44715       if (isPromiseAlike(value)) {
44716           return coerce(value);
44717       } else {
44718           return fulfill(value);
44719       }
44720   }
44721   Q.resolve = Q;
44722
44723   /**
44724    * Performs a task in a future turn of the event loop.
44725    * @param {Function} task
44726    */
44727   Q.nextTick = nextTick;
44728
44729   /**
44730    * Controls whether or not long stack traces will be on
44731    */
44732   Q.longStackSupport = false;
44733
44734   /**
44735    * The counter is used to determine the stopping point for building
44736    * long stack traces. In makeStackTraceLong we walk backwards through
44737    * the linked list of promises, only stacks which were created before
44738    * the rejection are concatenated.
44739    */
44740   var longStackCounter = 1;
44741
44742   // enable long stacks if Q_DEBUG is set
44743   if (typeof process === "object" && process && process.env && process.env.Q_DEBUG) {
44744       Q.longStackSupport = true;
44745   }
44746
44747   /**
44748    * Constructs a {promise, resolve, reject} object.
44749    *
44750    * `resolve` is a callback to invoke with a more resolved value for the
44751    * promise. To fulfill the promise, invoke `resolve` with any value that is
44752    * not a thenable. To reject the promise, invoke `resolve` with a rejected
44753    * thenable, or invoke `reject` with the reason directly. To resolve the
44754    * promise to another thenable, thus putting it in the same state, invoke
44755    * `resolve` with that other thenable.
44756    */
44757   Q.defer = defer;
44758   function defer() {
44759       // if "messages" is an "Array", that indicates that the promise has not yet
44760       // been resolved.  If it is "undefined", it has been resolved.  Each
44761       // element of the messages array is itself an array of complete arguments to
44762       // forward to the resolved promise.  We coerce the resolution value to a
44763       // promise using the `resolve` function because it handles both fully
44764       // non-thenable values and other thenables gracefully.
44765       var messages = [], progressListeners = [], resolvedPromise;
44766
44767       var deferred = object_create(defer.prototype);
44768       var promise = object_create(Promise.prototype);
44769
44770       promise.promiseDispatch = function (resolve, op, operands) {
44771           var args = array_slice(arguments);
44772           if (messages) {
44773               messages.push(args);
44774               if (op === "when" && operands[1]) { // progress operand
44775                   progressListeners.push(operands[1]);
44776               }
44777           } else {
44778               Q.nextTick(function () {
44779                   resolvedPromise.promiseDispatch.apply(resolvedPromise, args);
44780               });
44781           }
44782       };
44783
44784       // XXX deprecated
44785       promise.valueOf = function () {
44786           if (messages) {
44787               return promise;
44788           }
44789           var nearerValue = nearer(resolvedPromise);
44790           if (isPromise(nearerValue)) {
44791               resolvedPromise = nearerValue; // shorten chain
44792           }
44793           return nearerValue;
44794       };
44795
44796       promise.inspect = function () {
44797           if (!resolvedPromise) {
44798               return { state: "pending" };
44799           }
44800           return resolvedPromise.inspect();
44801       };
44802
44803       if (Q.longStackSupport && hasStacks) {
44804           try {
44805               throw new Error();
44806           } catch (e) {
44807               // NOTE: don't try to use `Error.captureStackTrace` or transfer the
44808               // accessor around; that causes memory leaks as per GH-111. Just
44809               // reify the stack trace as a string ASAP.
44810               //
44811               // At the same time, cut off the first line; it's always just
44812               // "[object Promise]\n", as per the `toString`.
44813               promise.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
44814               promise.stackCounter = longStackCounter++;
44815           }
44816       }
44817
44818       // NOTE: we do the checks for `resolvedPromise` in each method, instead of
44819       // consolidating them into `become`, since otherwise we'd create new
44820       // promises with the lines `become(whatever(value))`. See e.g. GH-252.
44821
44822       function become(newPromise) {
44823           resolvedPromise = newPromise;
44824
44825           if (Q.longStackSupport && hasStacks) {
44826               // Only hold a reference to the new promise if long stacks
44827               // are enabled to reduce memory usage
44828               promise.source = newPromise;
44829           }
44830
44831           array_reduce(messages, function (undefined, message) {
44832               Q.nextTick(function () {
44833                   newPromise.promiseDispatch.apply(newPromise, message);
44834               });
44835           }, void 0);
44836
44837           messages = void 0;
44838           progressListeners = void 0;
44839       }
44840
44841       deferred.promise = promise;
44842       deferred.resolve = function (value) {
44843           if (resolvedPromise) {
44844               return;
44845           }
44846
44847           become(Q(value));
44848       };
44849
44850       deferred.fulfill = function (value) {
44851           if (resolvedPromise) {
44852               return;
44853           }
44854
44855           become(fulfill(value));
44856       };
44857       deferred.reject = function (reason) {
44858           if (resolvedPromise) {
44859               return;
44860           }
44861
44862           become(reject(reason));
44863       };
44864       deferred.notify = function (progress) {
44865           if (resolvedPromise) {
44866               return;
44867           }
44868
44869           array_reduce(progressListeners, function (undefined, progressListener) {
44870               Q.nextTick(function () {
44871                   progressListener(progress);
44872               });
44873           }, void 0);
44874       };
44875
44876       return deferred;
44877   }
44878
44879   /**
44880    * Creates a Node-style callback that will resolve or reject the deferred
44881    * promise.
44882    * @returns a nodeback
44883    */
44884   defer.prototype.makeNodeResolver = function () {
44885       var self = this;
44886       return function (error, value) {
44887           if (error) {
44888               self.reject(error);
44889           } else if (arguments.length > 2) {
44890               self.resolve(array_slice(arguments, 1));
44891           } else {
44892               self.resolve(value);
44893           }
44894       };
44895   };
44896
44897   /**
44898    * @param resolver {Function} a function that returns nothing and accepts
44899    * the resolve, reject, and notify functions for a deferred.
44900    * @returns a promise that may be resolved with the given resolve and reject
44901    * functions, or rejected by a thrown exception in resolver
44902    */
44903   Q.Promise = promise; // ES6
44904   Q.promise = promise;
44905   function promise(resolver) {
44906       if (typeof resolver !== "function") {
44907           throw new TypeError("resolver must be a function.");
44908       }
44909       var deferred = defer();
44910       try {
44911           resolver(deferred.resolve, deferred.reject, deferred.notify);
44912       } catch (reason) {
44913           deferred.reject(reason);
44914       }
44915       return deferred.promise;
44916   }
44917
44918   promise.race = race; // ES6
44919   promise.all = all; // ES6
44920   promise.reject = reject; // ES6
44921   promise.resolve = Q; // ES6
44922
44923   // XXX experimental.  This method is a way to denote that a local value is
44924   // serializable and should be immediately dispatched to a remote upon request,
44925   // instead of passing a reference.
44926   Q.passByCopy = function (object) {
44927       //freeze(object);
44928       //passByCopies.set(object, true);
44929       return object;
44930   };
44931
44932   Promise.prototype.passByCopy = function () {
44933       //freeze(object);
44934       //passByCopies.set(object, true);
44935       return this;
44936   };
44937
44938   /**
44939    * If two promises eventually fulfill to the same value, promises that value,
44940    * but otherwise rejects.
44941    * @param x {Any*}
44942    * @param y {Any*}
44943    * @returns {Any*} a promise for x and y if they are the same, but a rejection
44944    * otherwise.
44945    *
44946    */
44947   Q.join = function (x, y) {
44948       return Q(x).join(y);
44949   };
44950
44951   Promise.prototype.join = function (that) {
44952       return Q([this, that]).spread(function (x, y) {
44953           if (x === y) {
44954               // TODO: "===" should be Object.is or equiv
44955               return x;
44956           } else {
44957               throw new Error("Q can't join: not the same: " + x + " " + y);
44958           }
44959       });
44960   };
44961
44962   /**
44963    * Returns a promise for the first of an array of promises to become settled.
44964    * @param answers {Array[Any*]} promises to race
44965    * @returns {Any*} the first promise to be settled
44966    */
44967   Q.race = race;
44968   function race(answerPs) {
44969       return promise(function (resolve, reject) {
44970           // Switch to this once we can assume at least ES5
44971           // answerPs.forEach(function (answerP) {
44972           //     Q(answerP).then(resolve, reject);
44973           // });
44974           // Use this in the meantime
44975           for (var i = 0, len = answerPs.length; i < len; i++) {
44976               Q(answerPs[i]).then(resolve, reject);
44977           }
44978       });
44979   }
44980
44981   Promise.prototype.race = function () {
44982       return this.then(Q.race);
44983   };
44984
44985   /**
44986    * Constructs a Promise with a promise descriptor object and optional fallback
44987    * function.  The descriptor contains methods like when(rejected), get(name),
44988    * set(name, value), post(name, args), and delete(name), which all
44989    * return either a value, a promise for a value, or a rejection.  The fallback
44990    * accepts the operation name, a resolver, and any further arguments that would
44991    * have been forwarded to the appropriate method above had a method been
44992    * provided with the proper name.  The API makes no guarantees about the nature
44993    * of the returned object, apart from that it is usable whereever promises are
44994    * bought and sold.
44995    */
44996   Q.makePromise = Promise;
44997   function Promise(descriptor, fallback, inspect) {
44998       if (fallback === void 0) {
44999           fallback = function (op) {
45000               return reject(new Error(
45001                   "Promise does not support operation: " + op
45002               ));
45003           };
45004       }
45005       if (inspect === void 0) {
45006           inspect = function () {
45007               return {state: "unknown"};
45008           };
45009       }
45010
45011       var promise = object_create(Promise.prototype);
45012
45013       promise.promiseDispatch = function (resolve, op, args) {
45014           var result;
45015           try {
45016               if (descriptor[op]) {
45017                   result = descriptor[op].apply(promise, args);
45018               } else {
45019                   result = fallback.call(promise, op, args);
45020               }
45021           } catch (exception) {
45022               result = reject(exception);
45023           }
45024           if (resolve) {
45025               resolve(result);
45026           }
45027       };
45028
45029       promise.inspect = inspect;
45030
45031       // XXX deprecated `valueOf` and `exception` support
45032       if (inspect) {
45033           var inspected = inspect();
45034           if (inspected.state === "rejected") {
45035               promise.exception = inspected.reason;
45036           }
45037
45038           promise.valueOf = function () {
45039               var inspected = inspect();
45040               if (inspected.state === "pending" ||
45041                   inspected.state === "rejected") {
45042                   return promise;
45043               }
45044               return inspected.value;
45045           };
45046       }
45047
45048       return promise;
45049   }
45050
45051   Promise.prototype.toString = function () {
45052       return "[object Promise]";
45053   };
45054
45055   Promise.prototype.then = function (fulfilled, rejected, progressed) {
45056       var self = this;
45057       var deferred = defer();
45058       var done = false;   // ensure the untrusted promise makes at most a
45059                           // single call to one of the callbacks
45060
45061       function _fulfilled(value) {
45062           try {
45063               return typeof fulfilled === "function" ? fulfilled(value) : value;
45064           } catch (exception) {
45065               return reject(exception);
45066           }
45067       }
45068
45069       function _rejected(exception) {
45070           if (typeof rejected === "function") {
45071               makeStackTraceLong(exception, self);
45072               try {
45073                   return rejected(exception);
45074               } catch (newException) {
45075                   return reject(newException);
45076               }
45077           }
45078           return reject(exception);
45079       }
45080
45081       function _progressed(value) {
45082           return typeof progressed === "function" ? progressed(value) : value;
45083       }
45084
45085       Q.nextTick(function () {
45086           self.promiseDispatch(function (value) {
45087               if (done) {
45088                   return;
45089               }
45090               done = true;
45091
45092               deferred.resolve(_fulfilled(value));
45093           }, "when", [function (exception) {
45094               if (done) {
45095                   return;
45096               }
45097               done = true;
45098
45099               deferred.resolve(_rejected(exception));
45100           }]);
45101       });
45102
45103       // Progress propagator need to be attached in the current tick.
45104       self.promiseDispatch(void 0, "when", [void 0, function (value) {
45105           var newValue;
45106           var threw = false;
45107           try {
45108               newValue = _progressed(value);
45109           } catch (e) {
45110               threw = true;
45111               if (Q.onerror) {
45112                   Q.onerror(e);
45113               } else {
45114                   throw e;
45115               }
45116           }
45117
45118           if (!threw) {
45119               deferred.notify(newValue);
45120           }
45121       }]);
45122
45123       return deferred.promise;
45124   };
45125
45126   Q.tap = function (promise, callback) {
45127       return Q(promise).tap(callback);
45128   };
45129
45130   /**
45131    * Works almost like "finally", but not called for rejections.
45132    * Original resolution value is passed through callback unaffected.
45133    * Callback may return a promise that will be awaited for.
45134    * @param {Function} callback
45135    * @returns {Q.Promise}
45136    * @example
45137    * doSomething()
45138    *   .then(...)
45139    *   .tap(console.log)
45140    *   .then(...);
45141    */
45142   Promise.prototype.tap = function (callback) {
45143       callback = Q(callback);
45144
45145       return this.then(function (value) {
45146           return callback.fcall(value).thenResolve(value);
45147       });
45148   };
45149
45150   /**
45151    * Registers an observer on a promise.
45152    *
45153    * Guarantees:
45154    *
45155    * 1. that fulfilled and rejected will be called only once.
45156    * 2. that either the fulfilled callback or the rejected callback will be
45157    *    called, but not both.
45158    * 3. that fulfilled and rejected will not be called in this turn.
45159    *
45160    * @param value      promise or immediate reference to observe
45161    * @param fulfilled  function to be called with the fulfilled value
45162    * @param rejected   function to be called with the rejection exception
45163    * @param progressed function to be called on any progress notifications
45164    * @return promise for the return value from the invoked callback
45165    */
45166   Q.when = when;
45167   function when(value, fulfilled, rejected, progressed) {
45168       return Q(value).then(fulfilled, rejected, progressed);
45169   }
45170
45171   Promise.prototype.thenResolve = function (value) {
45172       return this.then(function () { return value; });
45173   };
45174
45175   Q.thenResolve = function (promise, value) {
45176       return Q(promise).thenResolve(value);
45177   };
45178
45179   Promise.prototype.thenReject = function (reason) {
45180       return this.then(function () { throw reason; });
45181   };
45182
45183   Q.thenReject = function (promise, reason) {
45184       return Q(promise).thenReject(reason);
45185   };
45186
45187   /**
45188    * If an object is not a promise, it is as "near" as possible.
45189    * If a promise is rejected, it is as "near" as possible too.
45190    * If it’s a fulfilled promise, the fulfillment value is nearer.
45191    * If it’s a deferred promise and the deferred has been resolved, the
45192    * resolution is "nearer".
45193    * @param object
45194    * @returns most resolved (nearest) form of the object
45195    */
45196
45197   // XXX should we re-do this?
45198   Q.nearer = nearer;
45199   function nearer(value) {
45200       if (isPromise(value)) {
45201           var inspected = value.inspect();
45202           if (inspected.state === "fulfilled") {
45203               return inspected.value;
45204           }
45205       }
45206       return value;
45207   }
45208
45209   /**
45210    * @returns whether the given object is a promise.
45211    * Otherwise it is a fulfilled value.
45212    */
45213   Q.isPromise = isPromise;
45214   function isPromise(object) {
45215       return object instanceof Promise;
45216   }
45217
45218   Q.isPromiseAlike = isPromiseAlike;
45219   function isPromiseAlike(object) {
45220       return isObject(object) && typeof object.then === "function";
45221   }
45222
45223   /**
45224    * @returns whether the given object is a pending promise, meaning not
45225    * fulfilled or rejected.
45226    */
45227   Q.isPending = isPending;
45228   function isPending(object) {
45229       return isPromise(object) && object.inspect().state === "pending";
45230   }
45231
45232   Promise.prototype.isPending = function () {
45233       return this.inspect().state === "pending";
45234   };
45235
45236   /**
45237    * @returns whether the given object is a value or fulfilled
45238    * promise.
45239    */
45240   Q.isFulfilled = isFulfilled;
45241   function isFulfilled(object) {
45242       return !isPromise(object) || object.inspect().state === "fulfilled";
45243   }
45244
45245   Promise.prototype.isFulfilled = function () {
45246       return this.inspect().state === "fulfilled";
45247   };
45248
45249   /**
45250    * @returns whether the given object is a rejected promise.
45251    */
45252   Q.isRejected = isRejected;
45253   function isRejected(object) {
45254       return isPromise(object) && object.inspect().state === "rejected";
45255   }
45256
45257   Promise.prototype.isRejected = function () {
45258       return this.inspect().state === "rejected";
45259   };
45260
45261   //// BEGIN UNHANDLED REJECTION TRACKING
45262
45263   // This promise library consumes exceptions thrown in handlers so they can be
45264   // handled by a subsequent promise.  The exceptions get added to this array when
45265   // they are created, and removed when they are handled.  Note that in ES6 or
45266   // shimmed environments, this would naturally be a `Set`.
45267   var unhandledReasons = [];
45268   var unhandledRejections = [];
45269   var reportedUnhandledRejections = [];
45270   var trackUnhandledRejections = true;
45271
45272   function resetUnhandledRejections() {
45273       unhandledReasons.length = 0;
45274       unhandledRejections.length = 0;
45275
45276       if (!trackUnhandledRejections) {
45277           trackUnhandledRejections = true;
45278       }
45279   }
45280
45281   function trackRejection(promise, reason) {
45282       if (!trackUnhandledRejections) {
45283           return;
45284       }
45285       if (typeof process === "object" && typeof process.emit === "function") {
45286           Q.nextTick.runAfter(function () {
45287               if (array_indexOf(unhandledRejections, promise) !== -1) {
45288                   process.emit("unhandledRejection", reason, promise);
45289                   reportedUnhandledRejections.push(promise);
45290               }
45291           });
45292       }
45293
45294       unhandledRejections.push(promise);
45295       if (reason && typeof reason.stack !== "undefined") {
45296           unhandledReasons.push(reason.stack);
45297       } else {
45298           unhandledReasons.push("(no stack) " + reason);
45299       }
45300   }
45301
45302   function untrackRejection(promise) {
45303       if (!trackUnhandledRejections) {
45304           return;
45305       }
45306
45307       var at = array_indexOf(unhandledRejections, promise);
45308       if (at !== -1) {
45309           if (typeof process === "object" && typeof process.emit === "function") {
45310               Q.nextTick.runAfter(function () {
45311                   var atReport = array_indexOf(reportedUnhandledRejections, promise);
45312                   if (atReport !== -1) {
45313                       process.emit("rejectionHandled", unhandledReasons[at], promise);
45314                       reportedUnhandledRejections.splice(atReport, 1);
45315                   }
45316               });
45317           }
45318           unhandledRejections.splice(at, 1);
45319           unhandledReasons.splice(at, 1);
45320       }
45321   }
45322
45323   Q.resetUnhandledRejections = resetUnhandledRejections;
45324
45325   Q.getUnhandledReasons = function () {
45326       // Make a copy so that consumers can't interfere with our internal state.
45327       return unhandledReasons.slice();
45328   };
45329
45330   Q.stopUnhandledRejectionTracking = function () {
45331       resetUnhandledRejections();
45332       trackUnhandledRejections = false;
45333   };
45334
45335   resetUnhandledRejections();
45336
45337   //// END UNHANDLED REJECTION TRACKING
45338
45339   /**
45340    * Constructs a rejected promise.
45341    * @param reason value describing the failure
45342    */
45343   Q.reject = reject;
45344   function reject(reason) {
45345       var rejection = Promise({
45346           "when": function (rejected) {
45347               // note that the error has been handled
45348               if (rejected) {
45349                   untrackRejection(this);
45350               }
45351               return rejected ? rejected(reason) : this;
45352           }
45353       }, function fallback() {
45354           return this;
45355       }, function inspect() {
45356           return { state: "rejected", reason: reason };
45357       });
45358
45359       // Note that the reason has not been handled.
45360       trackRejection(rejection, reason);
45361
45362       return rejection;
45363   }
45364
45365   /**
45366    * Constructs a fulfilled promise for an immediate reference.
45367    * @param value immediate reference
45368    */
45369   Q.fulfill = fulfill;
45370   function fulfill(value) {
45371       return Promise({
45372           "when": function () {
45373               return value;
45374           },
45375           "get": function (name) {
45376               return value[name];
45377           },
45378           "set": function (name, rhs) {
45379               value[name] = rhs;
45380           },
45381           "delete": function (name) {
45382               delete value[name];
45383           },
45384           "post": function (name, args) {
45385               // Mark Miller proposes that post with no name should apply a
45386               // promised function.
45387               if (name === null || name === void 0) {
45388                   return value.apply(void 0, args);
45389               } else {
45390                   return value[name].apply(value, args);
45391               }
45392           },
45393           "apply": function (thisp, args) {
45394               return value.apply(thisp, args);
45395           },
45396           "keys": function () {
45397               return object_keys(value);
45398           }
45399       }, void 0, function inspect() {
45400           return { state: "fulfilled", value: value };
45401       });
45402   }
45403
45404   /**
45405    * Converts thenables to Q promises.
45406    * @param promise thenable promise
45407    * @returns a Q promise
45408    */
45409   function coerce(promise) {
45410       var deferred = defer();
45411       Q.nextTick(function () {
45412           try {
45413               promise.then(deferred.resolve, deferred.reject, deferred.notify);
45414           } catch (exception) {
45415               deferred.reject(exception);
45416           }
45417       });
45418       return deferred.promise;
45419   }
45420
45421   /**
45422    * Annotates an object such that it will never be
45423    * transferred away from this process over any promise
45424    * communication channel.
45425    * @param object
45426    * @returns promise a wrapping of that object that
45427    * additionally responds to the "isDef" message
45428    * without a rejection.
45429    */
45430   Q.master = master;
45431   function master(object) {
45432       return Promise({
45433           "isDef": function () {}
45434       }, function fallback(op, args) {
45435           return dispatch(object, op, args);
45436       }, function () {
45437           return Q(object).inspect();
45438       });
45439   }
45440
45441   /**
45442    * Spreads the values of a promised array of arguments into the
45443    * fulfillment callback.
45444    * @param fulfilled callback that receives variadic arguments from the
45445    * promised array
45446    * @param rejected callback that receives the exception if the promise
45447    * is rejected.
45448    * @returns a promise for the return value or thrown exception of
45449    * either callback.
45450    */
45451   Q.spread = spread;
45452   function spread(value, fulfilled, rejected) {
45453       return Q(value).spread(fulfilled, rejected);
45454   }
45455
45456   Promise.prototype.spread = function (fulfilled, rejected) {
45457       return this.all().then(function (array) {
45458           return fulfilled.apply(void 0, array);
45459       }, rejected);
45460   };
45461
45462   /**
45463    * The async function is a decorator for generator functions, turning
45464    * them into asynchronous generators.  Although generators are only part
45465    * of the newest ECMAScript 6 drafts, this code does not cause syntax
45466    * errors in older engines.  This code should continue to work and will
45467    * in fact improve over time as the language improves.
45468    *
45469    * ES6 generators are currently part of V8 version 3.19 with the
45470    * --harmony-generators runtime flag enabled.  SpiderMonkey has had them
45471    * for longer, but under an older Python-inspired form.  This function
45472    * works on both kinds of generators.
45473    *
45474    * Decorates a generator function such that:
45475    *  - it may yield promises
45476    *  - execution will continue when that promise is fulfilled
45477    *  - the value of the yield expression will be the fulfilled value
45478    *  - it returns a promise for the return value (when the generator
45479    *    stops iterating)
45480    *  - the decorated function returns a promise for the return value
45481    *    of the generator or the first rejected promise among those
45482    *    yielded.
45483    *  - if an error is thrown in the generator, it propagates through
45484    *    every following yield until it is caught, or until it escapes
45485    *    the generator function altogether, and is translated into a
45486    *    rejection for the promise returned by the decorated generator.
45487    */
45488   Q.async = async;
45489   function async(makeGenerator) {
45490       return function () {
45491           // when verb is "send", arg is a value
45492           // when verb is "throw", arg is an exception
45493           function continuer(verb, arg) {
45494               var result;
45495
45496               // Until V8 3.19 / Chromium 29 is released, SpiderMonkey is the only
45497               // engine that has a deployed base of browsers that support generators.
45498               // However, SM's generators use the Python-inspired semantics of
45499               // outdated ES6 drafts.  We would like to support ES6, but we'd also
45500               // like to make it possible to use generators in deployed browsers, so
45501               // we also support Python-style generators.  At some point we can remove
45502               // this block.
45503
45504               if (typeof StopIteration === "undefined") {
45505                   // ES6 Generators
45506                   try {
45507                       result = generator[verb](arg);
45508                   } catch (exception) {
45509                       return reject(exception);
45510                   }
45511                   if (result.done) {
45512                       return Q(result.value);
45513                   } else {
45514                       return when(result.value, callback, errback);
45515                   }
45516               } else {
45517                   // SpiderMonkey Generators
45518                   // FIXME: Remove this case when SM does ES6 generators.
45519                   try {
45520                       result = generator[verb](arg);
45521                   } catch (exception) {
45522                       if (isStopIteration(exception)) {
45523                           return Q(exception.value);
45524                       } else {
45525                           return reject(exception);
45526                       }
45527                   }
45528                   return when(result, callback, errback);
45529               }
45530           }
45531           var generator = makeGenerator.apply(this, arguments);
45532           var callback = continuer.bind(continuer, "next");
45533           var errback = continuer.bind(continuer, "throw");
45534           return callback();
45535       };
45536   }
45537
45538   /**
45539    * The spawn function is a small wrapper around async that immediately
45540    * calls the generator and also ends the promise chain, so that any
45541    * unhandled errors are thrown instead of forwarded to the error
45542    * handler. This is useful because it's extremely common to run
45543    * generators at the top-level to work with libraries.
45544    */
45545   Q.spawn = spawn;
45546   function spawn(makeGenerator) {
45547       Q.done(Q.async(makeGenerator)());
45548   }
45549
45550   // FIXME: Remove this interface once ES6 generators are in SpiderMonkey.
45551   /**
45552    * Throws a ReturnValue exception to stop an asynchronous generator.
45553    *
45554    * This interface is a stop-gap measure to support generator return
45555    * values in older Firefox/SpiderMonkey.  In browsers that support ES6
45556    * generators like Chromium 29, just use "return" in your generator
45557    * functions.
45558    *
45559    * @param value the return value for the surrounding generator
45560    * @throws ReturnValue exception with the value.
45561    * @example
45562    * // ES6 style
45563    * Q.async(function* () {
45564    *      var foo = yield getFooPromise();
45565    *      var bar = yield getBarPromise();
45566    *      return foo + bar;
45567    * })
45568    * // Older SpiderMonkey style
45569    * Q.async(function () {
45570    *      var foo = yield getFooPromise();
45571    *      var bar = yield getBarPromise();
45572    *      Q.return(foo + bar);
45573    * })
45574    */
45575   Q["return"] = _return;
45576   function _return(value) {
45577       throw new QReturnValue(value);
45578   }
45579
45580   /**
45581    * The promised function decorator ensures that any promise arguments
45582    * are settled and passed as values (`this` is also settled and passed
45583    * as a value).  It will also ensure that the result of a function is
45584    * always a promise.
45585    *
45586    * @example
45587    * var add = Q.promised(function (a, b) {
45588    *     return a + b;
45589    * });
45590    * add(Q(a), Q(B));
45591    *
45592    * @param {function} callback The function to decorate
45593    * @returns {function} a function that has been decorated.
45594    */
45595   Q.promised = promised;
45596   function promised(callback) {
45597       return function () {
45598           return spread([this, all(arguments)], function (self, args) {
45599               return callback.apply(self, args);
45600           });
45601       };
45602   }
45603
45604   /**
45605    * sends a message to a value in a future turn
45606    * @param object* the recipient
45607    * @param op the name of the message operation, e.g., "when",
45608    * @param args further arguments to be forwarded to the operation
45609    * @returns result {Promise} a promise for the result of the operation
45610    */
45611   Q.dispatch = dispatch;
45612   function dispatch(object, op, args) {
45613       return Q(object).dispatch(op, args);
45614   }
45615
45616   Promise.prototype.dispatch = function (op, args) {
45617       var self = this;
45618       var deferred = defer();
45619       Q.nextTick(function () {
45620           self.promiseDispatch(deferred.resolve, op, args);
45621       });
45622       return deferred.promise;
45623   };
45624
45625   /**
45626    * Gets the value of a property in a future turn.
45627    * @param object    promise or immediate reference for target object
45628    * @param name      name of property to get
45629    * @return promise for the property value
45630    */
45631   Q.get = function (object, key) {
45632       return Q(object).dispatch("get", [key]);
45633   };
45634
45635   Promise.prototype.get = function (key) {
45636       return this.dispatch("get", [key]);
45637   };
45638
45639   /**
45640    * Sets the value of a property in a future turn.
45641    * @param object    promise or immediate reference for object object
45642    * @param name      name of property to set
45643    * @param value     new value of property
45644    * @return promise for the return value
45645    */
45646   Q.set = function (object, key, value) {
45647       return Q(object).dispatch("set", [key, value]);
45648   };
45649
45650   Promise.prototype.set = function (key, value) {
45651       return this.dispatch("set", [key, value]);
45652   };
45653
45654   /**
45655    * Deletes a property in a future turn.
45656    * @param object    promise or immediate reference for target object
45657    * @param name      name of property to delete
45658    * @return promise for the return value
45659    */
45660   Q.del = // XXX legacy
45661   Q["delete"] = function (object, key) {
45662       return Q(object).dispatch("delete", [key]);
45663   };
45664
45665   Promise.prototype.del = // XXX legacy
45666   Promise.prototype["delete"] = function (key) {
45667       return this.dispatch("delete", [key]);
45668   };
45669
45670   /**
45671    * Invokes a method in a future turn.
45672    * @param object    promise or immediate reference for target object
45673    * @param name      name of method to invoke
45674    * @param value     a value to post, typically an array of
45675    *                  invocation arguments for promises that
45676    *                  are ultimately backed with `resolve` values,
45677    *                  as opposed to those backed with URLs
45678    *                  wherein the posted value can be any
45679    *                  JSON serializable object.
45680    * @return promise for the return value
45681    */
45682   // bound locally because it is used by other methods
45683   Q.mapply = // XXX As proposed by "Redsandro"
45684   Q.post = function (object, name, args) {
45685       return Q(object).dispatch("post", [name, args]);
45686   };
45687
45688   Promise.prototype.mapply = // XXX As proposed by "Redsandro"
45689   Promise.prototype.post = function (name, args) {
45690       return this.dispatch("post", [name, args]);
45691   };
45692
45693   /**
45694    * Invokes a method in a future turn.
45695    * @param object    promise or immediate reference for target object
45696    * @param name      name of method to invoke
45697    * @param ...args   array of invocation arguments
45698    * @return promise for the return value
45699    */
45700   Q.send = // XXX Mark Miller's proposed parlance
45701   Q.mcall = // XXX As proposed by "Redsandro"
45702   Q.invoke = function (object, name /*...args*/) {
45703       return Q(object).dispatch("post", [name, array_slice(arguments, 2)]);
45704   };
45705
45706   Promise.prototype.send = // XXX Mark Miller's proposed parlance
45707   Promise.prototype.mcall = // XXX As proposed by "Redsandro"
45708   Promise.prototype.invoke = function (name /*...args*/) {
45709       return this.dispatch("post", [name, array_slice(arguments, 1)]);
45710   };
45711
45712   /**
45713    * Applies the promised function in a future turn.
45714    * @param object    promise or immediate reference for target function
45715    * @param args      array of application arguments
45716    */
45717   Q.fapply = function (object, args) {
45718       return Q(object).dispatch("apply", [void 0, args]);
45719   };
45720
45721   Promise.prototype.fapply = function (args) {
45722       return this.dispatch("apply", [void 0, args]);
45723   };
45724
45725   /**
45726    * Calls the promised function in a future turn.
45727    * @param object    promise or immediate reference for target function
45728    * @param ...args   array of application arguments
45729    */
45730   Q["try"] =
45731   Q.fcall = function (object /* ...args*/) {
45732       return Q(object).dispatch("apply", [void 0, array_slice(arguments, 1)]);
45733   };
45734
45735   Promise.prototype.fcall = function (/*...args*/) {
45736       return this.dispatch("apply", [void 0, array_slice(arguments)]);
45737   };
45738
45739   /**
45740    * Binds the promised function, transforming return values into a fulfilled
45741    * promise and thrown errors into a rejected one.
45742    * @param object    promise or immediate reference for target function
45743    * @param ...args   array of application arguments
45744    */
45745   Q.fbind = function (object /*...args*/) {
45746       var promise = Q(object);
45747       var args = array_slice(arguments, 1);
45748       return function fbound() {
45749           return promise.dispatch("apply", [
45750               this,
45751               args.concat(array_slice(arguments))
45752           ]);
45753       };
45754   };
45755   Promise.prototype.fbind = function (/*...args*/) {
45756       var promise = this;
45757       var args = array_slice(arguments);
45758       return function fbound() {
45759           return promise.dispatch("apply", [
45760               this,
45761               args.concat(array_slice(arguments))
45762           ]);
45763       };
45764   };
45765
45766   /**
45767    * Requests the names of the owned properties of a promised
45768    * object in a future turn.
45769    * @param object    promise or immediate reference for target object
45770    * @return promise for the keys of the eventually settled object
45771    */
45772   Q.keys = function (object) {
45773       return Q(object).dispatch("keys", []);
45774   };
45775
45776   Promise.prototype.keys = function () {
45777       return this.dispatch("keys", []);
45778   };
45779
45780   /**
45781    * Turns an array of promises into a promise for an array.  If any of
45782    * the promises gets rejected, the whole array is rejected immediately.
45783    * @param {Array*} an array (or promise for an array) of values (or
45784    * promises for values)
45785    * @returns a promise for an array of the corresponding values
45786    */
45787   // By Mark Miller
45788   // http://wiki.ecmascript.org/doku.php?id=strawman:concurrency&rev=1308776521#allfulfilled
45789   Q.all = all;
45790   function all(promises) {
45791       return when(promises, function (promises) {
45792           var pendingCount = 0;
45793           var deferred = defer();
45794           array_reduce(promises, function (undefined, promise, index) {
45795               var snapshot;
45796               if (
45797                   isPromise(promise) &&
45798                   (snapshot = promise.inspect()).state === "fulfilled"
45799               ) {
45800                   promises[index] = snapshot.value;
45801               } else {
45802                   ++pendingCount;
45803                   when(
45804                       promise,
45805                       function (value) {
45806                           promises[index] = value;
45807                           if (--pendingCount === 0) {
45808                               deferred.resolve(promises);
45809                           }
45810                       },
45811                       deferred.reject,
45812                       function (progress) {
45813                           deferred.notify({ index: index, value: progress });
45814                       }
45815                   );
45816               }
45817           }, void 0);
45818           if (pendingCount === 0) {
45819               deferred.resolve(promises);
45820           }
45821           return deferred.promise;
45822       });
45823   }
45824
45825   Promise.prototype.all = function () {
45826       return all(this);
45827   };
45828
45829   /**
45830    * Returns the first resolved promise of an array. Prior rejected promises are
45831    * ignored.  Rejects only if all promises are rejected.
45832    * @param {Array*} an array containing values or promises for values
45833    * @returns a promise fulfilled with the value of the first resolved promise,
45834    * or a rejected promise if all promises are rejected.
45835    */
45836   Q.any = any;
45837
45838   function any(promises) {
45839       if (promises.length === 0) {
45840           return Q.resolve();
45841       }
45842
45843       var deferred = Q.defer();
45844       var pendingCount = 0;
45845       array_reduce(promises, function (prev, current, index) {
45846           var promise = promises[index];
45847
45848           pendingCount++;
45849
45850           when(promise, onFulfilled, onRejected, onProgress);
45851           function onFulfilled(result) {
45852               deferred.resolve(result);
45853           }
45854           function onRejected(err) {
45855               pendingCount--;
45856               if (pendingCount === 0) {
45857                   var rejection = err || new Error("" + err);
45858
45859                   rejection.message = ("Q can't get fulfillment value from any promise, all " +
45860                       "promises were rejected. Last error message: " + rejection.message);
45861
45862                   deferred.reject(rejection);
45863               }
45864           }
45865           function onProgress(progress) {
45866               deferred.notify({
45867                   index: index,
45868                   value: progress
45869               });
45870           }
45871       }, undefined);
45872
45873       return deferred.promise;
45874   }
45875
45876   Promise.prototype.any = function () {
45877       return any(this);
45878   };
45879
45880   /**
45881    * Waits for all promises to be settled, either fulfilled or
45882    * rejected.  This is distinct from `all` since that would stop
45883    * waiting at the first rejection.  The promise returned by
45884    * `allResolved` will never be rejected.
45885    * @param promises a promise for an array (or an array) of promises
45886    * (or values)
45887    * @return a promise for an array of promises
45888    */
45889   Q.allResolved = deprecate(allResolved, "allResolved", "allSettled");
45890   function allResolved(promises) {
45891       return when(promises, function (promises) {
45892           promises = array_map(promises, Q);
45893           return when(all(array_map(promises, function (promise) {
45894               return when(promise, noop, noop);
45895           })), function () {
45896               return promises;
45897           });
45898       });
45899   }
45900
45901   Promise.prototype.allResolved = function () {
45902       return allResolved(this);
45903   };
45904
45905   /**
45906    * @see Promise#allSettled
45907    */
45908   Q.allSettled = allSettled;
45909   function allSettled(promises) {
45910       return Q(promises).allSettled();
45911   }
45912
45913   /**
45914    * Turns an array of promises into a promise for an array of their states (as
45915    * returned by `inspect`) when they have all settled.
45916    * @param {Array[Any*]} values an array (or promise for an array) of values (or
45917    * promises for values)
45918    * @returns {Array[State]} an array of states for the respective values.
45919    */
45920   Promise.prototype.allSettled = function () {
45921       return this.then(function (promises) {
45922           return all(array_map(promises, function (promise) {
45923               promise = Q(promise);
45924               function regardless() {
45925                   return promise.inspect();
45926               }
45927               return promise.then(regardless, regardless);
45928           }));
45929       });
45930   };
45931
45932   /**
45933    * Captures the failure of a promise, giving an oportunity to recover
45934    * with a callback.  If the given promise is fulfilled, the returned
45935    * promise is fulfilled.
45936    * @param {Any*} promise for something
45937    * @param {Function} callback to fulfill the returned promise if the
45938    * given promise is rejected
45939    * @returns a promise for the return value of the callback
45940    */
45941   Q.fail = // XXX legacy
45942   Q["catch"] = function (object, rejected) {
45943       return Q(object).then(void 0, rejected);
45944   };
45945
45946   Promise.prototype.fail = // XXX legacy
45947   Promise.prototype["catch"] = function (rejected) {
45948       return this.then(void 0, rejected);
45949   };
45950
45951   /**
45952    * Attaches a listener that can respond to progress notifications from a
45953    * promise's originating deferred. This listener receives the exact arguments
45954    * passed to ``deferred.notify``.
45955    * @param {Any*} promise for something
45956    * @param {Function} callback to receive any progress notifications
45957    * @returns the given promise, unchanged
45958    */
45959   Q.progress = progress;
45960   function progress(object, progressed) {
45961       return Q(object).then(void 0, void 0, progressed);
45962   }
45963
45964   Promise.prototype.progress = function (progressed) {
45965       return this.then(void 0, void 0, progressed);
45966   };
45967
45968   /**
45969    * Provides an opportunity to observe the settling of a promise,
45970    * regardless of whether the promise is fulfilled or rejected.  Forwards
45971    * the resolution to the returned promise when the callback is done.
45972    * The callback can return a promise to defer completion.
45973    * @param {Any*} promise
45974    * @param {Function} callback to observe the resolution of the given
45975    * promise, takes no arguments.
45976    * @returns a promise for the resolution of the given promise when
45977    * ``fin`` is done.
45978    */
45979   Q.fin = // XXX legacy
45980   Q["finally"] = function (object, callback) {
45981       return Q(object)["finally"](callback);
45982   };
45983
45984   Promise.prototype.fin = // XXX legacy
45985   Promise.prototype["finally"] = function (callback) {
45986       if (!callback || typeof callback.apply !== "function") {
45987           throw new Error("Q can't apply finally callback");
45988       }
45989       callback = Q(callback);
45990       return this.then(function (value) {
45991           return callback.fcall().then(function () {
45992               return value;
45993           });
45994       }, function (reason) {
45995           // TODO attempt to recycle the rejection with "this".
45996           return callback.fcall().then(function () {
45997               throw reason;
45998           });
45999       });
46000   };
46001
46002   /**
46003    * Terminates a chain of promises, forcing rejections to be
46004    * thrown as exceptions.
46005    * @param {Any*} promise at the end of a chain of promises
46006    * @returns nothing
46007    */
46008   Q.done = function (object, fulfilled, rejected, progress) {
46009       return Q(object).done(fulfilled, rejected, progress);
46010   };
46011
46012   Promise.prototype.done = function (fulfilled, rejected, progress) {
46013       var onUnhandledError = function (error) {
46014           // forward to a future turn so that ``when``
46015           // does not catch it and turn it into a rejection.
46016           Q.nextTick(function () {
46017               makeStackTraceLong(error, promise);
46018               if (Q.onerror) {
46019                   Q.onerror(error);
46020               } else {
46021                   throw error;
46022               }
46023           });
46024       };
46025
46026       // Avoid unnecessary `nextTick`ing via an unnecessary `when`.
46027       var promise = fulfilled || rejected || progress ?
46028           this.then(fulfilled, rejected, progress) :
46029           this;
46030
46031       if (typeof process === "object" && process && process.domain) {
46032           onUnhandledError = process.domain.bind(onUnhandledError);
46033       }
46034
46035       promise.then(void 0, onUnhandledError);
46036   };
46037
46038   /**
46039    * Causes a promise to be rejected if it does not get fulfilled before
46040    * some milliseconds time out.
46041    * @param {Any*} promise
46042    * @param {Number} milliseconds timeout
46043    * @param {Any*} custom error message or Error object (optional)
46044    * @returns a promise for the resolution of the given promise if it is
46045    * fulfilled before the timeout, otherwise rejected.
46046    */
46047   Q.timeout = function (object, ms, error) {
46048       return Q(object).timeout(ms, error);
46049   };
46050
46051   Promise.prototype.timeout = function (ms, error) {
46052       var deferred = defer();
46053       var timeoutId = setTimeout(function () {
46054           if (!error || "string" === typeof error) {
46055               error = new Error(error || "Timed out after " + ms + " ms");
46056               error.code = "ETIMEDOUT";
46057           }
46058           deferred.reject(error);
46059       }, ms);
46060
46061       this.then(function (value) {
46062           clearTimeout(timeoutId);
46063           deferred.resolve(value);
46064       }, function (exception) {
46065           clearTimeout(timeoutId);
46066           deferred.reject(exception);
46067       }, deferred.notify);
46068
46069       return deferred.promise;
46070   };
46071
46072   /**
46073    * Returns a promise for the given value (or promised value), some
46074    * milliseconds after it resolved. Passes rejections immediately.
46075    * @param {Any*} promise
46076    * @param {Number} milliseconds
46077    * @returns a promise for the resolution of the given promise after milliseconds
46078    * time has elapsed since the resolution of the given promise.
46079    * If the given promise rejects, that is passed immediately.
46080    */
46081   Q.delay = function (object, timeout) {
46082       if (timeout === void 0) {
46083           timeout = object;
46084           object = void 0;
46085       }
46086       return Q(object).delay(timeout);
46087   };
46088
46089   Promise.prototype.delay = function (timeout) {
46090       return this.then(function (value) {
46091           var deferred = defer();
46092           setTimeout(function () {
46093               deferred.resolve(value);
46094           }, timeout);
46095           return deferred.promise;
46096       });
46097   };
46098
46099   /**
46100    * Passes a continuation to a Node function, which is called with the given
46101    * arguments provided as an array, and returns a promise.
46102    *
46103    *      Q.nfapply(FS.readFile, [__filename])
46104    *      .then(function (content) {
46105    *      })
46106    *
46107    */
46108   Q.nfapply = function (callback, args) {
46109       return Q(callback).nfapply(args);
46110   };
46111
46112   Promise.prototype.nfapply = function (args) {
46113       var deferred = defer();
46114       var nodeArgs = array_slice(args);
46115       nodeArgs.push(deferred.makeNodeResolver());
46116       this.fapply(nodeArgs).fail(deferred.reject);
46117       return deferred.promise;
46118   };
46119
46120   /**
46121    * Passes a continuation to a Node function, which is called with the given
46122    * arguments provided individually, and returns a promise.
46123    * @example
46124    * Q.nfcall(FS.readFile, __filename)
46125    * .then(function (content) {
46126    * })
46127    *
46128    */
46129   Q.nfcall = function (callback /*...args*/) {
46130       var args = array_slice(arguments, 1);
46131       return Q(callback).nfapply(args);
46132   };
46133
46134   Promise.prototype.nfcall = function (/*...args*/) {
46135       var nodeArgs = array_slice(arguments);
46136       var deferred = defer();
46137       nodeArgs.push(deferred.makeNodeResolver());
46138       this.fapply(nodeArgs).fail(deferred.reject);
46139       return deferred.promise;
46140   };
46141
46142   /**
46143    * Wraps a NodeJS continuation passing function and returns an equivalent
46144    * version that returns a promise.
46145    * @example
46146    * Q.nfbind(FS.readFile, __filename)("utf-8")
46147    * .then(console.log)
46148    * .done()
46149    */
46150   Q.nfbind =
46151   Q.denodeify = function (callback /*...args*/) {
46152       if (callback === undefined) {
46153           throw new Error("Q can't wrap an undefined function");
46154       }
46155       var baseArgs = array_slice(arguments, 1);
46156       return function () {
46157           var nodeArgs = baseArgs.concat(array_slice(arguments));
46158           var deferred = defer();
46159           nodeArgs.push(deferred.makeNodeResolver());
46160           Q(callback).fapply(nodeArgs).fail(deferred.reject);
46161           return deferred.promise;
46162       };
46163   };
46164
46165   Promise.prototype.nfbind =
46166   Promise.prototype.denodeify = function (/*...args*/) {
46167       var args = array_slice(arguments);
46168       args.unshift(this);
46169       return Q.denodeify.apply(void 0, args);
46170   };
46171
46172   Q.nbind = function (callback, thisp /*...args*/) {
46173       var baseArgs = array_slice(arguments, 2);
46174       return function () {
46175           var nodeArgs = baseArgs.concat(array_slice(arguments));
46176           var deferred = defer();
46177           nodeArgs.push(deferred.makeNodeResolver());
46178           function bound() {
46179               return callback.apply(thisp, arguments);
46180           }
46181           Q(bound).fapply(nodeArgs).fail(deferred.reject);
46182           return deferred.promise;
46183       };
46184   };
46185
46186   Promise.prototype.nbind = function (/*thisp, ...args*/) {
46187       var args = array_slice(arguments, 0);
46188       args.unshift(this);
46189       return Q.nbind.apply(void 0, args);
46190   };
46191
46192   /**
46193    * Calls a method of a Node-style object that accepts a Node-style
46194    * callback with a given array of arguments, plus a provided callback.
46195    * @param object an object that has the named method
46196    * @param {String} name name of the method of object
46197    * @param {Array} args arguments to pass to the method; the callback
46198    * will be provided by Q and appended to these arguments.
46199    * @returns a promise for the value or error
46200    */
46201   Q.nmapply = // XXX As proposed by "Redsandro"
46202   Q.npost = function (object, name, args) {
46203       return Q(object).npost(name, args);
46204   };
46205
46206   Promise.prototype.nmapply = // XXX As proposed by "Redsandro"
46207   Promise.prototype.npost = function (name, args) {
46208       var nodeArgs = array_slice(args || []);
46209       var deferred = defer();
46210       nodeArgs.push(deferred.makeNodeResolver());
46211       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46212       return deferred.promise;
46213   };
46214
46215   /**
46216    * Calls a method of a Node-style object that accepts a Node-style
46217    * callback, forwarding the given variadic arguments, plus a provided
46218    * callback argument.
46219    * @param object an object that has the named method
46220    * @param {String} name name of the method of object
46221    * @param ...args arguments to pass to the method; the callback will
46222    * be provided by Q and appended to these arguments.
46223    * @returns a promise for the value or error
46224    */
46225   Q.nsend = // XXX Based on Mark Miller's proposed "send"
46226   Q.nmcall = // XXX Based on "Redsandro's" proposal
46227   Q.ninvoke = function (object, name /*...args*/) {
46228       var nodeArgs = array_slice(arguments, 2);
46229       var deferred = defer();
46230       nodeArgs.push(deferred.makeNodeResolver());
46231       Q(object).dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46232       return deferred.promise;
46233   };
46234
46235   Promise.prototype.nsend = // XXX Based on Mark Miller's proposed "send"
46236   Promise.prototype.nmcall = // XXX Based on "Redsandro's" proposal
46237   Promise.prototype.ninvoke = function (name /*...args*/) {
46238       var nodeArgs = array_slice(arguments, 1);
46239       var deferred = defer();
46240       nodeArgs.push(deferred.makeNodeResolver());
46241       this.dispatch("post", [name, nodeArgs]).fail(deferred.reject);
46242       return deferred.promise;
46243   };
46244
46245   /**
46246    * If a function would like to support both Node continuation-passing-style and
46247    * promise-returning-style, it can end its internal promise chain with
46248    * `nodeify(nodeback)`, forwarding the optional nodeback argument.  If the user
46249    * elects to use a nodeback, the result will be sent there.  If they do not
46250    * pass a nodeback, they will receive the result promise.
46251    * @param object a result (or a promise for a result)
46252    * @param {Function} nodeback a Node.js-style callback
46253    * @returns either the promise or nothing
46254    */
46255   Q.nodeify = nodeify;
46256   function nodeify(object, nodeback) {
46257       return Q(object).nodeify(nodeback);
46258   }
46259
46260   Promise.prototype.nodeify = function (nodeback) {
46261       if (nodeback) {
46262           this.then(function (value) {
46263               Q.nextTick(function () {
46264                   nodeback(null, value);
46265               });
46266           }, function (error) {
46267               Q.nextTick(function () {
46268                   nodeback(error);
46269               });
46270           });
46271       } else {
46272           return this;
46273       }
46274   };
46275
46276   Q.noConflict = function() {
46277       throw new Error("Q.noConflict only works when Q is used as a global");
46278   };
46279
46280   // All code before this point will be filtered from stack traces.
46281   var qEndingLine = captureLine();
46282
46283   return Q;
46284
46285   });
46286   });
46287
46288   var bubbleApi = 'https://dev.virtualearth.net/mapcontrol/HumanScaleServices/GetBubbles.ashx?';
46289   var streetsideImagesApi = 'https://t.ssl.ak.tiles.virtualearth.net/tiles/';
46290   var bubbleAppKey = 'AuftgJsO0Xs8Ts4M1xZUQJQXJNsvmh3IV8DkNieCiy3tCwCUMq76-WpkrBtNAuEm';
46291   var pannellumViewerCSS = 'pannellum-streetside/pannellum.css';
46292   var pannellumViewerJS = 'pannellum-streetside/pannellum.js';
46293   var maxResults$2 = 2000;
46294   var tileZoom$2 = 16.5;
46295   var tiler$3 = utilTiler().zoomExtent([tileZoom$2, tileZoom$2]).skipNullIsland(true);
46296   var dispatch$4 = dispatch('loadedBubbles', 'viewerChanged');
46297   var minHfov = 10;         // zoom in degrees:  20, 10, 5
46298   var maxHfov = 90;         // zoom out degrees
46299   var defaultHfov = 45;
46300
46301   var _hires = false;
46302   var _resolution = 512;    // higher numbers are slower - 512, 1024, 2048, 4096
46303   var _currScene = 0;
46304   var _ssCache;
46305   var _pannellumViewer;
46306   var _sceneOptions;
46307   var _dataUrlArray = [];
46308
46309
46310   /**
46311    * abortRequest().
46312    */
46313   function abortRequest$3(i) {
46314       i.abort();
46315   }
46316
46317
46318   /**
46319    * localeTimeStamp().
46320    */
46321   function localeTimestamp(s) {
46322       if (!s) return null;
46323       var detected = utilDetect();
46324       var options = { day: 'numeric', month: 'short', year: 'numeric' };
46325       var d = new Date(s);
46326       if (isNaN(d.getTime())) return null;
46327       return d.toLocaleString(detected.locale, options);
46328   }
46329
46330
46331   /**
46332    * loadTiles() wraps the process of generating tiles and then fetching image points for each tile.
46333    */
46334   function loadTiles$2(which, url, projection, margin) {
46335       var tiles = tiler$3.margin(margin).getTiles(projection);
46336
46337       // abort inflight requests that are no longer needed
46338       var cache = _ssCache[which];
46339       forEach(cache.inflight, function(v, k) {
46340           var wanted = find$1(tiles, function(tile) { return k.indexOf(tile.id + ',') === 0; });
46341
46342           if (!wanted) {
46343               abortRequest$3(v);
46344               delete cache.inflight[k];
46345           }
46346       });
46347
46348       tiles.forEach(function (tile) {
46349          loadNextTilePage$2(which, url, tile);
46350       });
46351   }
46352
46353   /**
46354    * loadNextTilePage() load data for the next tile page in line.
46355    */
46356   function loadNextTilePage$2(which, url, tile) {
46357       var cache = _ssCache[which];
46358       var nextPage = cache.nextPage[tile.id] || 0;
46359       var id = tile.id + ',' + String(nextPage);
46360       if (cache.loaded[id] || cache.inflight[id]) return;
46361
46362       cache.inflight[id] = getBubbles(url, tile, function(bubbles) {
46363           cache.loaded[id] = true;
46364           delete cache.inflight[id];
46365           if (!bubbles) return;
46366
46367           // [].shift() removes the first element, some statistics info, not a bubble point
46368           bubbles.shift();
46369
46370           var features = bubbles.map(function(bubble) {
46371               if (cache.points[bubble.id]) return null;  // skip duplicates
46372
46373               var loc = [bubble.lo, bubble.la];
46374               var d = {
46375                   loc: loc,
46376                   key: bubble.id,
46377                   ca: bubble.he,
46378                   captured_at: bubble.cd,
46379                   captured_by: 'microsoft',
46380                   // nbn: bubble.nbn,
46381                   // pbn: bubble.pbn,
46382                   // ad: bubble.ad,
46383                   // rn: bubble.rn,
46384                   pr: bubble.pr,  // previous
46385                   ne: bubble.ne,  // next
46386                   pano: true,
46387                   sequenceKey: null
46388               };
46389
46390               cache.points[bubble.id] = d;
46391
46392               // a sequence starts here
46393               if (bubble.pr === undefined) {
46394                   cache.leaders.push(bubble.id);
46395               }
46396
46397               return {
46398                   minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d
46399               };
46400
46401           }).filter(Boolean);
46402
46403           cache.rtree.load(features);
46404
46405           connectSequences();
46406
46407           if (which === 'bubbles') {
46408               dispatch$4.call('loadedBubbles');
46409           }
46410       });
46411   }
46412
46413
46414   // call this sometimes to connect the bubbles into sequences
46415   function connectSequences() {
46416       var cache = _ssCache.bubbles;
46417       var keepLeaders = [];
46418
46419       for (var i = 0; i < cache.leaders.length; i++) {
46420           var bubble = cache.points[cache.leaders[i]];
46421           var seen = {};
46422
46423           // try to make a sequence.. use the key of the leader bubble.
46424           var sequence = { key: bubble.key, bubbles: [] };
46425           var complete = false;
46426
46427           do {
46428               sequence.bubbles.push(bubble);
46429               seen[bubble.key] = true;
46430
46431               if (bubble.ne === undefined) {
46432                   complete = true;
46433               } else {
46434                   bubble = cache.points[bubble.ne];  // advance to next
46435               }
46436           } while (bubble && !seen[bubble.key] && !complete);
46437
46438
46439           if (complete) {
46440               _ssCache.sequences[sequence.key] = sequence;
46441
46442               // assign bubbles to the sequence
46443               for (var j = 0; j < sequence.bubbles.length; j++) {
46444                   sequence.bubbles[j].sequenceKey = sequence.key;
46445               }
46446
46447               // create a GeoJSON LineString
46448               sequence.geojson = {
46449                   type: 'LineString',
46450                   properties: { key: sequence.key },
46451                   coordinates: sequence.bubbles.map(function (d) { return d.loc; })
46452               };
46453
46454           } else {
46455               keepLeaders.push(cache.leaders[i]);
46456           }
46457       }
46458
46459       // couldn't complete these, save for later
46460       cache.leaders = keepLeaders;
46461   }
46462
46463   /**
46464    * getBubbles() handles the request to the server for a tile extent of 'bubbles' (streetside image locations).
46465    */
46466   function getBubbles(url, tile, callback) {
46467       var rect = tile.extent.rectangle();
46468       var urlForRequest = url + utilQsString({
46469           n: rect[3],
46470           s: rect[1],
46471           e: rect[2],
46472           w: rect[0],
46473           c: maxResults$2,
46474           appkey: bubbleAppKey,
46475           jsCallback: '{callback}'
46476       });
46477
46478       return jsonpRequest(urlForRequest, function (data) {
46479           if (!data || data.error) {
46480               callback(null);
46481           } else {
46482               callback(data);
46483           }
46484       });
46485   }
46486
46487
46488   // partition viewport into higher zoom tiles
46489   function partitionViewport$2(projection) {
46490       var z = geoScaleToZoom(projection.scale());
46491       var z2 = (Math.ceil(z * 2) / 2) + 2.5;   // round to next 0.5 and add 2.5
46492       var tiler = utilTiler().zoomExtent([z2, z2]);
46493
46494       return tiler.getTiles(projection)
46495           .map(function(tile) { return tile.extent; });
46496   }
46497
46498
46499   // no more than `limit` results per partition.
46500   function searchLimited$2(limit, projection, rtree) {
46501       limit = limit || 5;
46502
46503       return partitionViewport$2(projection)
46504           .reduce(function(result, extent) {
46505               var found = rtree.search(extent.bbox())
46506                   .slice(0, limit)
46507                   .map(function(d) { return d.data; });
46508
46509               return (found.length ? result.concat(found) : result);
46510           }, []);
46511   }
46512
46513
46514   /**
46515    * getImage()
46516    */
46517   function getImage(imgInfo) {
46518       var response = q.defer();
46519       var img = new Image();
46520
46521       img.onload = function() {
46522           var canvas = document.getElementById('canvas' + imgInfo.face);
46523           var ctx = canvas.getContext('2d');
46524           ctx.drawImage(img, imgInfo.x, imgInfo.y);
46525           response.resolve({imgInfo:imgInfo, status: 'ok'});
46526       };
46527       img.onerror = function() {
46528           response.resolve({data: imgInfo, status: 'error'});
46529       };
46530       img.setAttribute('crossorigin', '');
46531       img.src = imgInfo.url;
46532
46533       return response.promise;
46534   }
46535
46536
46537   /**
46538    * loadCanvas()
46539    */
46540   function loadCanvas(imgInfoGroup) {
46541       var response = q.defer();
46542       var getImagePromises = imgInfoGroup.map(function(imgInfo) {
46543           return getImage(imgInfo);
46544       });
46545
46546       q.all(getImagePromises).then(function(data) {
46547           var canvas = document.getElementById('canvas' + data[0].imgInfo.face);
46548           switch (data[0].imgInfo.face) {
46549               case '01':
46550                   _dataUrlArray[0] = canvas.toDataURL('image/jpeg', 1.0);
46551                   break;
46552               case '02':
46553                   _dataUrlArray[1] = canvas.toDataURL('image/jpeg', 1.0);
46554                   break;
46555               case '03':
46556                   _dataUrlArray[2] = canvas.toDataURL('image/jpeg', 1.0);
46557                   break;
46558               case '10':
46559                   _dataUrlArray[3] = canvas.toDataURL('image/jpeg', 1.0);
46560                   break;
46561               case '11':
46562                   _dataUrlArray[4] = canvas.toDataURL('image/jpeg', 1.0);
46563                   break;
46564               case '12':
46565                   _dataUrlArray[5] = canvas.toDataURL('image/jpeg', 1.0);
46566                   break;
46567           }
46568           response.resolve({status:'loadCanvas for face ' + data[0].imgInfo.face + 'ok'});
46569       });
46570
46571       return response.promise;
46572   }
46573
46574
46575   function setupCanvas(selection$$1, reset) {
46576       if (reset) {
46577           selection$$1.selectAll('#divForCanvasWork')
46578               .remove();
46579       }
46580
46581       // Add the Streetside working canvases. These are used for 'stitching', or combining,
46582       // multiple images for each of the six faces, before passing to the Pannellum control as DataUrls
46583       selection$$1.selectAll('#divForCanvasWork')
46584           .data([0])
46585           .enter()
46586           .append('div')
46587           .attr('id', 'divForCanvasWork')
46588           .attr('display', 'none')
46589           .selectAll('canvas')
46590           .data(['canvas01', 'canvas02', 'canvas03', 'canvas10', 'canvas11', 'canvas12'])
46591           .enter()
46592           .append('canvas')
46593           .attr('id', function(d) { return d; })
46594           .attr('width', _resolution)
46595           .attr('height', _resolution);
46596   }
46597
46598
46599   /**
46600    * processFaces()
46601    */
46602   function processFaces(imgFaceInfoGroups) {
46603       var response = q.defer();
46604       var loadCanvasPromises = imgFaceInfoGroups.map(function(faceImgGroup) {
46605           return loadCanvas(faceImgGroup);
46606       });
46607
46608       q.all(loadCanvasPromises).then(function() {
46609           response.resolve({status: 'processFaces done'});
46610       });
46611
46612       return response.promise;
46613   }
46614
46615
46616
46617   function qkToXY(qk) {
46618       var x = 0;
46619       var y = 0;
46620       var scale = 256;
46621       for (var i = qk.length; i > 0; i--) {
46622           var key = qk[i-1];
46623           x += (+(key === '1' || key === '3')) * scale;
46624           y += (+(key === '2' || key === '3')) * scale;
46625           scale *= 2;
46626       }
46627       return [x, y];
46628   }
46629
46630
46631   function getQuadKeys() {
46632       var dim = _resolution / 256;
46633       var quadKeys;
46634
46635       if (dim === 16) {
46636           quadKeys = [
46637               '0000','0001','0010','0011','0100','0101','0110','0111',  '1000','1001','1010','1011','1100','1101','1110','1111',
46638               '0002','0003','0012','0013','0102','0103','0112','0113',  '1002','1003','1012','1013','1102','1103','1112','1113',
46639               '0020','0021','0030','0031','0120','0121','0130','0131',  '1020','1021','1030','1031','1120','1121','1130','1131',
46640               '0022','0023','0032','0033','0122','0123','0132','0133',  '1022','1023','1032','1033','1122','1123','1132','1133',
46641               '0200','0201','0210','0211','0300','0301','0310','0311',  '1200','1201','1210','1211','1300','1301','1310','1311',
46642               '0202','0203','0212','0213','0302','0303','0312','0313',  '1202','1203','1212','1213','1302','1303','1312','1313',
46643               '0220','0221','0230','0231','0320','0321','0330','0331',  '1220','1221','1230','1231','1320','1321','1330','1331',
46644               '0222','0223','0232','0233','0322','0323','0332','0333',  '1222','1223','1232','1233','1322','1323','1332','1333',
46645
46646               '2000','2001','2010','2011','2100','2101','2110','2111',  '3000','3001','3010','3011','3100','3101','3110','3111',
46647               '2002','2003','2012','2013','2102','2103','2112','2113',  '3002','3003','3012','3013','3102','3103','3112','3113',
46648               '2020','2021','2030','2031','2120','2121','2130','2131',  '3020','3021','3030','3031','3120','3121','3130','3131',
46649               '2022','2023','2032','2033','2122','2123','2132','2133',  '3022','3023','3032','3033','3122','3123','3132','3133',
46650               '2200','2201','2210','2211','2300','2301','2310','2311',  '3200','3201','3210','3211','3300','3301','3310','3311',
46651               '2202','2203','2212','2213','2302','2303','2312','2313',  '3202','3203','3212','3213','3302','3303','3312','3313',
46652               '2220','2221','2230','2231','2320','2321','2330','2331',  '3220','3221','3230','3231','3320','3321','3330','3331',
46653               '2222','2223','2232','2233','2322','2323','2332','2333',  '3222','3223','3232','3233','3322','3323','3332','3333'
46654           ];
46655
46656       } else if (dim === 8) {
46657           quadKeys = [
46658               '000','001','010','011',  '100','101','110','111',
46659               '002','003','012','013',  '102','103','112','113',
46660               '020','021','030','031',  '120','121','130','131',
46661               '022','023','032','033',  '122','123','132','133',
46662
46663               '200','201','210','211',  '300','301','310','311',
46664               '202','203','212','213',  '302','303','312','313',
46665               '220','221','230','231',  '320','321','330','331',
46666               '222','223','232','233',  '322','323','332','333'
46667           ];
46668
46669       } else if (dim === 4) {
46670           quadKeys = [
46671               '00','01',  '10','11',
46672               '02','03',  '12','13',
46673
46674               '20','21',  '30','31',
46675               '22','23',  '32','33'
46676           ];
46677
46678       } else {  // dim === 2
46679           quadKeys = [
46680               '0', '1',
46681               '2', '3'
46682           ];
46683       }
46684
46685       return quadKeys;
46686   }
46687
46688
46689
46690   var serviceStreetside = {
46691       /**
46692        * init() initialize streetside.
46693        */
46694       init: function () {
46695           if (!_ssCache) {
46696               this.reset();
46697           }
46698
46699           this.event = utilRebind(this, dispatch$4, 'on');
46700       },
46701
46702       /**
46703        * reset() reset the cache.
46704        */
46705       reset: function () {
46706           var cache = _ssCache;
46707
46708           if (cache) {
46709               if (cache.bubbles && cache.bubbles.inflight) {
46710                   forEach(cache.bubbles.inflight, abortRequest$3);
46711               }
46712           }
46713
46714           _ssCache = {
46715               bubbles: { inflight: {}, loaded: {}, nextPage: {}, rtree: rbush_1(), points: {}, leaders: [] },
46716               sequences: {}
46717           };
46718       },
46719
46720       /**
46721        * bubbles()
46722        */
46723       bubbles: function (projection) {
46724           var limit = 5;
46725           return searchLimited$2(limit, projection, _ssCache.bubbles.rtree);
46726       },
46727
46728
46729       sequences: function(projection) {
46730           var viewport = projection.clipExtent();
46731           var min = [viewport[0][0], viewport[1][1]];
46732           var max = [viewport[1][0], viewport[0][1]];
46733           var bbox = geoExtent$$1(projection.invert(min), projection.invert(max)).bbox();
46734           var seen = {};
46735           var results = [];
46736
46737           // all sequences for bubbles in viewport
46738           _ssCache.bubbles.rtree.search(bbox)
46739               .forEach(function(d) {
46740                   var key = d.data.sequenceKey;
46741                   if (key && !seen[key]) {
46742                       seen[key] = true;
46743                       results.push(_ssCache.sequences[key].geojson);
46744                   }
46745               });
46746
46747           return results;
46748       },
46749
46750
46751       /**
46752        * loadBubbles()
46753        */
46754       loadBubbles: function (projection, margin) {
46755           // by default: request 2 nearby tiles so we can connect sequences.
46756           if (margin === undefined) margin = 2;
46757
46758           loadTiles$2('bubbles', bubbleApi, projection, margin);
46759       },
46760
46761
46762       viewer: function() {
46763           return _pannellumViewer;
46764       },
46765
46766
46767       initViewer: function () {
46768           if (!window.pannellum) return;
46769           if (_pannellumViewer) return;
46770
46771           var sceneID = ++_currScene + '';
46772           var options = {
46773               'default': { firstScene: sceneID },
46774               scenes: {}
46775           };
46776           options.scenes[sceneID] = _sceneOptions;
46777
46778           _pannellumViewer = window.pannellum.viewer('viewer-streetside', options);
46779
46780           _pannellumViewer
46781               .on('mousedown', function() {
46782                   select(window).on('mousemove.pannellum', function() {
46783                       dispatch$4.call('viewerChanged');
46784                   });
46785               })
46786               .on('mouseup', function() {
46787                   select(window).on('mousemove.pannellum', null);
46788                   // continue dispatching events for a few seconds, in case viewer has inertia.
46789                   var t$$1 = timer(function(elapsed) {
46790                       dispatch$4.call('viewerChanged');
46791                       if (elapsed > 2000) {
46792                           t$$1.stop();
46793                       }
46794                   });
46795               });
46796       },
46797
46798
46799       /**
46800        * loadViewer() create the streeside viewer.
46801        */
46802       loadViewer: function (context) {
46803           var that = this;
46804
46805           // create ms-wrapper, a photo wrapper class
46806           var wrap = select('#photoviewer').selectAll('.ms-wrapper')
46807               .data([0]);
46808
46809           // inject ms-wrapper into the photoviewer div
46810           // (used by all to house each custom photo viewer)
46811           var wrapEnter = wrap.enter()
46812               .append('div')
46813               .attr('id', 'ms')
46814               .attr('class', 'photo-wrapper ms-wrapper')
46815               .classed('hide', true);
46816
46817           // inject div to support streetside viewer (pannellum) and attribution line
46818           wrapEnter
46819               .append('div')
46820               .attr('id', 'viewer-streetside')
46821               .append('div')
46822               .attr('class', 'photo-attribution fillD');
46823
46824           var controlsEnter = wrapEnter
46825               .append('div')
46826               .attr('class', 'photo-controls-wrap')
46827               .append('div')
46828               .attr('class', 'photo-controls');
46829
46830           controlsEnter
46831               .append('button')
46832               .on('click.back', step(-1))
46833               .text('◄');
46834
46835           controlsEnter
46836               .append('button')
46837               .on('click.forward', step(1))
46838               .text('►');
46839
46840
46841           // create working canvas for stitching together images
46842           wrap = wrap
46843               .merge(wrapEnter)
46844               .call(setupCanvas, true);
46845
46846           // load streetside pannellum viewer css
46847           select('head').selectAll('#streetside-viewercss')
46848               .data([0])
46849               .enter()
46850               .append('link')
46851               .attr('id', 'streetside-viewercss')
46852               .attr('rel', 'stylesheet')
46853               .attr('href', context.asset(pannellumViewerCSS));
46854
46855           // load streetside pannellum viewer js
46856           select('head').selectAll('#streetside-viewerjs')
46857               .data([0])
46858               .enter()
46859               .append('script')
46860               .attr('id', 'streetside-viewerjs')
46861               .attr('src', context.asset(pannellumViewerJS));
46862
46863
46864           // Register viewer resize handler
46865           context.ui().photoviewer.on('resize', function() {
46866               if (_pannellumViewer) {
46867                   _pannellumViewer.resize();
46868               }
46869           });
46870
46871
46872           function step(stepBy) {
46873               return function() {
46874                   var viewer = select('#photoviewer');
46875                   var selected = viewer.empty() ? undefined : viewer.datum();
46876                   if (!selected) return;
46877
46878                   var nextID = (stepBy === 1 ? selected.ne : selected.pr);
46879                   var yaw = _pannellumViewer.getYaw();
46880                   var ca = selected.ca + yaw;
46881                   var origin = selected.loc;
46882
46883                   // construct a search trapezoid pointing out from current bubble
46884                   var meters = 35;
46885                   var p1 = [
46886                       origin[0] + geoMetersToLon(meters / 5, origin[1]),
46887                       origin[1]
46888                   ];
46889                   var p2 = [
46890                       origin[0] + geoMetersToLon(meters / 2, origin[1]),
46891                       origin[1] + geoMetersToLat(meters)
46892                   ];
46893                   var p3 = [
46894                       origin[0] - geoMetersToLon(meters / 2, origin[1]),
46895                       origin[1] + geoMetersToLat(meters)
46896                   ];
46897                   var p4 = [
46898                       origin[0] - geoMetersToLon(meters / 5, origin[1]),
46899                       origin[1]
46900                   ];
46901
46902                   var poly = [p1, p2, p3, p4, p1];
46903
46904                   // rotate it to face forward/backward
46905                   var angle = (stepBy === 1 ? ca : ca + 180) * (Math.PI / 180);
46906                   poly = geoRotate(poly, -angle, origin);
46907
46908                   var extent = poly.reduce(function(extent, point$$1) {
46909                       return extent.extend(geoExtent$$1(point$$1));
46910                   }, geoExtent$$1());
46911
46912                   // find nearest other bubble in the search polygon
46913                   var minDist = Infinity;
46914                   _ssCache.bubbles.rtree.search(extent.bbox())
46915                       .forEach(function(d) {
46916                           if (d.data.key === selected.key) return;
46917                           if (!geoPointInPolygon(d.data.loc, poly)) return;
46918
46919                           var dist = geoVecLength(d.data.loc, selected.loc);
46920                           var theta = selected.ca - d.data.ca;
46921                           var minTheta = Math.min(Math.abs(theta), 360 - Math.abs(theta));
46922                           if (minTheta > 20) {
46923                               dist += 5;  // penalize distance if camera angles don't match
46924                           }
46925
46926                           if (dist < minDist) {
46927                               nextID = d.data.key;
46928                               minDist = dist;
46929                           }
46930                       });
46931
46932                   var nextBubble = nextID && _ssCache.bubbles.points[nextID];
46933                   if (!nextBubble) return;
46934
46935                   context.map().centerEase(nextBubble.loc);
46936
46937                   that.selectImage(nextBubble)
46938                       .then(function(r) {
46939                           if (r.status === 'ok') {
46940                               _sceneOptions.yaw = yaw;
46941                               that.showViewer();
46942                           }
46943                       });
46944               };
46945           }
46946       },
46947
46948       /**
46949        * showViewer()
46950        */
46951       showViewer: function (yaw) {
46952           if (!_sceneOptions) return;
46953
46954           if (yaw !== undefined) {
46955               _sceneOptions.yaw = yaw;
46956           }
46957
46958           if (!_pannellumViewer) {
46959               this.initViewer();
46960           } else {
46961               // make a new scene
46962               var sceneID = ++_currScene + '';
46963               _pannellumViewer
46964                   .addScene(sceneID, _sceneOptions)
46965                   .loadScene(sceneID);
46966
46967               // remove previous scene
46968               if (_currScene > 2) {
46969                   sceneID = (_currScene - 1) + '';
46970                   _pannellumViewer
46971                       .removeScene(sceneID);
46972               }
46973           }
46974
46975           var wrap = select('#photoviewer')
46976               .classed('hide', false);
46977
46978           var isHidden = wrap.selectAll('.photo-wrapper.ms-wrapper.hide').size();
46979
46980           if (isHidden) {
46981               wrap
46982                   .selectAll('.photo-wrapper:not(.ms-wrapper)')
46983                   .classed('hide', true);
46984
46985               wrap
46986                   .selectAll('.photo-wrapper.ms-wrapper')
46987                   .classed('hide', false);
46988           }
46989
46990           return this;
46991       },
46992
46993       /**
46994        * hideViewer()
46995        */
46996       hideViewer: function () {
46997           var viewer = select('#photoviewer');
46998           if (!viewer.empty()) viewer.datum(null);
46999
47000           viewer
47001               .classed('hide', true)
47002               .selectAll('.photo-wrapper')
47003               .classed('hide', true);
47004
47005           d3_selectAll('.viewfield-group, .sequence, .icon-sign')
47006               .classed('selected', false);
47007
47008           return this.setStyles(null, true);
47009       },
47010
47011       /**
47012        * selectImage().
47013        */
47014       selectImage: function (d) {
47015           var response = q.defer();
47016           var that = this;
47017
47018           var viewer = select('#photoviewer');
47019           if (!viewer.empty()) viewer.datum(d);
47020
47021           this.setStyles(null, true);
47022
47023           var wrap = select('#photoviewer .ms-wrapper');
47024           var attribution = wrap.selectAll('.photo-attribution').html('');
47025
47026           wrap.selectAll('.pnlm-load-box')   // display "loading.."
47027               .style('display', 'block');
47028
47029           if (!d) {
47030               response.resolve({status: 'ok'});
47031               return response.promise;
47032           }
47033
47034           var line1 = attribution
47035               .append('div')
47036               .attr('class', 'attribution-row');
47037
47038           // Add hires checkbox
47039           var label = line1
47040               .append('label')
47041               .attr('class', 'streetside-hires');
47042
47043           label
47044               .append('input')
47045               .attr('type', 'checkbox')
47046               .attr('id', 'streetside-hires-input')
47047               .property('checked', _hires)
47048               .on('click', function() {
47049                   event.stopPropagation();
47050
47051                   _hires = !_hires;
47052                   _resolution = _hires ? 1024 : 512;
47053                   wrap.call(setupCanvas, true);
47054
47055                   var viewstate = {
47056                       yaw: _pannellumViewer.getYaw(),
47057                       pitch: _pannellumViewer.getPitch(),
47058                       hfov: _pannellumViewer.getHfov()
47059                   };
47060
47061                   that.selectImage(d)
47062                       .then(function(r) {
47063                           if (r.status === 'ok') {
47064                               _sceneOptions = assignIn(_sceneOptions, viewstate);
47065                               that.showViewer();
47066                           }
47067                       });
47068               });
47069
47070           label
47071               .append('span')
47072               .text(t('streetside.hires'));
47073
47074
47075           var captureInfo = line1
47076               .append('div')
47077               .attr('class', 'attribution-capture-info');
47078
47079           // Add capture date
47080           if (d.captured_by) {
47081               var yyyy = (new Date()).getFullYear();
47082
47083               captureInfo
47084                   .append('a')
47085                   .attr('class', 'captured_by')
47086                   .attr('target', '_blank')
47087                   .attr('href', 'https://www.microsoft.com/en-us/maps/streetside')
47088                   .text('©' + yyyy + ' Microsoft');
47089
47090               captureInfo
47091                   .append('span')
47092                   .text('|');
47093           }
47094
47095           if (d.captured_at) {
47096               captureInfo
47097                   .append('span')
47098                   .attr('class', 'captured_at')
47099                   .text(localeTimestamp(d.captured_at));
47100           }
47101
47102           // Add image links
47103           var line2 = attribution
47104               .append('div')
47105               .attr('class', 'attribution-row');
47106
47107           line2
47108               .append('a')
47109               .attr('class', 'image-view-link')
47110               .attr('target', '_blank')
47111               .attr('href', 'https://www.bing.com/maps?cp=' + d.loc[1] + '~' + d.loc[0] +
47112                   '&lvl=17&dir=' + d.ca + '&style=x&v=2&sV=1')
47113               .text(t('streetside.view_on_bing'));
47114
47115           line2
47116               .append('a')
47117               .attr('class', 'image-report-link')
47118               .attr('target', '_blank')
47119               .attr('href', 'https://www.bing.com/maps/privacyreport/streetsideprivacyreport?bubbleid=' + encodeURIComponent(d.key) +
47120                   '&focus=photo&lat=' + d.loc[1] + '&lng=' + d.loc[0] + '&z=17')
47121               .text(t('streetside.report'));
47122
47123
47124           var bubbleIdQuadKey = d.key.toString(4);
47125           var paddingNeeded = 16 - bubbleIdQuadKey.length;
47126           for (var i = 0; i < paddingNeeded; i++) {
47127               bubbleIdQuadKey = '0' + bubbleIdQuadKey;
47128           }
47129           var imgUrlPrefix = streetsideImagesApi + 'hs' + bubbleIdQuadKey;
47130           var imgUrlSuffix = '.jpg?g=6338&n=z';
47131
47132           // Cubemap face code order matters here: front=01, right=02, back=03, left=10, up=11, down=12
47133           var faceKeys = ['01','02','03','10','11','12'];
47134
47135           // Map images to cube faces
47136           var quadKeys = getQuadKeys();
47137           var faces = faceKeys.map(function(faceKey) {
47138               return quadKeys.map(function(quadKey) {
47139                   var xy = qkToXY(quadKey);
47140                   return {
47141                       face: faceKey,
47142                       url: imgUrlPrefix + faceKey + quadKey + imgUrlSuffix,
47143                       x: xy[0],
47144                       y: xy[1]
47145                   };
47146               });
47147           });
47148
47149           processFaces(faces).then(function() {
47150               _sceneOptions = {
47151                   showFullscreenCtrl: false,
47152                   autoLoad: true,
47153                   compass: true,
47154                   northOffset: d.ca,
47155                   yaw: 0,
47156                   minHfov: minHfov,
47157                   maxHfov: maxHfov,
47158                   hfov: defaultHfov,
47159                   type: 'cubemap',
47160                   cubeMap: [
47161                       _dataUrlArray[0],
47162                       _dataUrlArray[1],
47163                       _dataUrlArray[2],
47164                       _dataUrlArray[3],
47165                       _dataUrlArray[4],
47166                       _dataUrlArray[5]
47167                   ]
47168               };
47169               response.resolve({status: 'ok'});
47170           });
47171
47172           return response.promise;
47173       },
47174
47175
47176       getSequenceKeyForBubble: function(d) {
47177           return d && d.sequenceKey;
47178       },
47179
47180
47181       /**
47182        * setStyles().
47183        */
47184       setStyles: function (hovered, reset) {
47185           if (reset) {  // reset all layers
47186               d3_selectAll('.viewfield-group')
47187                   .classed('highlighted', false)
47188                   .classed('hovered', false)
47189                   .classed('selected', false);
47190
47191               d3_selectAll('.sequence')
47192                   .classed('highlighted', false)
47193                   .classed('selected', false);
47194           }
47195
47196           var hoveredBubbleKey = hovered && hovered.key;
47197           var hoveredSequenceKey = this.getSequenceKeyForBubble(hovered);
47198           var hoveredSequence = hoveredSequenceKey && _ssCache.sequences[hoveredSequenceKey];
47199           var hoveredBubbleKeys =  (hoveredSequence && hoveredSequence.bubbles.map(function (d) { return d.key; })) || [];
47200
47201           var viewer = select('#photoviewer');
47202           var selected = viewer.empty() ? undefined : viewer.datum();
47203           var selectedBubbleKey = selected && selected.key;
47204           var selectedSequenceKey = this.getSequenceKeyForBubble(selected);
47205           var selectedSequence = selectedSequenceKey && _ssCache.sequences[selectedSequenceKey];
47206           var selectedBubbleKeys = (selectedSequence && selectedSequence.bubbles.map(function (d) { return d.key; })) || [];
47207
47208           // highlight sibling viewfields on either the selected or the hovered sequences
47209           var highlightedBubbleKeys = union(hoveredBubbleKeys, selectedBubbleKeys);
47210
47211           d3_selectAll('.layer-streetside-images .viewfield-group')
47212               .classed('highlighted', function (d) { return highlightedBubbleKeys.indexOf(d.key) !== -1; })
47213               .classed('hovered', function (d) { return d.key === hoveredBubbleKey; })
47214               .classed('selected', function (d) { return d.key === selectedBubbleKey; });
47215
47216           d3_selectAll('.layer-streetside-images .sequence')
47217               .classed('highlighted', function (d) { return d.properties.key === hoveredSequenceKey; })
47218               .classed('selected', function (d) { return d.properties.key === selectedSequenceKey; });
47219
47220           // update viewfields if needed
47221           d3_selectAll('.viewfield-group .viewfield')
47222               .attr('d', viewfieldPath);
47223
47224           function viewfieldPath() {
47225               var d = this.parentNode.__data__;
47226               if (d.pano && d.key !== selectedBubbleKey) {
47227                   return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0';
47228               } else {
47229                   return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z';
47230               }
47231           }
47232
47233           return this;
47234       },
47235
47236       /**
47237        * cache().
47238        */
47239       cache: function () {
47240           return _ssCache;
47241       }
47242   };
47243
47244   var apibase$3 = 'https://taginfo.openstreetmap.org/api/4/',
47245       inflight$1 = {},
47246       popularKeys = {},
47247       taginfoCache = {},
47248       tag_sorts = {
47249           point: 'count_nodes',
47250           vertex: 'count_nodes',
47251           area: 'count_ways',
47252           line: 'count_ways'
47253       },
47254       tag_sort_members = {
47255           point: 'count_node_members',
47256           vertex: 'count_node_members',
47257           area: 'count_way_members',
47258           line: 'count_way_members',
47259           relation: 'count_relation_members'
47260       },
47261       tag_filters = {
47262           point: 'nodes',
47263           vertex: 'nodes',
47264           area: 'ways',
47265           line: 'ways'
47266       },
47267       tag_members_fractions = {
47268           point: 'count_node_members_fraction',
47269           vertex: 'count_node_members_fraction',
47270           area: 'count_way_members_fraction',
47271           line: 'count_way_members_fraction',
47272           relation: 'count_relation_members_fraction'
47273       };
47274
47275
47276   function sets(params, n, o) {
47277       if (params.geometry && o[params.geometry]) {
47278           params[n] = o[params.geometry];
47279       }
47280       return params;
47281   }
47282
47283
47284   function setFilter(params) {
47285       return sets(params, 'filter', tag_filters);
47286   }
47287
47288
47289   function setSort(params) {
47290       return sets(params, 'sortname', tag_sorts);
47291   }
47292
47293
47294   function setSortMembers(params) {
47295       return sets(params, 'sortname', tag_sort_members);
47296   }
47297
47298
47299   function clean(params) {
47300       return omit(params, ['geometry', 'debounce']);
47301   }
47302
47303
47304   function filterKeys(type) {
47305       var count_type = type ? 'count_' + type : 'count_all';
47306       return function(d) {
47307           return parseFloat(d[count_type]) > 2500 || d.in_wiki;
47308       };
47309   }
47310
47311
47312   function filterMultikeys(prefix) {
47313       return function(d) {
47314           // d.key begins with prefix, and d.key contains no additional ':'s
47315           var re = new RegExp('^' + prefix + '(.*)$');
47316           var matches = d.key.match(re) || [];
47317           return (matches.length === 2 && matches[1].indexOf(':') === -1);
47318       };
47319   }
47320
47321
47322   function filterValues(allowUpperCase) {
47323       return function(d) {
47324           if (d.value.match(/[;,]/) !== null) return false;  // exclude some punctuation
47325           if (!allowUpperCase && d.value.match(/[A-Z*]/) !== null) return false;  // exclude uppercase letters
47326           return parseFloat(d.fraction) > 0.0;
47327       };
47328   }
47329
47330
47331   function filterRoles(geometry) {
47332       return function(d) {
47333           if (d.role === '') return false; // exclude empty role
47334           if (d.role.match(/[A-Z*;,]/) !== null) return false;  // exclude uppercase letters and some punctuation
47335           return parseFloat(d[tag_members_fractions[geometry]]) > 0.0;
47336       };
47337   }
47338
47339
47340   function valKey(d) {
47341       return {
47342           value: d.key,
47343           title: d.key
47344       };
47345   }
47346
47347
47348   function valKeyDescription(d) {
47349       return {
47350           value: d.value,
47351           title: d.description || d.value
47352       };
47353   }
47354
47355
47356   function roleKey(d) {
47357       return {
47358           value: d.role,
47359           title: d.role
47360       };
47361   }
47362
47363
47364   // sort keys with ':' lower than keys without ':'
47365   function sortKeys(a, b) {
47366       return (a.key.indexOf(':') === -1 && b.key.indexOf(':') !== -1) ? -1
47367           : (a.key.indexOf(':') !== -1 && b.key.indexOf(':') === -1) ? 1
47368           : 0;
47369   }
47370
47371
47372   var debouncedRequest = debounce(request$1, 500, { leading: false });
47373
47374   function request$1(url, params, exactMatch, callback, loaded) {
47375       if (inflight$1[url]) return;
47376
47377       if (checkCache(url, params, exactMatch, callback)) return;
47378
47379       inflight$1[url] = d3_json(url, function (err, data) {
47380           delete inflight$1[url];
47381           loaded(err, data);
47382       });
47383   }
47384
47385
47386   function checkCache(url, params, exactMatch, callback) {
47387       var rp = params.rp || 25,
47388           testQuery = params.query || '',
47389           testUrl = url;
47390
47391       do {
47392           var hit = taginfoCache[testUrl];
47393
47394           // exact match, or shorter match yielding fewer than max results (rp)
47395           if (hit && (url === testUrl || hit.length < rp)) {
47396               callback(null, hit);
47397               return true;
47398           }
47399
47400           // don't try to shorten the query
47401           if (exactMatch || !testQuery.length) return false;
47402
47403           // do shorten the query to see if we already have a cached result
47404           // that has returned fewer than max results (rp)
47405           testQuery = testQuery.slice(0, -1);
47406           testUrl = url.replace(/&query=(.*?)&/, '&query=' + testQuery + '&');
47407       } while (testQuery.length >= 0);
47408
47409       return false;
47410   }
47411
47412
47413   var serviceTaginfo = {
47414
47415       init: function() {
47416           inflight$1 = {};
47417           taginfoCache = {};
47418           popularKeys = {
47419               postal_code: true   // #5377
47420           };
47421
47422           // Fetch popular keys.  We'll exclude these from `values`
47423           // lookups because they stress taginfo, and they aren't likely
47424           // to yield meaningful autocomplete results.. see #3955
47425           var params = { rp: 100, sortname: 'values_all', sortorder: 'desc', page: 1, debounce: false, lang: currentLocale };
47426           this.keys(params, function(err, data) {
47427               if (err) return;
47428               data.forEach(function(d) {
47429                   if (d.value === 'opening_hours') return;  // exception
47430                   popularKeys[d.value] = true;
47431               });
47432           });
47433       },
47434
47435
47436       reset: function() {
47437           forEach(inflight$1, function(req) { req.abort(); });
47438           inflight$1 = {};
47439       },
47440
47441
47442       keys: function(params, callback) {
47443           var doRequest = params.debounce ? debouncedRequest : request$1;
47444           params = clean(setSort(params));
47445           params = assignIn({ rp: 10, sortname: 'count_all', sortorder: 'desc', page: 1, lang: currentLocale }, params);
47446
47447           var url = apibase$3 + 'keys/all?' + utilQsString(params);
47448           doRequest(url, params, false, callback, function(err, d) {
47449               if (err) {
47450                   callback(err);
47451               } else {
47452                   var f = filterKeys(params.filter);
47453                   var result = d.data.filter(f).sort(sortKeys).map(valKey);
47454                   taginfoCache[url] = result;
47455                   callback(null, result);
47456               }
47457           });
47458       },
47459
47460
47461       multikeys: function(params, callback) {
47462           var doRequest = params.debounce ? debouncedRequest : request$1;
47463           params = clean(setSort(params));
47464           params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1, lang: currentLocale }, params);
47465           var prefix = params.query;
47466
47467           var url = apibase$3 + 'keys/all?' + utilQsString(params);
47468           doRequest(url, params, true, callback, function(err, d) {
47469               if (err) {
47470                   callback(err);
47471               } else {
47472                   var f = filterMultikeys(prefix);
47473                   var result = d.data.filter(f).map(valKey);
47474                   taginfoCache[url] = result;
47475                   callback(null, result);
47476               }
47477           });
47478       },
47479
47480
47481       values: function(params, callback) {
47482           // Exclude popular keys from values lookups.. see #3955
47483           var key = params.key;
47484           if (key && popularKeys[key]) {
47485               callback(null, []);
47486               return;
47487           }
47488
47489           var doRequest = params.debounce ? debouncedRequest : request$1;
47490           params = clean(setSort(setFilter(params)));
47491           params = assignIn({ rp: 25, sortname: 'count_all', sortorder: 'desc', page: 1, lang: currentLocale }, params);
47492
47493           var url = apibase$3 + 'key/values?' + utilQsString(params);
47494           doRequest(url, params, false, callback, function(err, d) {
47495               if (err) {
47496                   callback(err);
47497               } else {
47498                   // In most cases we prefer taginfo value results with lowercase letters.
47499                   // A few OSM keys expect values to contain uppercase values (see #3377).
47500                   // This is not an exhaustive list (e.g. `name` also has uppercase values)
47501                   // but these are the fields where taginfo value lookup is most useful.
47502                   var re = /network|taxon|genus|species|brand|grape_variety|royal_cypher|listed_status|booth|rating|stars|:output|_hours|_times/;
47503                   var allowUpperCase = (params.key.match(re) !== null);
47504                   var f = filterValues(allowUpperCase);
47505
47506                   var result = d.data.filter(f).map(valKeyDescription);
47507                   taginfoCache[url] = result;
47508                   callback(null, result);
47509               }
47510           });
47511       },
47512
47513
47514       roles: function(params, callback) {
47515           var doRequest = params.debounce ? debouncedRequest : request$1;
47516           var geometry = params.geometry;
47517           params = clean(setSortMembers(params));
47518           params = assignIn({ rp: 25, sortname: 'count_all_members', sortorder: 'desc', page: 1, lang: currentLocale }, params);
47519
47520           var url = apibase$3 + 'relation/roles?' + utilQsString(params);
47521           doRequest(url, params, true, callback, function(err, d) {
47522               if (err) {
47523                   callback(err);
47524               } else {
47525                   var f = filterRoles(geometry);
47526                   var result = d.data.filter(f).map(roleKey);
47527                   taginfoCache[url] = result;
47528                   callback(null, result);
47529               }
47530           });
47531       },
47532
47533
47534       docs: function(params, callback) {
47535           var doRequest = params.debounce ? debouncedRequest : request$1;
47536           params = clean(setSort(params));
47537
47538           var path = 'key/wiki_pages?';
47539           if (params.value) path = 'tag/wiki_pages?';
47540           else if (params.rtype) path = 'relation/wiki_pages?';
47541
47542           var url = apibase$3 + path + utilQsString(params);
47543           doRequest(url, params, true, callback, function(err, d) {
47544               if (err) {
47545                   callback(err);
47546               } else {
47547                   taginfoCache[url] = d.data;
47548                   callback(null, d.data);
47549               }
47550           });
47551       },
47552
47553
47554       apibase: function(_) {
47555           if (!arguments.length) return apibase$3;
47556           apibase$3 = _;
47557           return this;
47558       }
47559
47560   };
47561
47562   var helpers = createCommonjsModule(function (module, exports) {
47563   Object.defineProperty(exports, "__esModule", { value: true });
47564   /**
47565    * @module helpers
47566    */
47567   /**
47568    * Earth Radius used with the Harvesine formula and approximates using a spherical (non-ellipsoid) Earth.
47569    *
47570    * @memberof helpers
47571    * @type {number}
47572    */
47573   exports.earthRadius = 6371008.8;
47574   /**
47575    * Unit of measurement factors using a spherical (non-ellipsoid) earth radius.
47576    *
47577    * @memberof helpers
47578    * @type {Object}
47579    */
47580   exports.factors = {
47581       centimeters: exports.earthRadius * 100,
47582       centimetres: exports.earthRadius * 100,
47583       degrees: exports.earthRadius / 111325,
47584       feet: exports.earthRadius * 3.28084,
47585       inches: exports.earthRadius * 39.370,
47586       kilometers: exports.earthRadius / 1000,
47587       kilometres: exports.earthRadius / 1000,
47588       meters: exports.earthRadius,
47589       metres: exports.earthRadius,
47590       miles: exports.earthRadius / 1609.344,
47591       millimeters: exports.earthRadius * 1000,
47592       millimetres: exports.earthRadius * 1000,
47593       nauticalmiles: exports.earthRadius / 1852,
47594       radians: 1,
47595       yards: exports.earthRadius / 1.0936,
47596   };
47597   /**
47598    * Units of measurement factors based on 1 meter.
47599    *
47600    * @memberof helpers
47601    * @type {Object}
47602    */
47603   exports.unitsFactors = {
47604       centimeters: 100,
47605       centimetres: 100,
47606       degrees: 1 / 111325,
47607       feet: 3.28084,
47608       inches: 39.370,
47609       kilometers: 1 / 1000,
47610       kilometres: 1 / 1000,
47611       meters: 1,
47612       metres: 1,
47613       miles: 1 / 1609.344,
47614       millimeters: 1000,
47615       millimetres: 1000,
47616       nauticalmiles: 1 / 1852,
47617       radians: 1 / exports.earthRadius,
47618       yards: 1 / 1.0936,
47619   };
47620   /**
47621    * Area of measurement factors based on 1 square meter.
47622    *
47623    * @memberof helpers
47624    * @type {Object}
47625    */
47626   exports.areaFactors = {
47627       acres: 0.000247105,
47628       centimeters: 10000,
47629       centimetres: 10000,
47630       feet: 10.763910417,
47631       inches: 1550.003100006,
47632       kilometers: 0.000001,
47633       kilometres: 0.000001,
47634       meters: 1,
47635       metres: 1,
47636       miles: 3.86e-7,
47637       millimeters: 1000000,
47638       millimetres: 1000000,
47639       yards: 1.195990046,
47640   };
47641   /**
47642    * Wraps a GeoJSON {@link Geometry} in a GeoJSON {@link Feature}.
47643    *
47644    * @name feature
47645    * @param {Geometry} geometry input geometry
47646    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47647    * @param {Object} [options={}] Optional Parameters
47648    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47649    * @param {string|number} [options.id] Identifier associated with the Feature
47650    * @returns {Feature} a GeoJSON Feature
47651    * @example
47652    * var geometry = {
47653    *   "type": "Point",
47654    *   "coordinates": [110, 50]
47655    * };
47656    *
47657    * var feature = turf.feature(geometry);
47658    *
47659    * //=feature
47660    */
47661   function feature(geom, properties, options) {
47662       if (options === void 0) { options = {}; }
47663       var feat = { type: "Feature" };
47664       if (options.id === 0 || options.id) {
47665           feat.id = options.id;
47666       }
47667       if (options.bbox) {
47668           feat.bbox = options.bbox;
47669       }
47670       feat.properties = properties || {};
47671       feat.geometry = geom;
47672       return feat;
47673   }
47674   exports.feature = feature;
47675   /**
47676    * Creates a GeoJSON {@link Geometry} from a Geometry string type & coordinates.
47677    * For GeometryCollection type use `helpers.geometryCollection`
47678    *
47679    * @name geometry
47680    * @param {string} type Geometry Type
47681    * @param {Array<any>} coordinates Coordinates
47682    * @param {Object} [options={}] Optional Parameters
47683    * @returns {Geometry} a GeoJSON Geometry
47684    * @example
47685    * var type = "Point";
47686    * var coordinates = [110, 50];
47687    * var geometry = turf.geometry(type, coordinates);
47688    * // => geometry
47689    */
47690   function geometry(type, coordinates, options) {
47691       if (options === void 0) { options = {}; }
47692       switch (type) {
47693           case "Point": return point(coordinates).geometry;
47694           case "LineString": return lineString(coordinates).geometry;
47695           case "Polygon": return polygon(coordinates).geometry;
47696           case "MultiPoint": return multiPoint(coordinates).geometry;
47697           case "MultiLineString": return multiLineString(coordinates).geometry;
47698           case "MultiPolygon": return multiPolygon(coordinates).geometry;
47699           default: throw new Error(type + " is invalid");
47700       }
47701   }
47702   exports.geometry = geometry;
47703   /**
47704    * Creates a {@link Point} {@link Feature} from a Position.
47705    *
47706    * @name point
47707    * @param {Array<number>} coordinates longitude, latitude position (each in decimal degrees)
47708    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47709    * @param {Object} [options={}] Optional Parameters
47710    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47711    * @param {string|number} [options.id] Identifier associated with the Feature
47712    * @returns {Feature<Point>} a Point feature
47713    * @example
47714    * var point = turf.point([-75.343, 39.984]);
47715    *
47716    * //=point
47717    */
47718   function point(coordinates, properties, options) {
47719       if (options === void 0) { options = {}; }
47720       var geom = {
47721           type: "Point",
47722           coordinates: coordinates,
47723       };
47724       return feature(geom, properties, options);
47725   }
47726   exports.point = point;
47727   /**
47728    * Creates a {@link Point} {@link FeatureCollection} from an Array of Point coordinates.
47729    *
47730    * @name points
47731    * @param {Array<Array<number>>} coordinates an array of Points
47732    * @param {Object} [properties={}] Translate these properties to each Feature
47733    * @param {Object} [options={}] Optional Parameters
47734    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
47735    * associated with the FeatureCollection
47736    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47737    * @returns {FeatureCollection<Point>} Point Feature
47738    * @example
47739    * var points = turf.points([
47740    *   [-75, 39],
47741    *   [-80, 45],
47742    *   [-78, 50]
47743    * ]);
47744    *
47745    * //=points
47746    */
47747   function points(coordinates, properties, options) {
47748       if (options === void 0) { options = {}; }
47749       return featureCollection(coordinates.map(function (coords) {
47750           return point(coords, properties);
47751       }), options);
47752   }
47753   exports.points = points;
47754   /**
47755    * Creates a {@link Polygon} {@link Feature} from an Array of LinearRings.
47756    *
47757    * @name polygon
47758    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
47759    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47760    * @param {Object} [options={}] Optional Parameters
47761    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47762    * @param {string|number} [options.id] Identifier associated with the Feature
47763    * @returns {Feature<Polygon>} Polygon Feature
47764    * @example
47765    * var polygon = turf.polygon([[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]], { name: 'poly1' });
47766    *
47767    * //=polygon
47768    */
47769   function polygon(coordinates, properties, options) {
47770       if (options === void 0) { options = {}; }
47771       for (var _i = 0, coordinates_1 = coordinates; _i < coordinates_1.length; _i++) {
47772           var ring = coordinates_1[_i];
47773           if (ring.length < 4) {
47774               throw new Error("Each LinearRing of a Polygon must have 4 or more Positions.");
47775           }
47776           for (var j = 0; j < ring[ring.length - 1].length; j++) {
47777               // Check if first point of Polygon contains two numbers
47778               if (ring[ring.length - 1][j] !== ring[0][j]) {
47779                   throw new Error("First and last Position are not equivalent.");
47780               }
47781           }
47782       }
47783       var geom = {
47784           type: "Polygon",
47785           coordinates: coordinates,
47786       };
47787       return feature(geom, properties, options);
47788   }
47789   exports.polygon = polygon;
47790   /**
47791    * Creates a {@link Polygon} {@link FeatureCollection} from an Array of Polygon coordinates.
47792    *
47793    * @name polygons
47794    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygon coordinates
47795    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47796    * @param {Object} [options={}] Optional Parameters
47797    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47798    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47799    * @returns {FeatureCollection<Polygon>} Polygon FeatureCollection
47800    * @example
47801    * var polygons = turf.polygons([
47802    *   [[[-5, 52], [-4, 56], [-2, 51], [-7, 54], [-5, 52]]],
47803    *   [[[-15, 42], [-14, 46], [-12, 41], [-17, 44], [-15, 42]]],
47804    * ]);
47805    *
47806    * //=polygons
47807    */
47808   function polygons(coordinates, properties, options) {
47809       if (options === void 0) { options = {}; }
47810       return featureCollection(coordinates.map(function (coords) {
47811           return polygon(coords, properties);
47812       }), options);
47813   }
47814   exports.polygons = polygons;
47815   /**
47816    * Creates a {@link LineString} {@link Feature} from an Array of Positions.
47817    *
47818    * @name lineString
47819    * @param {Array<Array<number>>} coordinates an array of Positions
47820    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47821    * @param {Object} [options={}] Optional Parameters
47822    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47823    * @param {string|number} [options.id] Identifier associated with the Feature
47824    * @returns {Feature<LineString>} LineString Feature
47825    * @example
47826    * var linestring1 = turf.lineString([[-24, 63], [-23, 60], [-25, 65], [-20, 69]], {name: 'line 1'});
47827    * var linestring2 = turf.lineString([[-14, 43], [-13, 40], [-15, 45], [-10, 49]], {name: 'line 2'});
47828    *
47829    * //=linestring1
47830    * //=linestring2
47831    */
47832   function lineString(coordinates, properties, options) {
47833       if (options === void 0) { options = {}; }
47834       if (coordinates.length < 2) {
47835           throw new Error("coordinates must be an array of two or more positions");
47836       }
47837       var geom = {
47838           type: "LineString",
47839           coordinates: coordinates,
47840       };
47841       return feature(geom, properties, options);
47842   }
47843   exports.lineString = lineString;
47844   /**
47845    * Creates a {@link LineString} {@link FeatureCollection} from an Array of LineString coordinates.
47846    *
47847    * @name lineStrings
47848    * @param {Array<Array<Array<number>>>} coordinates an array of LinearRings
47849    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47850    * @param {Object} [options={}] Optional Parameters
47851    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north]
47852    * associated with the FeatureCollection
47853    * @param {string|number} [options.id] Identifier associated with the FeatureCollection
47854    * @returns {FeatureCollection<LineString>} LineString FeatureCollection
47855    * @example
47856    * var linestrings = turf.lineStrings([
47857    *   [[-24, 63], [-23, 60], [-25, 65], [-20, 69]],
47858    *   [[-14, 43], [-13, 40], [-15, 45], [-10, 49]]
47859    * ]);
47860    *
47861    * //=linestrings
47862    */
47863   function lineStrings(coordinates, properties, options) {
47864       if (options === void 0) { options = {}; }
47865       return featureCollection(coordinates.map(function (coords) {
47866           return lineString(coords, properties);
47867       }), options);
47868   }
47869   exports.lineStrings = lineStrings;
47870   /**
47871    * Takes one or more {@link Feature|Features} and creates a {@link FeatureCollection}.
47872    *
47873    * @name featureCollection
47874    * @param {Feature[]} features input features
47875    * @param {Object} [options={}] Optional Parameters
47876    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47877    * @param {string|number} [options.id] Identifier associated with the Feature
47878    * @returns {FeatureCollection} FeatureCollection of Features
47879    * @example
47880    * var locationA = turf.point([-75.343, 39.984], {name: 'Location A'});
47881    * var locationB = turf.point([-75.833, 39.284], {name: 'Location B'});
47882    * var locationC = turf.point([-75.534, 39.123], {name: 'Location C'});
47883    *
47884    * var collection = turf.featureCollection([
47885    *   locationA,
47886    *   locationB,
47887    *   locationC
47888    * ]);
47889    *
47890    * //=collection
47891    */
47892   function featureCollection(features, options) {
47893       if (options === void 0) { options = {}; }
47894       var fc = { type: "FeatureCollection" };
47895       if (options.id) {
47896           fc.id = options.id;
47897       }
47898       if (options.bbox) {
47899           fc.bbox = options.bbox;
47900       }
47901       fc.features = features;
47902       return fc;
47903   }
47904   exports.featureCollection = featureCollection;
47905   /**
47906    * Creates a {@link Feature<MultiLineString>} based on a
47907    * coordinate array. Properties can be added optionally.
47908    *
47909    * @name multiLineString
47910    * @param {Array<Array<Array<number>>>} coordinates an array of LineStrings
47911    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47912    * @param {Object} [options={}] Optional Parameters
47913    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47914    * @param {string|number} [options.id] Identifier associated with the Feature
47915    * @returns {Feature<MultiLineString>} a MultiLineString feature
47916    * @throws {Error} if no coordinates are passed
47917    * @example
47918    * var multiLine = turf.multiLineString([[[0,0],[10,10]]]);
47919    *
47920    * //=multiLine
47921    */
47922   function multiLineString(coordinates, properties, options) {
47923       if (options === void 0) { options = {}; }
47924       var geom = {
47925           type: "MultiLineString",
47926           coordinates: coordinates,
47927       };
47928       return feature(geom, properties, options);
47929   }
47930   exports.multiLineString = multiLineString;
47931   /**
47932    * Creates a {@link Feature<MultiPoint>} based on a
47933    * coordinate array. Properties can be added optionally.
47934    *
47935    * @name multiPoint
47936    * @param {Array<Array<number>>} coordinates an array of Positions
47937    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47938    * @param {Object} [options={}] Optional Parameters
47939    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47940    * @param {string|number} [options.id] Identifier associated with the Feature
47941    * @returns {Feature<MultiPoint>} a MultiPoint feature
47942    * @throws {Error} if no coordinates are passed
47943    * @example
47944    * var multiPt = turf.multiPoint([[0,0],[10,10]]);
47945    *
47946    * //=multiPt
47947    */
47948   function multiPoint(coordinates, properties, options) {
47949       if (options === void 0) { options = {}; }
47950       var geom = {
47951           type: "MultiPoint",
47952           coordinates: coordinates,
47953       };
47954       return feature(geom, properties, options);
47955   }
47956   exports.multiPoint = multiPoint;
47957   /**
47958    * Creates a {@link Feature<MultiPolygon>} based on a
47959    * coordinate array. Properties can be added optionally.
47960    *
47961    * @name multiPolygon
47962    * @param {Array<Array<Array<Array<number>>>>} coordinates an array of Polygons
47963    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47964    * @param {Object} [options={}] Optional Parameters
47965    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47966    * @param {string|number} [options.id] Identifier associated with the Feature
47967    * @returns {Feature<MultiPolygon>} a multipolygon feature
47968    * @throws {Error} if no coordinates are passed
47969    * @example
47970    * var multiPoly = turf.multiPolygon([[[[0,0],[0,10],[10,10],[10,0],[0,0]]]]);
47971    *
47972    * //=multiPoly
47973    *
47974    */
47975   function multiPolygon(coordinates, properties, options) {
47976       if (options === void 0) { options = {}; }
47977       var geom = {
47978           type: "MultiPolygon",
47979           coordinates: coordinates,
47980       };
47981       return feature(geom, properties, options);
47982   }
47983   exports.multiPolygon = multiPolygon;
47984   /**
47985    * Creates a {@link Feature<GeometryCollection>} based on a
47986    * coordinate array. Properties can be added optionally.
47987    *
47988    * @name geometryCollection
47989    * @param {Array<Geometry>} geometries an array of GeoJSON Geometries
47990    * @param {Object} [properties={}] an Object of key-value pairs to add as properties
47991    * @param {Object} [options={}] Optional Parameters
47992    * @param {Array<number>} [options.bbox] Bounding Box Array [west, south, east, north] associated with the Feature
47993    * @param {string|number} [options.id] Identifier associated with the Feature
47994    * @returns {Feature<GeometryCollection>} a GeoJSON GeometryCollection Feature
47995    * @example
47996    * var pt = turf.geometry("Point", [100, 0]);
47997    * var line = turf.geometry("LineString", [[101, 0], [102, 1]]);
47998    * var collection = turf.geometryCollection([pt, line]);
47999    *
48000    * // => collection
48001    */
48002   function geometryCollection(geometries, properties, options) {
48003       if (options === void 0) { options = {}; }
48004       var geom = {
48005           type: "GeometryCollection",
48006           geometries: geometries,
48007       };
48008       return feature(geom, properties, options);
48009   }
48010   exports.geometryCollection = geometryCollection;
48011   /**
48012    * Round number to precision
48013    *
48014    * @param {number} num Number
48015    * @param {number} [precision=0] Precision
48016    * @returns {number} rounded number
48017    * @example
48018    * turf.round(120.4321)
48019    * //=120
48020    *
48021    * turf.round(120.4321, 2)
48022    * //=120.43
48023    */
48024   function round(num, precision) {
48025       if (precision === void 0) { precision = 0; }
48026       if (precision && !(precision >= 0)) {
48027           throw new Error("precision must be a positive number");
48028       }
48029       var multiplier = Math.pow(10, precision || 0);
48030       return Math.round(num * multiplier) / multiplier;
48031   }
48032   exports.round = round;
48033   /**
48034    * Convert a distance measurement (assuming a spherical Earth) from radians to a more friendly unit.
48035    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
48036    *
48037    * @name radiansToLength
48038    * @param {number} radians in radians across the sphere
48039    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
48040    * meters, kilometres, kilometers.
48041    * @returns {number} distance
48042    */
48043   function radiansToLength(radians, units) {
48044       if (units === void 0) { units = "kilometers"; }
48045       var factor = exports.factors[units];
48046       if (!factor) {
48047           throw new Error(units + " units is invalid");
48048       }
48049       return radians * factor;
48050   }
48051   exports.radiansToLength = radiansToLength;
48052   /**
48053    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into radians
48054    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
48055    *
48056    * @name lengthToRadians
48057    * @param {number} distance in real units
48058    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
48059    * meters, kilometres, kilometers.
48060    * @returns {number} radians
48061    */
48062   function lengthToRadians(distance, units) {
48063       if (units === void 0) { units = "kilometers"; }
48064       var factor = exports.factors[units];
48065       if (!factor) {
48066           throw new Error(units + " units is invalid");
48067       }
48068       return distance / factor;
48069   }
48070   exports.lengthToRadians = lengthToRadians;
48071   /**
48072    * Convert a distance measurement (assuming a spherical Earth) from a real-world unit into degrees
48073    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, centimeters, kilometres, feet
48074    *
48075    * @name lengthToDegrees
48076    * @param {number} distance in real units
48077    * @param {string} [units="kilometers"] can be degrees, radians, miles, or kilometers inches, yards, metres,
48078    * meters, kilometres, kilometers.
48079    * @returns {number} degrees
48080    */
48081   function lengthToDegrees(distance, units) {
48082       return radiansToDegrees(lengthToRadians(distance, units));
48083   }
48084   exports.lengthToDegrees = lengthToDegrees;
48085   /**
48086    * Converts any bearing angle from the north line direction (positive clockwise)
48087    * and returns an angle between 0-360 degrees (positive clockwise), 0 being the north line
48088    *
48089    * @name bearingToAzimuth
48090    * @param {number} bearing angle, between -180 and +180 degrees
48091    * @returns {number} angle between 0 and 360 degrees
48092    */
48093   function bearingToAzimuth(bearing) {
48094       var angle = bearing % 360;
48095       if (angle < 0) {
48096           angle += 360;
48097       }
48098       return angle;
48099   }
48100   exports.bearingToAzimuth = bearingToAzimuth;
48101   /**
48102    * Converts an angle in radians to degrees
48103    *
48104    * @name radiansToDegrees
48105    * @param {number} radians angle in radians
48106    * @returns {number} degrees between 0 and 360 degrees
48107    */
48108   function radiansToDegrees(radians) {
48109       var degrees = radians % (2 * Math.PI);
48110       return degrees * 180 / Math.PI;
48111   }
48112   exports.radiansToDegrees = radiansToDegrees;
48113   /**
48114    * Converts an angle in degrees to radians
48115    *
48116    * @name degreesToRadians
48117    * @param {number} degrees angle between 0 and 360 degrees
48118    * @returns {number} angle in radians
48119    */
48120   function degreesToRadians(degrees) {
48121       var radians = degrees % 360;
48122       return radians * Math.PI / 180;
48123   }
48124   exports.degreesToRadians = degreesToRadians;
48125   /**
48126    * Converts a length to the requested unit.
48127    * Valid units: miles, nauticalmiles, inches, yards, meters, metres, kilometers, centimeters, feet
48128    *
48129    * @param {number} length to be converted
48130    * @param {Units} [originalUnit="kilometers"] of the length
48131    * @param {Units} [finalUnit="kilometers"] returned unit
48132    * @returns {number} the converted length
48133    */
48134   function convertLength(length, originalUnit, finalUnit) {
48135       if (originalUnit === void 0) { originalUnit = "kilometers"; }
48136       if (finalUnit === void 0) { finalUnit = "kilometers"; }
48137       if (!(length >= 0)) {
48138           throw new Error("length must be a positive number");
48139       }
48140       return radiansToLength(lengthToRadians(length, originalUnit), finalUnit);
48141   }
48142   exports.convertLength = convertLength;
48143   /**
48144    * Converts a area to the requested unit.
48145    * Valid units: kilometers, kilometres, meters, metres, centimetres, millimeters, acres, miles, yards, feet, inches
48146    * @param {number} area to be converted
48147    * @param {Units} [originalUnit="meters"] of the distance
48148    * @param {Units} [finalUnit="kilometers"] returned unit
48149    * @returns {number} the converted distance
48150    */
48151   function convertArea(area, originalUnit, finalUnit) {
48152       if (originalUnit === void 0) { originalUnit = "meters"; }
48153       if (finalUnit === void 0) { finalUnit = "kilometers"; }
48154       if (!(area >= 0)) {
48155           throw new Error("area must be a positive number");
48156       }
48157       var startFactor = exports.areaFactors[originalUnit];
48158       if (!startFactor) {
48159           throw new Error("invalid original units");
48160       }
48161       var finalFactor = exports.areaFactors[finalUnit];
48162       if (!finalFactor) {
48163           throw new Error("invalid final units");
48164       }
48165       return (area / startFactor) * finalFactor;
48166   }
48167   exports.convertArea = convertArea;
48168   /**
48169    * isNumber
48170    *
48171    * @param {*} num Number to validate
48172    * @returns {boolean} true/false
48173    * @example
48174    * turf.isNumber(123)
48175    * //=true
48176    * turf.isNumber('foo')
48177    * //=false
48178    */
48179   function isNumber(num) {
48180       return !isNaN(num) && num !== null && !Array.isArray(num) && !/^\s*$/.test(num);
48181   }
48182   exports.isNumber = isNumber;
48183   /**
48184    * isObject
48185    *
48186    * @param {*} input variable to validate
48187    * @returns {boolean} true/false
48188    * @example
48189    * turf.isObject({elevation: 10})
48190    * //=true
48191    * turf.isObject('foo')
48192    * //=false
48193    */
48194   function isObject(input) {
48195       return (!!input) && (input.constructor === Object);
48196   }
48197   exports.isObject = isObject;
48198   /**
48199    * Validate BBox
48200    *
48201    * @private
48202    * @param {Array<number>} bbox BBox to validate
48203    * @returns {void}
48204    * @throws Error if BBox is not valid
48205    * @example
48206    * validateBBox([-180, -40, 110, 50])
48207    * //=OK
48208    * validateBBox([-180, -40])
48209    * //=Error
48210    * validateBBox('Foo')
48211    * //=Error
48212    * validateBBox(5)
48213    * //=Error
48214    * validateBBox(null)
48215    * //=Error
48216    * validateBBox(undefined)
48217    * //=Error
48218    */
48219   function validateBBox(bbox) {
48220       if (!bbox) {
48221           throw new Error("bbox is required");
48222       }
48223       if (!Array.isArray(bbox)) {
48224           throw new Error("bbox must be an Array");
48225       }
48226       if (bbox.length !== 4 && bbox.length !== 6) {
48227           throw new Error("bbox must be an Array of 4 or 6 numbers");
48228       }
48229       bbox.forEach(function (num) {
48230           if (!isNumber(num)) {
48231               throw new Error("bbox must only contain numbers");
48232           }
48233       });
48234   }
48235   exports.validateBBox = validateBBox;
48236   /**
48237    * Validate Id
48238    *
48239    * @private
48240    * @param {string|number} id Id to validate
48241    * @returns {void}
48242    * @throws Error if Id is not valid
48243    * @example
48244    * validateId([-180, -40, 110, 50])
48245    * //=Error
48246    * validateId([-180, -40])
48247    * //=Error
48248    * validateId('Foo')
48249    * //=OK
48250    * validateId(5)
48251    * //=OK
48252    * validateId(null)
48253    * //=Error
48254    * validateId(undefined)
48255    * //=Error
48256    */
48257   function validateId(id) {
48258       if (!id) {
48259           throw new Error("id is required");
48260       }
48261       if (["string", "number"].indexOf(typeof id) === -1) {
48262           throw new Error("id must be a number or a string");
48263       }
48264   }
48265   exports.validateId = validateId;
48266   // Deprecated methods
48267   function radians2degrees() {
48268       throw new Error("method has been renamed to `radiansToDegrees`");
48269   }
48270   exports.radians2degrees = radians2degrees;
48271   function degrees2radians() {
48272       throw new Error("method has been renamed to `degreesToRadians`");
48273   }
48274   exports.degrees2radians = degrees2radians;
48275   function distanceToDegrees() {
48276       throw new Error("method has been renamed to `lengthToDegrees`");
48277   }
48278   exports.distanceToDegrees = distanceToDegrees;
48279   function distanceToRadians() {
48280       throw new Error("method has been renamed to `lengthToRadians`");
48281   }
48282   exports.distanceToRadians = distanceToRadians;
48283   function radiansToDistance() {
48284       throw new Error("method has been renamed to `radiansToLength`");
48285   }
48286   exports.radiansToDistance = radiansToDistance;
48287   function bearingToAngle() {
48288       throw new Error("method has been renamed to `bearingToAzimuth`");
48289   }
48290   exports.bearingToAngle = bearingToAngle;
48291   function convertDistance() {
48292       throw new Error("method has been renamed to `convertLength`");
48293   }
48294   exports.convertDistance = convertDistance;
48295   });
48296
48297   unwrapExports(helpers);
48298   var helpers_1 = helpers.earthRadius;
48299   var helpers_2 = helpers.factors;
48300   var helpers_3 = helpers.unitsFactors;
48301   var helpers_4 = helpers.areaFactors;
48302   var helpers_5 = helpers.feature;
48303   var helpers_6 = helpers.geometry;
48304   var helpers_7 = helpers.point;
48305   var helpers_8 = helpers.points;
48306   var helpers_9 = helpers.polygon;
48307   var helpers_10 = helpers.polygons;
48308   var helpers_11 = helpers.lineString;
48309   var helpers_12 = helpers.lineStrings;
48310   var helpers_13 = helpers.featureCollection;
48311   var helpers_14 = helpers.multiLineString;
48312   var helpers_15 = helpers.multiPoint;
48313   var helpers_16 = helpers.multiPolygon;
48314   var helpers_17 = helpers.geometryCollection;
48315   var helpers_18 = helpers.round;
48316   var helpers_19 = helpers.radiansToLength;
48317   var helpers_20 = helpers.lengthToRadians;
48318   var helpers_21 = helpers.lengthToDegrees;
48319   var helpers_22 = helpers.bearingToAzimuth;
48320   var helpers_23 = helpers.radiansToDegrees;
48321   var helpers_24 = helpers.degreesToRadians;
48322   var helpers_25 = helpers.convertLength;
48323   var helpers_26 = helpers.convertArea;
48324   var helpers_27 = helpers.isNumber;
48325   var helpers_28 = helpers.isObject;
48326   var helpers_29 = helpers.validateBBox;
48327   var helpers_30 = helpers.validateId;
48328   var helpers_31 = helpers.radians2degrees;
48329   var helpers_32 = helpers.degrees2radians;
48330   var helpers_33 = helpers.distanceToDegrees;
48331   var helpers_34 = helpers.distanceToRadians;
48332   var helpers_35 = helpers.radiansToDistance;
48333   var helpers_36 = helpers.bearingToAngle;
48334   var helpers_37 = helpers.convertDistance;
48335
48336   var invariant = createCommonjsModule(function (module, exports) {
48337   Object.defineProperty(exports, "__esModule", { value: true });
48338
48339   /**
48340    * Unwrap a coordinate from a Point Feature, Geometry or a single coordinate.
48341    *
48342    * @name getCoord
48343    * @param {Array<number>|Geometry<Point>|Feature<Point>} coord GeoJSON Point or an Array of numbers
48344    * @returns {Array<number>} coordinates
48345    * @example
48346    * var pt = turf.point([10, 10]);
48347    *
48348    * var coord = turf.getCoord(pt);
48349    * //= [10, 10]
48350    */
48351   function getCoord(coord) {
48352       if (!coord) {
48353           throw new Error("coord is required");
48354       }
48355       if (!Array.isArray(coord)) {
48356           if (coord.type === "Feature" && coord.geometry !== null && coord.geometry.type === "Point") {
48357               return coord.geometry.coordinates;
48358           }
48359           if (coord.type === "Point") {
48360               return coord.coordinates;
48361           }
48362       }
48363       if (Array.isArray(coord) && coord.length >= 2 && !Array.isArray(coord[0]) && !Array.isArray(coord[1])) {
48364           return coord;
48365       }
48366       throw new Error("coord must be GeoJSON Point or an Array of numbers");
48367   }
48368   exports.getCoord = getCoord;
48369   /**
48370    * Unwrap coordinates from a Feature, Geometry Object or an Array
48371    *
48372    * @name getCoords
48373    * @param {Array<any>|Geometry|Feature} coords Feature, Geometry Object or an Array
48374    * @returns {Array<any>} coordinates
48375    * @example
48376    * var poly = turf.polygon([[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]);
48377    *
48378    * var coords = turf.getCoords(poly);
48379    * //= [[[119.32, -8.7], [119.55, -8.69], [119.51, -8.54], [119.32, -8.7]]]
48380    */
48381   function getCoords(coords) {
48382       if (Array.isArray(coords)) {
48383           return coords;
48384       }
48385       // Feature
48386       if (coords.type === "Feature") {
48387           if (coords.geometry !== null) {
48388               return coords.geometry.coordinates;
48389           }
48390       }
48391       else {
48392           // Geometry
48393           if (coords.coordinates) {
48394               return coords.coordinates;
48395           }
48396       }
48397       throw new Error("coords must be GeoJSON Feature, Geometry Object or an Array");
48398   }
48399   exports.getCoords = getCoords;
48400   /**
48401    * Checks if coordinates contains a number
48402    *
48403    * @name containsNumber
48404    * @param {Array<any>} coordinates GeoJSON Coordinates
48405    * @returns {boolean} true if Array contains a number
48406    */
48407   function containsNumber(coordinates) {
48408       if (coordinates.length > 1 && helpers.isNumber(coordinates[0]) && helpers.isNumber(coordinates[1])) {
48409           return true;
48410       }
48411       if (Array.isArray(coordinates[0]) && coordinates[0].length) {
48412           return containsNumber(coordinates[0]);
48413       }
48414       throw new Error("coordinates must only contain numbers");
48415   }
48416   exports.containsNumber = containsNumber;
48417   /**
48418    * Enforce expectations about types of GeoJSON objects for Turf.
48419    *
48420    * @name geojsonType
48421    * @param {GeoJSON} value any GeoJSON object
48422    * @param {string} type expected GeoJSON type
48423    * @param {string} name name of calling function
48424    * @throws {Error} if value is not the expected type.
48425    */
48426   function geojsonType(value, type, name) {
48427       if (!type || !name) {
48428           throw new Error("type and name required");
48429       }
48430       if (!value || value.type !== type) {
48431           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + value.type);
48432       }
48433   }
48434   exports.geojsonType = geojsonType;
48435   /**
48436    * Enforce expectations about types of {@link Feature} inputs for Turf.
48437    * Internally this uses {@link geojsonType} to judge geometry types.
48438    *
48439    * @name featureOf
48440    * @param {Feature} feature a feature with an expected geometry type
48441    * @param {string} type expected GeoJSON type
48442    * @param {string} name name of calling function
48443    * @throws {Error} error if value is not the expected type.
48444    */
48445   function featureOf(feature, type, name) {
48446       if (!feature) {
48447           throw new Error("No feature passed");
48448       }
48449       if (!name) {
48450           throw new Error(".featureOf() requires a name");
48451       }
48452       if (!feature || feature.type !== "Feature" || !feature.geometry) {
48453           throw new Error("Invalid input to " + name + ", Feature with geometry required");
48454       }
48455       if (!feature.geometry || feature.geometry.type !== type) {
48456           throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
48457       }
48458   }
48459   exports.featureOf = featureOf;
48460   /**
48461    * Enforce expectations about types of {@link FeatureCollection} inputs for Turf.
48462    * Internally this uses {@link geojsonType} to judge geometry types.
48463    *
48464    * @name collectionOf
48465    * @param {FeatureCollection} featureCollection a FeatureCollection for which features will be judged
48466    * @param {string} type expected GeoJSON type
48467    * @param {string} name name of calling function
48468    * @throws {Error} if value is not the expected type.
48469    */
48470   function collectionOf(featureCollection, type, name) {
48471       if (!featureCollection) {
48472           throw new Error("No featureCollection passed");
48473       }
48474       if (!name) {
48475           throw new Error(".collectionOf() requires a name");
48476       }
48477       if (!featureCollection || featureCollection.type !== "FeatureCollection") {
48478           throw new Error("Invalid input to " + name + ", FeatureCollection required");
48479       }
48480       for (var _i = 0, _a = featureCollection.features; _i < _a.length; _i++) {
48481           var feature = _a[_i];
48482           if (!feature || feature.type !== "Feature" || !feature.geometry) {
48483               throw new Error("Invalid input to " + name + ", Feature with geometry required");
48484           }
48485           if (!feature.geometry || feature.geometry.type !== type) {
48486               throw new Error("Invalid input to " + name + ": must be a " + type + ", given " + feature.geometry.type);
48487           }
48488       }
48489   }
48490   exports.collectionOf = collectionOf;
48491   /**
48492    * Get Geometry from Feature or Geometry Object
48493    *
48494    * @param {Feature|Geometry} geojson GeoJSON Feature or Geometry Object
48495    * @returns {Geometry|null} GeoJSON Geometry Object
48496    * @throws {Error} if geojson is not a Feature or Geometry Object
48497    * @example
48498    * var point = {
48499    *   "type": "Feature",
48500    *   "properties": {},
48501    *   "geometry": {
48502    *     "type": "Point",
48503    *     "coordinates": [110, 40]
48504    *   }
48505    * }
48506    * var geom = turf.getGeom(point)
48507    * //={"type": "Point", "coordinates": [110, 40]}
48508    */
48509   function getGeom(geojson) {
48510       if (geojson.type === "Feature") {
48511           return geojson.geometry;
48512       }
48513       return geojson;
48514   }
48515   exports.getGeom = getGeom;
48516   /**
48517    * Get GeoJSON object's type, Geometry type is prioritize.
48518    *
48519    * @param {GeoJSON} geojson GeoJSON object
48520    * @param {string} [name="geojson"] name of the variable to display in error message
48521    * @returns {string} GeoJSON type
48522    * @example
48523    * var point = {
48524    *   "type": "Feature",
48525    *   "properties": {},
48526    *   "geometry": {
48527    *     "type": "Point",
48528    *     "coordinates": [110, 40]
48529    *   }
48530    * }
48531    * var geom = turf.getType(point)
48532    * //="Point"
48533    */
48534   function getType(geojson, name) {
48535       if (geojson.type === "FeatureCollection") {
48536           return "FeatureCollection";
48537       }
48538       if (geojson.type === "GeometryCollection") {
48539           return "GeometryCollection";
48540       }
48541       if (geojson.type === "Feature" && geojson.geometry !== null) {
48542           return geojson.geometry.type;
48543       }
48544       return geojson.type;
48545   }
48546   exports.getType = getType;
48547   });
48548
48549   unwrapExports(invariant);
48550   var invariant_1 = invariant.getCoord;
48551   var invariant_2 = invariant.getCoords;
48552   var invariant_3 = invariant.containsNumber;
48553   var invariant_4 = invariant.geojsonType;
48554   var invariant_5 = invariant.featureOf;
48555   var invariant_6 = invariant.collectionOf;
48556   var invariant_7 = invariant.getGeom;
48557   var invariant_8 = invariant.getType;
48558
48559   var lineclip_1$1 = lineclip$1;
48560   var default_1$2 = lineclip$1;
48561
48562   lineclip$1.polyline = lineclip$1;
48563   lineclip$1.polygon = polygonclip$1;
48564
48565
48566   // Cohen-Sutherland line clippign algorithm, adapted to efficiently
48567   // handle polylines rather than just segments
48568
48569   function lineclip$1(points, bbox, result) {
48570
48571       var len = points.length,
48572           codeA = bitCode$1(points[0], bbox),
48573           part = [],
48574           i, a, b, codeB, lastCode;
48575
48576       if (!result) result = [];
48577
48578       for (i = 1; i < len; i++) {
48579           a = points[i - 1];
48580           b = points[i];
48581           codeB = lastCode = bitCode$1(b, bbox);
48582
48583           while (true) {
48584
48585               if (!(codeA | codeB)) { // accept
48586                   part.push(a);
48587
48588                   if (codeB !== lastCode) { // segment went outside
48589                       part.push(b);
48590
48591                       if (i < len - 1) { // start a new line
48592                           result.push(part);
48593                           part = [];
48594                       }
48595                   } else if (i === len - 1) {
48596                       part.push(b);
48597                   }
48598                   break;
48599
48600               } else if (codeA & codeB) { // trivial reject
48601                   break;
48602
48603               } else if (codeA) { // a outside, intersect with clip edge
48604                   a = intersect$2(a, b, codeA, bbox);
48605                   codeA = bitCode$1(a, bbox);
48606
48607               } else { // b outside
48608                   b = intersect$2(a, b, codeB, bbox);
48609                   codeB = bitCode$1(b, bbox);
48610               }
48611           }
48612
48613           codeA = lastCode;
48614       }
48615
48616       if (part.length) result.push(part);
48617
48618       return result;
48619   }
48620
48621   // Sutherland-Hodgeman polygon clipping algorithm
48622
48623   function polygonclip$1(points, bbox) {
48624
48625       var result, edge, prev, prevInside, i, p, inside;
48626
48627       // clip against each side of the clip rectangle
48628       for (edge = 1; edge <= 8; edge *= 2) {
48629           result = [];
48630           prev = points[points.length - 1];
48631           prevInside = !(bitCode$1(prev, bbox) & edge);
48632
48633           for (i = 0; i < points.length; i++) {
48634               p = points[i];
48635               inside = !(bitCode$1(p, bbox) & edge);
48636
48637               // if segment goes through the clip window, add an intersection
48638               if (inside !== prevInside) result.push(intersect$2(prev, p, edge, bbox));
48639
48640               if (inside) result.push(p); // add a point if it's inside
48641
48642               prev = p;
48643               prevInside = inside;
48644           }
48645
48646           points = result;
48647
48648           if (!points.length) break;
48649       }
48650
48651       return result;
48652   }
48653
48654   // intersect a segment against one of the 4 lines that make up the bbox
48655
48656   function intersect$2(a, b, edge, bbox) {
48657       return edge & 8 ? [a[0] + (b[0] - a[0]) * (bbox[3] - a[1]) / (b[1] - a[1]), bbox[3]] : // top
48658              edge & 4 ? [a[0] + (b[0] - a[0]) * (bbox[1] - a[1]) / (b[1] - a[1]), bbox[1]] : // bottom
48659              edge & 2 ? [bbox[2], a[1] + (b[1] - a[1]) * (bbox[2] - a[0]) / (b[0] - a[0])] : // right
48660              edge & 1 ? [bbox[0], a[1] + (b[1] - a[1]) * (bbox[0] - a[0]) / (b[0] - a[0])] : // left
48661              null;
48662   }
48663
48664   // bit code reflects the point position relative to the bbox:
48665
48666   //         left  mid  right
48667   //    top  1001  1000  1010
48668   //    mid  0001  0000  0010
48669   // bottom  0101  0100  0110
48670
48671   function bitCode$1(p, bbox) {
48672       var code = 0;
48673
48674       if (p[0] < bbox[0]) code |= 1; // left
48675       else if (p[0] > bbox[2]) code |= 2; // right
48676
48677       if (p[1] < bbox[1]) code |= 4; // bottom
48678       else if (p[1] > bbox[3]) code |= 8; // top
48679
48680       return code;
48681   }
48682   lineclip_1$1.default = default_1$2;
48683
48684   var bboxClip_1 = createCommonjsModule(function (module, exports) {
48685   var __importStar = (commonjsGlobal && commonjsGlobal.__importStar) || function (mod) {
48686       if (mod && mod.__esModule) return mod;
48687       var result = {};
48688       if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
48689       result["default"] = mod;
48690       return result;
48691   };
48692   Object.defineProperty(exports, "__esModule", { value: true });
48693
48694
48695   var lineclip = __importStar(lineclip_1$1);
48696   /**
48697    * Takes a {@link Feature} and a bbox and clips the feature to the bbox using
48698    * [lineclip](https://github.com/mapbox/lineclip).
48699    * May result in degenerate edges when clipping Polygons.
48700    *
48701    * @name bboxClip
48702    * @param {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} feature feature to clip to the bbox
48703    * @param {BBox} bbox extent in [minX, minY, maxX, maxY] order
48704    * @returns {Feature<LineString|MultiLineString|Polygon|MultiPolygon>} clipped Feature
48705    * @example
48706    * var bbox = [0, 0, 10, 10];
48707    * var poly = turf.polygon([[[2, 2], [8, 4], [12, 8], [3, 7], [2, 2]]]);
48708    *
48709    * var clipped = turf.bboxClip(poly, bbox);
48710    *
48711    * //addToMap
48712    * var addToMap = [bbox, poly, clipped]
48713    */
48714   function bboxClip(feature, bbox) {
48715       var geom = invariant.getGeom(feature);
48716       var type = geom.type;
48717       var properties = feature.type === "Feature" ? feature.properties : {};
48718       var coords = geom.coordinates;
48719       switch (type) {
48720           case "LineString":
48721           case "MultiLineString":
48722               var lines_1 = [];
48723               if (type === "LineString") {
48724                   coords = [coords];
48725               }
48726               coords.forEach(function (line) {
48727                   lineclip.polyline(line, bbox, lines_1);
48728               });
48729               if (lines_1.length === 1) {
48730                   return helpers.lineString(lines_1[0], properties);
48731               }
48732               return helpers.multiLineString(lines_1, properties);
48733           case "Polygon":
48734               return helpers.polygon(clipPolygon(coords, bbox), properties);
48735           case "MultiPolygon":
48736               return helpers.multiPolygon(coords.map(function (poly) {
48737                   return clipPolygon(poly, bbox);
48738               }), properties);
48739           default:
48740               throw new Error("geometry " + type + " not supported");
48741       }
48742   }
48743   exports.default = bboxClip;
48744   function clipPolygon(rings, bbox) {
48745       var outRings = [];
48746       for (var _i = 0, rings_1 = rings; _i < rings_1.length; _i++) {
48747           var ring = rings_1[_i];
48748           var clipped = lineclip.polygon(ring, bbox);
48749           if (clipped.length > 0) {
48750               if (clipped[0][0] !== clipped[clipped.length - 1][0] || clipped[0][1] !== clipped[clipped.length - 1][1]) {
48751                   clipped.push(clipped[0]);
48752               }
48753               if (clipped.length >= 4) {
48754                   outRings.push(clipped);
48755               }
48756           }
48757       }
48758       return outRings;
48759   }
48760   });
48761
48762   var turf_bboxClip = unwrapExports(bboxClip_1);
48763
48764   var martinez_umd = createCommonjsModule(function (module, exports) {
48765   /**
48766    * martinez v0.5.0
48767    * Martinez polygon clipping algorithm, does boolean operation on polygons (multipolygons, polygons with holes etc): intersection, union, difference, xor
48768    *
48769    * @author Alex Milevski <info@w8r.name>
48770    * @license MIT
48771    * @preserve
48772    */
48773
48774   (function (global, factory) {
48775     factory(exports);
48776   }(commonjsGlobal, (function (exports) {
48777     function DEFAULT_COMPARE (a, b) { return a > b ? 1 : a < b ? -1 : 0; }
48778
48779     var SplayTree = function SplayTree(compare, noDuplicates) {
48780       if ( compare === void 0 ) compare = DEFAULT_COMPARE;
48781       if ( noDuplicates === void 0 ) noDuplicates = false;
48782
48783       this._compare = compare;
48784       this._root = null;
48785       this._size = 0;
48786       this._noDuplicates = !!noDuplicates;
48787     };
48788
48789     var prototypeAccessors = { size: { configurable: true } };
48790
48791
48792     SplayTree.prototype.rotateLeft = function rotateLeft (x) {
48793       var y = x.right;
48794       if (y) {
48795         x.right = y.left;
48796         if (y.left) { y.left.parent = x; }
48797         y.parent = x.parent;
48798       }
48799
48800       if (!x.parent)              { this._root = y; }
48801       else if (x === x.parent.left) { x.parent.left = y; }
48802       else                        { x.parent.right = y; }
48803       if (y) { y.left = x; }
48804       x.parent = y;
48805     };
48806
48807
48808     SplayTree.prototype.rotateRight = function rotateRight (x) {
48809       var y = x.left;
48810       if (y) {
48811         x.left = y.right;
48812         if (y.right) { y.right.parent = x; }
48813         y.parent = x.parent;
48814       }
48815
48816       if (!x.parent)             { this._root = y; }
48817       else if(x === x.parent.left) { x.parent.left = y; }
48818       else                       { x.parent.right = y; }
48819       if (y) { y.right = x; }
48820       x.parent = y;
48821     };
48822
48823
48824     SplayTree.prototype._splay = function _splay (x) {
48825         var this$1 = this;
48826
48827       while (x.parent) {
48828         var p = x.parent;
48829         if (!p.parent) {
48830           if (p.left === x) { this$1.rotateRight(p); }
48831           else            { this$1.rotateLeft(p); }
48832         } else if (p.left === x && p.parent.left === p) {
48833           this$1.rotateRight(p.parent);
48834           this$1.rotateRight(p);
48835         } else if (p.right === x && p.parent.right === p) {
48836           this$1.rotateLeft(p.parent);
48837           this$1.rotateLeft(p);
48838         } else if (p.left === x && p.parent.right === p) {
48839           this$1.rotateRight(p);
48840           this$1.rotateLeft(p);
48841         } else {
48842           this$1.rotateLeft(p);
48843           this$1.rotateRight(p);
48844         }
48845       }
48846     };
48847
48848
48849     SplayTree.prototype.splay = function splay (x) {
48850         var this$1 = this;
48851
48852       var p, gp, ggp, l, r;
48853
48854       while (x.parent) {
48855         p = x.parent;
48856         gp = p.parent;
48857
48858         if (gp && gp.parent) {
48859           ggp = gp.parent;
48860           if (ggp.left === gp) { ggp.left= x; }
48861           else               { ggp.right = x; }
48862           x.parent = ggp;
48863         } else {
48864           x.parent = null;
48865           this$1._root = x;
48866         }
48867
48868         l = x.left; r = x.right;
48869
48870         if (x === p.left) { // left
48871           if (gp) {
48872             if (gp.left === p) {
48873               /* zig-zig */
48874               if (p.right) {
48875                 gp.left = p.right;
48876                 gp.left.parent = gp;
48877               } else { gp.left = null; }
48878
48879               p.right = gp;
48880               gp.parent = p;
48881             } else {
48882               /* zig-zag */
48883               if (l) {
48884                 gp.right = l;
48885                 l.parent = gp;
48886               } else { gp.right = null; }
48887
48888               x.left  = gp;
48889               gp.parent = x;
48890             }
48891           }
48892           if (r) {
48893             p.left = r;
48894             r.parent = p;
48895           } else { p.left = null; }
48896
48897           x.right= p;
48898           p.parent = x;
48899         } else { // right
48900           if (gp) {
48901             if (gp.right === p) {
48902               /* zig-zig */
48903               if (p.left) {
48904                 gp.right = p.left;
48905                 gp.right.parent = gp;
48906               } else { gp.right = null; }
48907
48908               p.left = gp;
48909               gp.parent = p;
48910             } else {
48911               /* zig-zag */
48912               if (r) {
48913                 gp.left = r;
48914                 r.parent = gp;
48915               } else { gp.left = null; }
48916
48917               x.right = gp;
48918               gp.parent = x;
48919             }
48920           }
48921           if (l) {
48922             p.right = l;
48923             l.parent = p;
48924           } else { p.right = null; }
48925
48926           x.left = p;
48927           p.parent = x;
48928         }
48929       }
48930     };
48931
48932
48933     SplayTree.prototype.replace = function replace (u, v) {
48934       if (!u.parent) { this._root = v; }
48935       else if (u === u.parent.left) { u.parent.left = v; }
48936       else { u.parent.right = v; }
48937       if (v) { v.parent = u.parent; }
48938     };
48939
48940
48941     SplayTree.prototype.minNode = function minNode (u) {
48942         if ( u === void 0 ) u = this._root;
48943
48944       if (u) { while (u.left) { u = u.left; } }
48945       return u;
48946     };
48947
48948
48949     SplayTree.prototype.maxNode = function maxNode (u) {
48950         if ( u === void 0 ) u = this._root;
48951
48952       if (u) { while (u.right) { u = u.right; } }
48953       return u;
48954     };
48955
48956
48957     SplayTree.prototype.insert = function insert (key, data) {
48958       var z = this._root;
48959       var p = null;
48960       var comp = this._compare;
48961       var cmp;
48962
48963       if (this._noDuplicates) {
48964         while (z) {
48965           p = z;
48966           cmp = comp(z.key, key);
48967           if (cmp === 0) { return; }
48968           else if (comp(z.key, key) < 0) { z = z.right; }
48969           else { z = z.left; }
48970         }
48971       } else {
48972         while (z) {
48973           p = z;
48974           if (comp(z.key, key) < 0) { z = z.right; }
48975           else { z = z.left; }
48976         }
48977       }
48978
48979       z = { key: key, data: data, left: null, right: null, parent: p };
48980
48981       if (!p)                        { this._root = z; }
48982       else if (comp(p.key, z.key) < 0) { p.right = z; }
48983       else                           { p.left= z; }
48984
48985       this.splay(z);
48986       this._size++;
48987       return z;
48988     };
48989
48990
48991     SplayTree.prototype.find = function find (key) {
48992       var z  = this._root;
48993       var comp = this._compare;
48994       while (z) {
48995         var cmp = comp(z.key, key);
48996         if    (cmp < 0) { z = z.right; }
48997         else if (cmp > 0) { z = z.left; }
48998         else            { return z; }
48999       }
49000       return null;
49001     };
49002
49003     /**
49004      * Whether the tree contains a node with the given key
49005      * @param{Key} key
49006      * @return {boolean} true/false
49007      */
49008     SplayTree.prototype.contains = function contains (key) {
49009       var node     = this._root;
49010       var comparator = this._compare;
49011       while (node){
49012         var cmp = comparator(key, node.key);
49013         if    (cmp === 0) { return true; }
49014         else if (cmp < 0) { node = node.left; }
49015         else              { node = node.right; }
49016       }
49017
49018       return false;
49019     };
49020
49021
49022     SplayTree.prototype.remove = function remove (key) {
49023       var z = this.find(key);
49024
49025       if (!z) { return false; }
49026
49027       this.splay(z);
49028
49029       if (!z.left) { this.replace(z, z.right); }
49030       else if (!z.right) { this.replace(z, z.left); }
49031       else {
49032         var y = this.minNode(z.right);
49033         if (y.parent !== z) {
49034           this.replace(y, y.right);
49035           y.right = z.right;
49036           y.right.parent = y;
49037         }
49038         this.replace(z, y);
49039         y.left = z.left;
49040         y.left.parent = y;
49041       }
49042
49043       this._size--;
49044       return true;
49045     };
49046
49047
49048     SplayTree.prototype.removeNode = function removeNode (z) {
49049       if (!z) { return false; }
49050
49051       this.splay(z);
49052
49053       if (!z.left) { this.replace(z, z.right); }
49054       else if (!z.right) { this.replace(z, z.left); }
49055       else {
49056         var y = this.minNode(z.right);
49057         if (y.parent !== z) {
49058           this.replace(y, y.right);
49059           y.right = z.right;
49060           y.right.parent = y;
49061         }
49062         this.replace(z, y);
49063         y.left = z.left;
49064         y.left.parent = y;
49065       }
49066
49067       this._size--;
49068       return true;
49069     };
49070
49071
49072     SplayTree.prototype.erase = function erase (key) {
49073       var z = this.find(key);
49074       if (!z) { return; }
49075
49076       this.splay(z);
49077
49078       var s = z.left;
49079       var t = z.right;
49080
49081       var sMax = null;
49082       if (s) {
49083         s.parent = null;
49084         sMax = this.maxNode(s);
49085         this.splay(sMax);
49086         this._root = sMax;
49087       }
49088       if (t) {
49089         if (s) { sMax.right = t; }
49090         else { this._root = t; }
49091         t.parent = sMax;
49092       }
49093
49094       this._size--;
49095     };
49096
49097     /**
49098      * Removes and returns the node with smallest key
49099      * @return {?Node}
49100      */
49101     SplayTree.prototype.pop = function pop () {
49102       var node = this._root, returnValue = null;
49103       if (node) {
49104         while (node.left) { node = node.left; }
49105         returnValue = { key: node.key, data: node.data };
49106         this.remove(node.key);
49107       }
49108       return returnValue;
49109     };
49110
49111
49112     /* eslint-disable class-methods-use-this */
49113
49114     /**
49115      * Successor node
49116      * @param{Node} node
49117      * @return {?Node}
49118      */
49119     SplayTree.prototype.next = function next (node) {
49120       var successor = node;
49121       if (successor) {
49122         if (successor.right) {
49123           successor = successor.right;
49124           while (successor && successor.left) { successor = successor.left; }
49125         } else {
49126           successor = node.parent;
49127           while (successor && successor.right === node) {
49128             node = successor; successor = successor.parent;
49129           }
49130         }
49131       }
49132       return successor;
49133     };
49134
49135
49136     /**
49137      * Predecessor node
49138      * @param{Node} node
49139      * @return {?Node}
49140      */
49141     SplayTree.prototype.prev = function prev (node) {
49142       var predecessor = node;
49143       if (predecessor) {
49144         if (predecessor.left) {
49145           predecessor = predecessor.left;
49146           while (predecessor && predecessor.right) { predecessor = predecessor.right; }
49147         } else {
49148           predecessor = node.parent;
49149           while (predecessor && predecessor.left === node) {
49150             node = predecessor;
49151             predecessor = predecessor.parent;
49152           }
49153         }
49154       }
49155       return predecessor;
49156     };
49157     /* eslint-enable class-methods-use-this */
49158
49159
49160     /**
49161      * @param{forEachCallback} callback
49162      * @return {SplayTree}
49163      */
49164     SplayTree.prototype.forEach = function forEach (callback) {
49165       var current = this._root;
49166       var s = [], done = false, i = 0;
49167
49168       while (!done) {
49169         // Reach the left most Node of the current Node
49170         if (current) {
49171           // Place pointer to a tree node on the stack
49172           // before traversing the node's left subtree
49173           s.push(current);
49174           current = current.left;
49175         } else {
49176           // BackTrack from the empty subtree and visit the Node
49177           // at the top of the stack; however, if the stack is
49178           // empty you are done
49179           if (s.length > 0) {
49180             current = s.pop();
49181             callback(current, i++);
49182
49183             // We have visited the node and its left
49184             // subtree. Now, it's right subtree's turn
49185             current = current.right;
49186           } else { done = true; }
49187         }
49188       }
49189       return this;
49190     };
49191
49192
49193     /**
49194      * Walk key range from `low` to `high`. Stops if `fn` returns a value.
49195      * @param{Key}    low
49196      * @param{Key}    high
49197      * @param{Function} fn
49198      * @param{*?}     ctx
49199      * @return {SplayTree}
49200      */
49201     SplayTree.prototype.range = function range (low, high, fn, ctx) {
49202         var this$1 = this;
49203
49204       var Q = [];
49205       var compare = this._compare;
49206       var node = this._root, cmp;
49207
49208       while (Q.length !== 0 || node) {
49209         if (node) {
49210           Q.push(node);
49211           node = node.left;
49212         } else {
49213           node = Q.pop();
49214           cmp = compare(node.key, high);
49215           if (cmp > 0) {
49216             break;
49217           } else if (compare(node.key, low) >= 0) {
49218             if (fn.call(ctx, node)) { return this$1; } // stop if smth is returned
49219           }
49220           node = node.right;
49221         }
49222       }
49223       return this;
49224     };
49225
49226     /**
49227      * Returns all keys in order
49228      * @return {Array<Key>}
49229      */
49230     SplayTree.prototype.keys = function keys () {
49231       var current = this._root;
49232       var s = [], r = [], done = false;
49233
49234       while (!done) {
49235         if (current) {
49236           s.push(current);
49237           current = current.left;
49238         } else {
49239           if (s.length > 0) {
49240             current = s.pop();
49241             r.push(current.key);
49242             current = current.right;
49243           } else { done = true; }
49244         }
49245       }
49246       return r;
49247     };
49248
49249
49250     /**
49251      * Returns `data` fields of all nodes in order.
49252      * @return {Array<Value>}
49253      */
49254     SplayTree.prototype.values = function values () {
49255       var current = this._root;
49256       var s = [], r = [], done = false;
49257
49258       while (!done) {
49259         if (current) {
49260           s.push(current);
49261           current = current.left;
49262         } else {
49263           if (s.length > 0) {
49264             current = s.pop();
49265             r.push(current.data);
49266             current = current.right;
49267           } else { done = true; }
49268         }
49269       }
49270       return r;
49271     };
49272
49273
49274     /**
49275      * Returns node at given index
49276      * @param{number} index
49277      * @return {?Node}
49278      */
49279     SplayTree.prototype.at = function at (index) {
49280       // removed after a consideration, more misleading than useful
49281       // index = index % this.size;
49282       // if (index < 0) index = this.size - index;
49283
49284       var current = this._root;
49285       var s = [], done = false, i = 0;
49286
49287       while (!done) {
49288         if (current) {
49289           s.push(current);
49290           current = current.left;
49291         } else {
49292           if (s.length > 0) {
49293             current = s.pop();
49294             if (i === index) { return current; }
49295             i++;
49296             current = current.right;
49297           } else { done = true; }
49298         }
49299       }
49300       return null;
49301     };
49302
49303     /**
49304      * Bulk-load items. Both array have to be same size
49305      * @param{Array<Key>}  keys
49306      * @param{Array<Value>}[values]
49307      * @param{Boolean}     [presort=false] Pre-sort keys and values, using
49308      *                                       tree's comparator. Sorting is done
49309      *                                       in-place
49310      * @return {AVLTree}
49311      */
49312     SplayTree.prototype.load = function load (keys, values, presort) {
49313         if ( keys === void 0 ) keys = [];
49314         if ( values === void 0 ) values = [];
49315         if ( presort === void 0 ) presort = false;
49316
49317       if (this._size !== 0) { throw new Error('bulk-load: tree is not empty'); }
49318       var size = keys.length;
49319       if (presort) { sort(keys, values, 0, size - 1, this._compare); }
49320       this._root = loadRecursive(null, keys, values, 0, size);
49321       this._size = size;
49322       return this;
49323     };
49324
49325
49326     SplayTree.prototype.min = function min () {
49327       var node = this.minNode(this._root);
49328       if (node) { return node.key; }
49329       else    { return null; }
49330     };
49331
49332
49333     SplayTree.prototype.max = function max () {
49334       var node = this.maxNode(this._root);
49335       if (node) { return node.key; }
49336       else    { return null; }
49337     };
49338
49339     SplayTree.prototype.isEmpty = function isEmpty () { return this._root === null; };
49340     prototypeAccessors.size.get = function () { return this._size; };
49341
49342
49343     /**
49344      * Create a tree and load it with items
49345      * @param{Array<Key>}        keys
49346      * @param{Array<Value>?}      [values]
49347
49348      * @param{Function?}          [comparator]
49349      * @param{Boolean?}           [presort=false] Pre-sort keys and values, using
49350      *                                             tree's comparator. Sorting is done
49351      *                                             in-place
49352      * @param{Boolean?}           [noDuplicates=false] Allow duplicates
49353      * @return {SplayTree}
49354      */
49355     SplayTree.createTree = function createTree (keys, values, comparator, presort, noDuplicates) {
49356       return new SplayTree(comparator, noDuplicates).load(keys, values, presort);
49357     };
49358
49359     Object.defineProperties( SplayTree.prototype, prototypeAccessors );
49360
49361
49362     function loadRecursive (parent, keys, values, start, end) {
49363       var size = end - start;
49364       if (size > 0) {
49365         var middle = start + Math.floor(size / 2);
49366         var key    = keys[middle];
49367         var data   = values[middle];
49368         var node   = { key: key, data: data, parent: parent };
49369         node.left    = loadRecursive(node, keys, values, start, middle);
49370         node.right   = loadRecursive(node, keys, values, middle + 1, end);
49371         return node;
49372       }
49373       return null;
49374     }
49375
49376
49377     function sort(keys, values, left, right, compare) {
49378       if (left >= right) { return; }
49379
49380       var pivot = keys[(left + right) >> 1];
49381       var i = left - 1;
49382       var j = right + 1;
49383
49384       while (true) {
49385         do { i++; } while (compare(keys[i], pivot) < 0);
49386         do { j--; } while (compare(keys[j], pivot) > 0);
49387         if (i >= j) { break; }
49388
49389         var tmp = keys[i];
49390         keys[i] = keys[j];
49391         keys[j] = tmp;
49392
49393         tmp = values[i];
49394         values[i] = values[j];
49395         values[j] = tmp;
49396       }
49397
49398       sort(keys, values,  left,     j, compare);
49399       sort(keys, values, j + 1, right, compare);
49400     }
49401
49402     var NORMAL               = 0;
49403     var NON_CONTRIBUTING     = 1;
49404     var SAME_TRANSITION      = 2;
49405     var DIFFERENT_TRANSITION = 3;
49406
49407     var INTERSECTION = 0;
49408     var UNION        = 1;
49409     var DIFFERENCE   = 2;
49410     var XOR          = 3;
49411
49412     /**
49413      * @param  {SweepEvent} event
49414      * @param  {SweepEvent} prev
49415      * @param  {Operation} operation
49416      */
49417     function computeFields (event, prev, operation) {
49418       // compute inOut and otherInOut fields
49419       if (prev === null) {
49420         event.inOut      = false;
49421         event.otherInOut = true;
49422
49423       // previous line segment in sweepline belongs to the same polygon
49424       } else {
49425         if (event.isSubject === prev.isSubject) {
49426           event.inOut      = !prev.inOut;
49427           event.otherInOut = prev.otherInOut;
49428
49429         // previous line segment in sweepline belongs to the clipping polygon
49430         } else {
49431           event.inOut      = !prev.otherInOut;
49432           event.otherInOut = prev.isVertical() ? !prev.inOut : prev.inOut;
49433         }
49434
49435         // compute prevInResult field
49436         if (prev) {
49437           event.prevInResult = (!inResult(prev, operation) || prev.isVertical())
49438             ? prev.prevInResult : prev;
49439         }
49440       }
49441
49442       // check if the line segment belongs to the Boolean operation
49443       event.inResult = inResult(event, operation);
49444     }
49445
49446
49447     /* eslint-disable indent */
49448     function inResult(event, operation) {
49449       switch (event.type) {
49450         case NORMAL:
49451           switch (operation) {
49452             case INTERSECTION:
49453               return !event.otherInOut;
49454             case UNION:
49455               return event.otherInOut;
49456             case DIFFERENCE:
49457               // return (event.isSubject && !event.otherInOut) ||
49458               //         (!event.isSubject && event.otherInOut);
49459               return (event.isSubject && event.otherInOut) ||
49460                       (!event.isSubject && !event.otherInOut);
49461             case XOR:
49462               return true;
49463           }
49464           break;
49465         case SAME_TRANSITION:
49466           return operation === INTERSECTION || operation === UNION;
49467         case DIFFERENT_TRANSITION:
49468           return operation === DIFFERENCE;
49469         case NON_CONTRIBUTING:
49470           return false;
49471       }
49472       return false;
49473     }
49474     /* eslint-enable indent */
49475
49476     var SweepEvent = function SweepEvent (point, left, otherEvent, isSubject, edgeType) {
49477
49478       /**
49479        * Is left endpoint?
49480        * @type {Boolean}
49481        */
49482       this.left = left;
49483
49484       /**
49485        * @type {Array.<Number>}
49486        */
49487       this.point = point;
49488
49489       /**
49490        * Other edge reference
49491        * @type {SweepEvent}
49492        */
49493       this.otherEvent = otherEvent;
49494
49495       /**
49496        * Belongs to source or clipping polygon
49497        * @type {Boolean}
49498        */
49499       this.isSubject = isSubject;
49500
49501       /**
49502        * Edge contribution type
49503        * @type {Number}
49504        */
49505       this.type = edgeType || NORMAL;
49506
49507
49508       /**
49509        * In-out transition for the sweepline crossing polygon
49510        * @type {Boolean}
49511        */
49512       this.inOut = false;
49513
49514
49515       /**
49516        * @type {Boolean}
49517        */
49518       this.otherInOut = false;
49519
49520       /**
49521        * Previous event in result?
49522        * @type {SweepEvent}
49523        */
49524       this.prevInResult = null;
49525
49526       /**
49527        * Does event belong to result?
49528        * @type {Boolean}
49529        */
49530       this.inResult = false;
49531
49532
49533       // connection step
49534
49535       /**
49536        * @type {Boolean}
49537        */
49538       this.resultInOut = false;
49539
49540       this.isExteriorRing = true;
49541     };
49542
49543
49544     /**
49545      * @param{Array.<Number>}p
49546      * @return {Boolean}
49547      */
49548     SweepEvent.prototype.isBelow = function isBelow (p) {
49549       var p0 = this.point, p1 = this.otherEvent.point;
49550       return this.left
49551         ? (p0[0] - p[0]) * (p1[1] - p[1]) - (p1[0] - p[0]) * (p0[1] - p[1]) > 0
49552         // signedArea(this.point, this.otherEvent.point, p) > 0 :
49553         : (p1[0] - p[0]) * (p0[1] - p[1]) - (p0[0] - p[0]) * (p1[1] - p[1]) > 0;
49554         //signedArea(this.otherEvent.point, this.point, p) > 0;
49555     };
49556
49557
49558     /**
49559      * @param{Array.<Number>}p
49560      * @return {Boolean}
49561      */
49562     SweepEvent.prototype.isAbove = function isAbove (p) {
49563       return !this.isBelow(p);
49564     };
49565
49566
49567     /**
49568      * @return {Boolean}
49569      */
49570     SweepEvent.prototype.isVertical = function isVertical () {
49571       return this.point[0] === this.otherEvent.point[0];
49572     };
49573
49574
49575     SweepEvent.prototype.clone = function clone () {
49576       var copy = new SweepEvent(
49577         this.point, this.left, this.otherEvent, this.isSubject, this.type);
49578
49579       copy.inResult     = this.inResult;
49580       copy.prevInResult = this.prevInResult;
49581       copy.isExteriorRing = this.isExteriorRing;
49582       copy.inOut        = this.inOut;
49583       copy.otherInOut   = this.otherInOut;
49584
49585       return copy;
49586     };
49587
49588     function equals(p1, p2) {
49589       if (p1[0] === p2[0]) {
49590         if (p1[1] === p2[1]) {
49591           return true;
49592         } else {
49593           return false;
49594         }
49595       }
49596       return false;
49597     }
49598
49599     // const EPSILON = 1e-9;
49600     // const abs = Math.abs;
49601     // TODO https://github.com/w8r/martinez/issues/6#issuecomment-262847164
49602     // Precision problem.
49603     //
49604     // module.exports = function equals(p1, p2) {
49605     //   return abs(p1[0] - p2[0]) <= EPSILON && abs(p1[1] - p2[1]) <= EPSILON;
49606     // };
49607
49608     /**
49609      * Signed area of the triangle (p0, p1, p2)
49610      * @param  {Array.<Number>} p0
49611      * @param  {Array.<Number>} p1
49612      * @param  {Array.<Number>} p2
49613      * @return {Number}
49614      */
49615     function signedArea(p0, p1, p2) {
49616       return (p0[0] - p2[0]) * (p1[1] - p2[1]) - (p1[0] - p2[0]) * (p0[1] - p2[1]);
49617     }
49618
49619     /**
49620      * @param  {SweepEvent} e1
49621      * @param  {SweepEvent} e2
49622      * @return {Number}
49623      */
49624     function compareEvents(e1, e2) {
49625       var p1 = e1.point;
49626       var p2 = e2.point;
49627
49628       // Different x-coordinate
49629       if (p1[0] > p2[0]) { return 1; }
49630       if (p1[0] < p2[0]) { return -1; }
49631
49632       // Different points, but same x-coordinate
49633       // Event with lower y-coordinate is processed first
49634       if (p1[1] !== p2[1]) { return p1[1] > p2[1] ? 1 : -1; }
49635
49636       return specialCases(e1, e2, p1, p2);
49637     }
49638
49639
49640     /* eslint-disable no-unused-vars */
49641     function specialCases(e1, e2, p1, p2) {
49642       // Same coordinates, but one is a left endpoint and the other is
49643       // a right endpoint. The right endpoint is processed first
49644       if (e1.left !== e2.left)
49645         { return e1.left ? 1 : -1; }
49646
49647       // const p2 = e1.otherEvent.point, p3 = e2.otherEvent.point;
49648       // const sa = (p1[0] - p3[0]) * (p2[1] - p3[1]) - (p2[0] - p3[0]) * (p1[1] - p3[1])
49649       // Same coordinates, both events
49650       // are left endpoints or right endpoints.
49651       // not collinear
49652       if (signedArea(p1, e1.otherEvent.point, e2.otherEvent.point) !== 0) {
49653         // the event associate to the bottom segment is processed first
49654         return (!e1.isBelow(e2.otherEvent.point)) ? 1 : -1;
49655       }
49656
49657       return (!e1.isSubject && e2.isSubject) ? 1 : -1;
49658     }
49659     /* eslint-enable no-unused-vars */
49660
49661     /**
49662      * @param  {SweepEvent} se
49663      * @param  {Array.<Number>} p
49664      * @param  {Queue} queue
49665      * @return {Queue}
49666      */
49667     function divideSegment(se, p, queue)  {
49668       var r = new SweepEvent(p, false, se,            se.isSubject);
49669       var l = new SweepEvent(p, true,  se.otherEvent, se.isSubject);
49670
49671       /* eslint-disable no-console */
49672       if (equals(se.point, se.otherEvent.point)) {
49673
49674         console.warn('what is that, a collapsed segment?', se);
49675       }
49676       /* eslint-enable no-console */
49677
49678       r.contourId = l.contourId = se.contourId;
49679
49680       // avoid a rounding error. The left event would be processed after the right event
49681       if (compareEvents(l, se.otherEvent) > 0) {
49682         se.otherEvent.left = true;
49683         l.left = false;
49684       }
49685
49686       // avoid a rounding error. The left event would be processed after the right event
49687       // if (compareEvents(se, r) > 0) {}
49688
49689       se.otherEvent.otherEvent = l;
49690       se.otherEvent = r;
49691
49692       queue.push(l);
49693       queue.push(r);
49694
49695       return queue;
49696     }
49697
49698     //const EPS = 1e-9;
49699
49700     /**
49701      * Finds the magnitude of the cross product of two vectors (if we pretend
49702      * they're in three dimensions)
49703      *
49704      * @param {Object} a First vector
49705      * @param {Object} b Second vector
49706      * @private
49707      * @returns {Number} The magnitude of the cross product
49708      */
49709     function crossProduct(a, b) {
49710       return (a[0] * b[1]) - (a[1] * b[0]);
49711     }
49712
49713     /**
49714      * Finds the dot product of two vectors.
49715      *
49716      * @param {Object} a First vector
49717      * @param {Object} b Second vector
49718      * @private
49719      * @returns {Number} The dot product
49720      */
49721     function dotProduct(a, b) {
49722       return (a[0] * b[0]) + (a[1] * b[1]);
49723     }
49724
49725     /**
49726      * Finds the intersection (if any) between two line segments a and b, given the
49727      * line segments' end points a1, a2 and b1, b2.
49728      *
49729      * This algorithm is based on Schneider and Eberly.
49730      * http://www.cimec.org.ar/~ncalvo/Schneider_Eberly.pdf
49731      * Page 244.
49732      *
49733      * @param {Array.<Number>} a1 point of first line
49734      * @param {Array.<Number>} a2 point of first line
49735      * @param {Array.<Number>} b1 point of second line
49736      * @param {Array.<Number>} b2 point of second line
49737      * @param {Boolean=}       noEndpointTouch whether to skip single touchpoints
49738      *                                         (meaning connected segments) as
49739      *                                         intersections
49740      * @returns {Array.<Array.<Number>>|Null} If the lines intersect, the point of
49741      * intersection. If they overlap, the two end points of the overlapping segment.
49742      * Otherwise, null.
49743      */
49744     function intersection (a1, a2, b1, b2, noEndpointTouch) {
49745       // The algorithm expects our lines in the form P + sd, where P is a point,
49746       // s is on the interval [0, 1], and d is a vector.
49747       // We are passed two points. P can be the first point of each pair. The
49748       // vector, then, could be thought of as the distance (in x and y components)
49749       // from the first point to the second point.
49750       // So first, let's make our vectors:
49751       var va = [a2[0] - a1[0], a2[1] - a1[1]];
49752       var vb = [b2[0] - b1[0], b2[1] - b1[1]];
49753       // We also define a function to convert back to regular point form:
49754
49755       /* eslint-disable arrow-body-style */
49756
49757       function toPoint(p, s, d) {
49758         return [
49759           p[0] + s * d[0],
49760           p[1] + s * d[1]
49761         ];
49762       }
49763
49764       /* eslint-enable arrow-body-style */
49765
49766       // The rest is pretty much a straight port of the algorithm.
49767       var e = [b1[0] - a1[0], b1[1] - a1[1]];
49768       var kross    = crossProduct(va, vb);
49769       var sqrKross = kross * kross;
49770       var sqrLenA  = dotProduct(va, va);
49771       //const sqrLenB  = dotProduct(vb, vb);
49772
49773       // Check for line intersection. This works because of the properties of the
49774       // cross product -- specifically, two vectors are parallel if and only if the
49775       // cross product is the 0 vector. The full calculation involves relative error
49776       // to account for possible very small line segments. See Schneider & Eberly
49777       // for details.
49778       if (sqrKross > 0/* EPS * sqrLenB * sqLenA */) {
49779         // If they're not parallel, then (because these are line segments) they
49780         // still might not actually intersect. This code checks that the
49781         // intersection point of the lines is actually on both line segments.
49782         var s = crossProduct(e, vb) / kross;
49783         if (s < 0 || s > 1) {
49784           // not on line segment a
49785           return null;
49786         }
49787         var t = crossProduct(e, va) / kross;
49788         if (t < 0 || t > 1) {
49789           // not on line segment b
49790           return null;
49791         }
49792         if (s === 0 || s === 1) {
49793           // on an endpoint of line segment a
49794           return noEndpointTouch ? null : [toPoint(a1, s, va)];
49795         }
49796         if (t === 0 || t === 1) {
49797           // on an endpoint of line segment b
49798           return noEndpointTouch ? null : [toPoint(b1, t, vb)];
49799         }
49800         return [toPoint(a1, s, va)];
49801       }
49802
49803       // If we've reached this point, then the lines are either parallel or the
49804       // same, but the segments could overlap partially or fully, or not at all.
49805       // So we need to find the overlap, if any. To do that, we can use e, which is
49806       // the (vector) difference between the two initial points. If this is parallel
49807       // with the line itself, then the two lines are the same line, and there will
49808       // be overlap.
49809       //const sqrLenE = dotProduct(e, e);
49810       kross = crossProduct(e, va);
49811       sqrKross = kross * kross;
49812
49813       if (sqrKross > 0 /* EPS * sqLenB * sqLenE */) {
49814       // Lines are just parallel, not the same. No overlap.
49815         return null;
49816       }
49817
49818       var sa = dotProduct(va, e) / sqrLenA;
49819       var sb = sa + dotProduct(va, vb) / sqrLenA;
49820       var smin = Math.min(sa, sb);
49821       var smax = Math.max(sa, sb);
49822
49823       // this is, essentially, the FindIntersection acting on floats from
49824       // Schneider & Eberly, just inlined into this function.
49825       if (smin <= 1 && smax >= 0) {
49826
49827         // overlap on an end point
49828         if (smin === 1) {
49829           return noEndpointTouch ? null : [toPoint(a1, smin > 0 ? smin : 0, va)];
49830         }
49831
49832         if (smax === 0) {
49833           return noEndpointTouch ? null : [toPoint(a1, smax < 1 ? smax : 1, va)];
49834         }
49835
49836         if (noEndpointTouch && smin === 0 && smax === 1) { return null; }
49837
49838         // There's overlap on a segment -- two points of intersection. Return both.
49839         return [
49840           toPoint(a1, smin > 0 ? smin : 0, va),
49841           toPoint(a1, smax < 1 ? smax : 1, va)
49842         ];
49843       }
49844
49845       return null;
49846     }
49847
49848     /**
49849      * @param  {SweepEvent} se1
49850      * @param  {SweepEvent} se2
49851      * @param  {Queue}      queue
49852      * @return {Number}
49853      */
49854     function possibleIntersection (se1, se2, queue) {
49855       // that disallows self-intersecting polygons,
49856       // did cost us half a day, so I'll leave it
49857       // out of respect
49858       // if (se1.isSubject === se2.isSubject) return;
49859       var inter = intersection(
49860         se1.point, se1.otherEvent.point,
49861         se2.point, se2.otherEvent.point
49862       );
49863
49864       var nintersections = inter ? inter.length : 0;
49865       if (nintersections === 0) { return 0; } // no intersection
49866
49867       // the line segments intersect at an endpoint of both line segments
49868       if ((nintersections === 1) &&
49869           (equals(se1.point, se2.point) ||
49870            equals(se1.otherEvent.point, se2.otherEvent.point))) {
49871         return 0;
49872       }
49873
49874       if (nintersections === 2 && se1.isSubject === se2.isSubject) {
49875         // if(se1.contourId === se2.contourId){
49876         // console.warn('Edges of the same polygon overlap',
49877         //   se1.point, se1.otherEvent.point, se2.point, se2.otherEvent.point);
49878         // }
49879         //throw new Error('Edges of the same polygon overlap');
49880         return 0;
49881       }
49882
49883       // The line segments associated to se1 and se2 intersect
49884       if (nintersections === 1) {
49885
49886         // if the intersection point is not an endpoint of se1
49887         if (!equals(se1.point, inter[0]) && !equals(se1.otherEvent.point, inter[0])) {
49888           divideSegment(se1, inter[0], queue);
49889         }
49890
49891         // if the intersection point is not an endpoint of se2
49892         if (!equals(se2.point, inter[0]) && !equals(se2.otherEvent.point, inter[0])) {
49893           divideSegment(se2, inter[0], queue);
49894         }
49895         return 1;
49896       }
49897
49898       // The line segments associated to se1 and se2 overlap
49899       var events        = [];
49900       var leftCoincide  = false;
49901       var rightCoincide = false;
49902
49903       if (equals(se1.point, se2.point)) {
49904         leftCoincide = true; // linked
49905       } else if (compareEvents(se1, se2) === 1) {
49906         events.push(se2, se1);
49907       } else {
49908         events.push(se1, se2);
49909       }
49910
49911       if (equals(se1.otherEvent.point, se2.otherEvent.point)) {
49912         rightCoincide = true;
49913       } else if (compareEvents(se1.otherEvent, se2.otherEvent) === 1) {
49914         events.push(se2.otherEvent, se1.otherEvent);
49915       } else {
49916         events.push(se1.otherEvent, se2.otherEvent);
49917       }
49918
49919       if ((leftCoincide && rightCoincide) || leftCoincide) {
49920         // both line segments are equal or share the left endpoint
49921         se2.type = NON_CONTRIBUTING;
49922         se1.type = (se2.inOut === se1.inOut)
49923           ? SAME_TRANSITION : DIFFERENT_TRANSITION;
49924
49925         if (leftCoincide && !rightCoincide) {
49926           // honestly no idea, but changing events selection from [2, 1]
49927           // to [0, 1] fixes the overlapping self-intersecting polygons issue
49928           divideSegment(events[1].otherEvent, events[0].point, queue);
49929         }
49930         return 2;
49931       }
49932
49933       // the line segments share the right endpoint
49934       if (rightCoincide) {
49935         divideSegment(events[0], events[1].point, queue);
49936         return 3;
49937       }
49938
49939       // no line segment includes totally the other one
49940       if (events[0] !== events[3].otherEvent) {
49941         divideSegment(events[0], events[1].point, queue);
49942         divideSegment(events[1], events[2].point, queue);
49943         return 3;
49944       }
49945
49946       // one line segment includes the other one
49947       divideSegment(events[0], events[1].point, queue);
49948       divideSegment(events[3].otherEvent, events[2].point, queue);
49949
49950       return 3;
49951     }
49952
49953     /**
49954      * @param  {SweepEvent} le1
49955      * @param  {SweepEvent} le2
49956      * @return {Number}
49957      */
49958     function compareSegments(le1, le2) {
49959       if (le1 === le2) { return 0; }
49960
49961       // Segments are not collinear
49962       if (signedArea(le1.point, le1.otherEvent.point, le2.point) !== 0 ||
49963         signedArea(le1.point, le1.otherEvent.point, le2.otherEvent.point) !== 0) {
49964
49965         // If they share their left endpoint use the right endpoint to sort
49966         if (equals(le1.point, le2.point)) { return le1.isBelow(le2.otherEvent.point) ? -1 : 1; }
49967
49968         // Different left endpoint: use the left endpoint to sort
49969         if (le1.point[0] === le2.point[0]) { return le1.point[1] < le2.point[1] ? -1 : 1; }
49970
49971         // has the line segment associated to e1 been inserted
49972         // into S after the line segment associated to e2 ?
49973         if (compareEvents(le1, le2) === 1) { return le2.isAbove(le1.point) ? -1 : 1; }
49974
49975         // The line segment associated to e2 has been inserted
49976         // into S after the line segment associated to e1
49977         return le1.isBelow(le2.point) ? -1 : 1;
49978       }
49979
49980       if (le1.isSubject === le2.isSubject) { // same polygon
49981         var p1 = le1.point, p2 = le2.point;
49982         if (p1[0] === p2[0] && p1[1] === p2[1]/*equals(le1.point, le2.point)*/) {
49983           p1 = le1.otherEvent.point; p2 = le2.otherEvent.point;
49984           if (p1[0] === p2[0] && p1[1] === p2[1]) { return 0; }
49985           else { return le1.contourId > le2.contourId ? 1 : -1; }
49986         }
49987       } else { // Segments are collinear, but belong to separate polygons
49988         return le1.isSubject ? -1 : 1;
49989       }
49990
49991       return compareEvents(le1, le2) === 1 ? 1 : -1;
49992     }
49993
49994     function subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation) {
49995       var sweepLine = new SplayTree(compareSegments);
49996       var sortedEvents = [];
49997
49998       var rightbound = Math.min(sbbox[2], cbbox[2]);
49999
50000       var prev, next, begin;
50001
50002       while (eventQueue.length !== 0) {
50003         var event = eventQueue.pop();
50004         sortedEvents.push(event);
50005
50006         // optimization by bboxes for intersection and difference goes here
50007         if ((operation === INTERSECTION && event.point[0] > rightbound) ||
50008             (operation === DIFFERENCE   && event.point[0] > sbbox[2])) {
50009           break;
50010         }
50011
50012         if (event.left) {
50013           next  = prev = sweepLine.insert(event);
50014           begin = sweepLine.minNode();
50015
50016           if (prev !== begin) { prev = sweepLine.prev(prev); }
50017           else                { prev = null; }
50018
50019           next = sweepLine.next(next);
50020
50021           var prevEvent = prev ? prev.key : null;
50022           var prevprevEvent = (void 0);
50023           computeFields(event, prevEvent, operation);
50024           if (next) {
50025             if (possibleIntersection(event, next.key, eventQueue) === 2) {
50026               computeFields(event, prevEvent, operation);
50027               computeFields(event, next.key, operation);
50028             }
50029           }
50030
50031           if (prev) {
50032             if (possibleIntersection(prev.key, event, eventQueue) === 2) {
50033               var prevprev = prev;
50034               if (prevprev !== begin) { prevprev = sweepLine.prev(prevprev); }
50035               else                    { prevprev = null; }
50036
50037               prevprevEvent = prevprev ? prevprev.key : null;
50038               computeFields(prevEvent, prevprevEvent, operation);
50039               computeFields(event,     prevEvent,     operation);
50040             }
50041           }
50042         } else {
50043           event = event.otherEvent;
50044           next = prev = sweepLine.find(event);
50045
50046           if (prev && next) {
50047
50048             if (prev !== begin) { prev = sweepLine.prev(prev); }
50049             else                { prev = null; }
50050
50051             next = sweepLine.next(next);
50052             sweepLine.remove(event);
50053
50054             if (next && prev) {
50055               possibleIntersection(prev.key, next.key, eventQueue);
50056             }
50057           }
50058         }
50059       }
50060       return sortedEvents;
50061     }
50062
50063     /**
50064      * @param  {Array.<SweepEvent>} sortedEvents
50065      * @return {Array.<SweepEvent>}
50066      */
50067     function orderEvents(sortedEvents) {
50068       var event, i, len, tmp;
50069       var resultEvents = [];
50070       for (i = 0, len = sortedEvents.length; i < len; i++) {
50071         event = sortedEvents[i];
50072         if ((event.left && event.inResult) ||
50073           (!event.left && event.otherEvent.inResult)) {
50074           resultEvents.push(event);
50075         }
50076       }
50077       // Due to overlapping edges the resultEvents array can be not wholly sorted
50078       var sorted = false;
50079       while (!sorted) {
50080         sorted = true;
50081         for (i = 0, len = resultEvents.length; i < len; i++) {
50082           if ((i + 1) < len &&
50083             compareEvents(resultEvents[i], resultEvents[i + 1]) === 1) {
50084             tmp = resultEvents[i];
50085             resultEvents[i] = resultEvents[i + 1];
50086             resultEvents[i + 1] = tmp;
50087             sorted = false;
50088           }
50089         }
50090       }
50091
50092
50093       for (i = 0, len = resultEvents.length; i < len; i++) {
50094         event = resultEvents[i];
50095         event.pos = i;
50096       }
50097
50098       // imagine, the right event is found in the beginning of the queue,
50099       // when his left counterpart is not marked yet
50100       for (i = 0, len = resultEvents.length; i < len; i++) {
50101         event = resultEvents[i];
50102         if (!event.left) {
50103           tmp = event.pos;
50104           event.pos = event.otherEvent.pos;
50105           event.otherEvent.pos = tmp;
50106         }
50107       }
50108
50109       return resultEvents;
50110     }
50111
50112
50113     /**
50114      * @param  {Number} pos
50115      * @param  {Array.<SweepEvent>} resultEvents
50116      * @param  {Object>}    processed
50117      * @return {Number}
50118      */
50119     function nextPos(pos, resultEvents, processed, origIndex) {
50120       var p, p1;
50121       var newPos = pos + 1;
50122       var length = resultEvents.length;
50123
50124       p  = resultEvents[pos].point;
50125
50126       if (newPos < length)
50127         { p1 = resultEvents[newPos].point; }
50128
50129
50130       // while in range and not the current one by value
50131       while (newPos < length && p1[0] === p[0] && p1[1] === p[1]) {
50132         if (!processed[newPos]) {
50133           return newPos;
50134         } else   {
50135           newPos++;
50136         }
50137         p1 = resultEvents[newPos].point;
50138       }
50139
50140       newPos = pos - 1;
50141
50142       while (processed[newPos] && newPos >= origIndex) {
50143         newPos--;
50144       }
50145       return newPos;
50146     }
50147
50148
50149     /**
50150      * @param  {Array.<SweepEvent>} sortedEvents
50151      * @return {Array.<*>} polygons
50152      */
50153     function connectEdges(sortedEvents, operation) {
50154       var i, len;
50155       var resultEvents = orderEvents(sortedEvents);
50156
50157       // "false"-filled array
50158       var processed = {};
50159       var result = [];
50160       var event;
50161
50162       for (i = 0, len = resultEvents.length; i < len; i++) {
50163         if (processed[i]) { continue; }
50164         var contour = [[]];
50165
50166         if (!resultEvents[i].isExteriorRing) {
50167           if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length === 0) {
50168             result.push(contour);
50169           } else if (result.length === 0) {
50170             result.push([[contour]]);
50171           } else {
50172             result[result.length - 1].push(contour[0]);
50173           }
50174         } else if (operation === DIFFERENCE && !resultEvents[i].isSubject && result.length > 1) {
50175           result[result.length - 1].push(contour[0]);
50176         } else {
50177           result.push(contour);
50178         }
50179
50180         var ringId = result.length - 1;
50181         var pos = i;
50182
50183         var initial = resultEvents[i].point;
50184         contour[0].push(initial);
50185
50186         while (pos >= i) {
50187           event = resultEvents[pos];
50188           processed[pos] = true;
50189
50190           if (event.left) {
50191             event.resultInOut = false;
50192             event.contourId   = ringId;
50193           } else {
50194             event.otherEvent.resultInOut = true;
50195             event.otherEvent.contourId   = ringId;
50196           }
50197
50198           pos = event.pos;
50199           processed[pos] = true;
50200           contour[0].push(resultEvents[pos].point);
50201           pos = nextPos(pos, resultEvents, processed, i);
50202         }
50203
50204         pos = pos === -1 ? i : pos;
50205
50206         event = resultEvents[pos];
50207         processed[pos] = processed[event.pos] = true;
50208         event.otherEvent.resultInOut = true;
50209         event.otherEvent.contourId   = ringId;
50210       }
50211
50212       // Handle if the result is a polygon (eg not multipoly)
50213       // Commented it again, let's see what do we mean by that
50214       // if (result.length === 1) result = result[0];
50215       return result;
50216     }
50217
50218     var tinyqueue = TinyQueue;
50219     var default_1 = TinyQueue;
50220
50221     function TinyQueue(data, compare) {
50222         var this$1 = this;
50223
50224         if (!(this instanceof TinyQueue)) { return new TinyQueue(data, compare); }
50225
50226         this.data = data || [];
50227         this.length = this.data.length;
50228         this.compare = compare || defaultCompare;
50229
50230         if (this.length > 0) {
50231             for (var i = (this.length >> 1) - 1; i >= 0; i--) { this$1._down(i); }
50232         }
50233     }
50234
50235     function defaultCompare(a, b) {
50236         return a < b ? -1 : a > b ? 1 : 0;
50237     }
50238
50239     TinyQueue.prototype = {
50240
50241         push: function (item) {
50242             this.data.push(item);
50243             this.length++;
50244             this._up(this.length - 1);
50245         },
50246
50247         pop: function () {
50248             if (this.length === 0) { return undefined; }
50249
50250             var top = this.data[0];
50251             this.length--;
50252
50253             if (this.length > 0) {
50254                 this.data[0] = this.data[this.length];
50255                 this._down(0);
50256             }
50257             this.data.pop();
50258
50259             return top;
50260         },
50261
50262         peek: function () {
50263             return this.data[0];
50264         },
50265
50266         _up: function (pos) {
50267             var data = this.data;
50268             var compare = this.compare;
50269             var item = data[pos];
50270
50271             while (pos > 0) {
50272                 var parent = (pos - 1) >> 1;
50273                 var current = data[parent];
50274                 if (compare(item, current) >= 0) { break; }
50275                 data[pos] = current;
50276                 pos = parent;
50277             }
50278
50279             data[pos] = item;
50280         },
50281
50282         _down: function (pos) {
50283             var this$1 = this;
50284
50285             var data = this.data;
50286             var compare = this.compare;
50287             var halfLength = this.length >> 1;
50288             var item = data[pos];
50289
50290             while (pos < halfLength) {
50291                 var left = (pos << 1) + 1;
50292                 var right = left + 1;
50293                 var best = data[left];
50294
50295                 if (right < this$1.length && compare(data[right], best) < 0) {
50296                     left = right;
50297                     best = data[right];
50298                 }
50299                 if (compare(best, item) >= 0) { break; }
50300
50301                 data[pos] = best;
50302                 pos = left;
50303             }
50304
50305             data[pos] = item;
50306         }
50307     };
50308     tinyqueue.default = default_1;
50309
50310     var max = Math.max;
50311     var min = Math.min;
50312
50313     var contourId = 0;
50314
50315
50316     function processPolygon(contourOrHole, isSubject, depth, Q, bbox, isExteriorRing) {
50317       var i, len, s1, s2, e1, e2;
50318       for (i = 0, len = contourOrHole.length - 1; i < len; i++) {
50319         s1 = contourOrHole[i];
50320         s2 = contourOrHole[i + 1];
50321         e1 = new SweepEvent(s1, false, undefined, isSubject);
50322         e2 = new SweepEvent(s2, false, e1,        isSubject);
50323         e1.otherEvent = e2;
50324
50325         if (s1[0] === s2[0] && s1[1] === s2[1]) {
50326           continue; // skip collapsed edges, or it breaks
50327         }
50328
50329         e1.contourId = e2.contourId = depth;
50330         if (!isExteriorRing) {
50331           e1.isExteriorRing = false;
50332           e2.isExteriorRing = false;
50333         }
50334         if (compareEvents(e1, e2) > 0) {
50335           e2.left = true;
50336         } else {
50337           e1.left = true;
50338         }
50339
50340         var x = s1[0], y = s1[1];
50341         bbox[0] = min(bbox[0], x);
50342         bbox[1] = min(bbox[1], y);
50343         bbox[2] = max(bbox[2], x);
50344         bbox[3] = max(bbox[3], y);
50345
50346         // Pushing it so the queue is sorted from left to right,
50347         // with object on the left having the highest priority.
50348         Q.push(e1);
50349         Q.push(e2);
50350       }
50351     }
50352
50353
50354     function fillQueue(subject, clipping, sbbox, cbbox, operation) {
50355       var eventQueue = new tinyqueue(null, compareEvents);
50356       var polygonSet, isExteriorRing, i, ii, j, jj; //, k, kk;
50357
50358       for (i = 0, ii = subject.length; i < ii; i++) {
50359         polygonSet = subject[i];
50360         for (j = 0, jj = polygonSet.length; j < jj; j++) {
50361           isExteriorRing = j === 0;
50362           if (isExteriorRing) { contourId++; }
50363           processPolygon(polygonSet[j], true, contourId, eventQueue, sbbox, isExteriorRing);
50364         }
50365       }
50366
50367       for (i = 0, ii = clipping.length; i < ii; i++) {
50368         polygonSet = clipping[i];
50369         for (j = 0, jj = polygonSet.length; j < jj; j++) {
50370           isExteriorRing = j === 0;
50371           if (operation === DIFFERENCE) { isExteriorRing = false; }
50372           if (isExteriorRing) { contourId++; }
50373           processPolygon(polygonSet[j], false, contourId, eventQueue, cbbox, isExteriorRing);
50374         }
50375       }
50376
50377       return eventQueue;
50378     }
50379
50380     var EMPTY = [];
50381
50382
50383     function trivialOperation(subject, clipping, operation) {
50384       var result = null;
50385       if (subject.length * clipping.length === 0) {
50386         if        (operation === INTERSECTION) {
50387           result = EMPTY;
50388         } else if (operation === DIFFERENCE) {
50389           result = subject;
50390         } else if (operation === UNION ||
50391                    operation === XOR) {
50392           result = (subject.length === 0) ? clipping : subject;
50393         }
50394       }
50395       return result;
50396     }
50397
50398
50399     function compareBBoxes(subject, clipping, sbbox, cbbox, operation) {
50400       var result = null;
50401       if (sbbox[0] > cbbox[2] ||
50402           cbbox[0] > sbbox[2] ||
50403           sbbox[1] > cbbox[3] ||
50404           cbbox[1] > sbbox[3]) {
50405         if        (operation === INTERSECTION) {
50406           result = EMPTY;
50407         } else if (operation === DIFFERENCE) {
50408           result = subject;
50409         } else if (operation === UNION ||
50410                    operation === XOR) {
50411           result = subject.concat(clipping);
50412         }
50413       }
50414       return result;
50415     }
50416
50417
50418     function boolean(subject, clipping, operation) {
50419       if (typeof subject[0][0][0] === 'number') {
50420         subject = [subject];
50421       }
50422       if (typeof clipping[0][0][0] === 'number') {
50423         clipping = [clipping];
50424       }
50425       var trivial = trivialOperation(subject, clipping, operation);
50426       if (trivial) {
50427         return trivial === EMPTY ? null : trivial;
50428       }
50429       var sbbox = [Infinity, Infinity, -Infinity, -Infinity];
50430       var cbbox = [Infinity, Infinity, -Infinity, -Infinity];
50431
50432       //console.time('fill queue');
50433       var eventQueue = fillQueue(subject, clipping, sbbox, cbbox, operation);
50434       //console.timeEnd('fill queue');
50435
50436       trivial = compareBBoxes(subject, clipping, sbbox, cbbox, operation);
50437       if (trivial) {
50438         return trivial === EMPTY ? null : trivial;
50439       }
50440       //console.time('subdivide edges');
50441       var sortedEvents = subdivide(eventQueue, subject, clipping, sbbox, cbbox, operation);
50442       //console.timeEnd('subdivide edges');
50443
50444       //console.time('connect vertices');
50445       var result = connectEdges(sortedEvents, operation);
50446       //console.timeEnd('connect vertices');
50447       return result;
50448     }
50449
50450     function union (subject, clipping) {
50451       return boolean(subject, clipping, UNION);
50452     }
50453
50454     function diff (subject, clipping) {
50455       return boolean(subject, clipping, DIFFERENCE);
50456     }
50457
50458     function xor (subject, clipping){
50459       return boolean(subject, clipping, XOR);
50460     }
50461
50462     function intersection$1 (subject, clipping) {
50463       return boolean(subject, clipping, INTERSECTION);
50464     }
50465
50466     /**
50467      * @enum {Number}
50468      */
50469     var operations = { UNION: UNION, DIFFERENCE: DIFFERENCE, INTERSECTION: INTERSECTION, XOR: XOR };
50470
50471     exports.union = union;
50472     exports.diff = diff;
50473     exports.xor = xor;
50474     exports.intersection = intersection$1;
50475     exports.operations = operations;
50476
50477     Object.defineProperty(exports, '__esModule', { value: true });
50478
50479   })));
50480
50481   });
50482
50483   var martinez = unwrapExports(martinez_umd);
50484
50485   var read$6 = function (buffer, offset, isLE, mLen, nBytes) {
50486     var e, m;
50487     var eLen = (nBytes * 8) - mLen - 1;
50488     var eMax = (1 << eLen) - 1;
50489     var eBias = eMax >> 1;
50490     var nBits = -7;
50491     var i = isLE ? (nBytes - 1) : 0;
50492     var d = isLE ? -1 : 1;
50493     var s = buffer[offset + i];
50494
50495     i += d;
50496
50497     e = s & ((1 << (-nBits)) - 1);
50498     s >>= (-nBits);
50499     nBits += eLen;
50500     for (; nBits > 0; e = (e * 256) + buffer[offset + i], i += d, nBits -= 8) {}
50501
50502     m = e & ((1 << (-nBits)) - 1);
50503     e >>= (-nBits);
50504     nBits += mLen;
50505     for (; nBits > 0; m = (m * 256) + buffer[offset + i], i += d, nBits -= 8) {}
50506
50507     if (e === 0) {
50508       e = 1 - eBias;
50509     } else if (e === eMax) {
50510       return m ? NaN : ((s ? -1 : 1) * Infinity)
50511     } else {
50512       m = m + Math.pow(2, mLen);
50513       e = e - eBias;
50514     }
50515     return (s ? -1 : 1) * m * Math.pow(2, e - mLen)
50516   };
50517
50518   var write$6 = function (buffer, value, offset, isLE, mLen, nBytes) {
50519     var e, m, c;
50520     var eLen = (nBytes * 8) - mLen - 1;
50521     var eMax = (1 << eLen) - 1;
50522     var eBias = eMax >> 1;
50523     var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0);
50524     var i = isLE ? 0 : (nBytes - 1);
50525     var d = isLE ? 1 : -1;
50526     var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0;
50527
50528     value = Math.abs(value);
50529
50530     if (isNaN(value) || value === Infinity) {
50531       m = isNaN(value) ? 1 : 0;
50532       e = eMax;
50533     } else {
50534       e = Math.floor(Math.log(value) / Math.LN2);
50535       if (value * (c = Math.pow(2, -e)) < 1) {
50536         e--;
50537         c *= 2;
50538       }
50539       if (e + eBias >= 1) {
50540         value += rt / c;
50541       } else {
50542         value += rt * Math.pow(2, 1 - eBias);
50543       }
50544       if (value * c >= 2) {
50545         e++;
50546         c /= 2;
50547       }
50548
50549       if (e + eBias >= eMax) {
50550         m = 0;
50551         e = eMax;
50552       } else if (e + eBias >= 1) {
50553         m = ((value * c) - 1) * Math.pow(2, mLen);
50554         e = e + eBias;
50555       } else {
50556         m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen);
50557         e = 0;
50558       }
50559     }
50560
50561     for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {}
50562
50563     e = (e << mLen) | m;
50564     eLen += mLen;
50565     for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {}
50566
50567     buffer[offset + i - d] |= s * 128;
50568   };
50569
50570   var ieee754 = {
50571         read: read$6,
50572         write: write$6
50573   };
50574
50575   var pbf = Pbf;
50576
50577
50578
50579   function Pbf(buf) {
50580       this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0);
50581       this.pos = 0;
50582       this.type = 0;
50583       this.length = this.buf.length;
50584   }
50585
50586   Pbf.Varint  = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum
50587   Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64
50588   Pbf.Bytes   = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields
50589   Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32
50590
50591   var SHIFT_LEFT_32 = (1 << 16) * (1 << 16),
50592       SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32;
50593
50594   Pbf.prototype = {
50595
50596       destroy: function() {
50597           this.buf = null;
50598       },
50599
50600       // === READING =================================================================
50601
50602       readFields: function(readField, result, end) {
50603           end = end || this.length;
50604
50605           while (this.pos < end) {
50606               var val = this.readVarint(),
50607                   tag = val >> 3,
50608                   startPos = this.pos;
50609
50610               this.type = val & 0x7;
50611               readField(tag, result, this);
50612
50613               if (this.pos === startPos) this.skip(val);
50614           }
50615           return result;
50616       },
50617
50618       readMessage: function(readField, result) {
50619           return this.readFields(readField, result, this.readVarint() + this.pos);
50620       },
50621
50622       readFixed32: function() {
50623           var val = readUInt32(this.buf, this.pos);
50624           this.pos += 4;
50625           return val;
50626       },
50627
50628       readSFixed32: function() {
50629           var val = readInt32(this.buf, this.pos);
50630           this.pos += 4;
50631           return val;
50632       },
50633
50634       // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed)
50635
50636       readFixed64: function() {
50637           var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
50638           this.pos += 8;
50639           return val;
50640       },
50641
50642       readSFixed64: function() {
50643           var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32;
50644           this.pos += 8;
50645           return val;
50646       },
50647
50648       readFloat: function() {
50649           var val = ieee754.read(this.buf, this.pos, true, 23, 4);
50650           this.pos += 4;
50651           return val;
50652       },
50653
50654       readDouble: function() {
50655           var val = ieee754.read(this.buf, this.pos, true, 52, 8);
50656           this.pos += 8;
50657           return val;
50658       },
50659
50660       readVarint: function(isSigned) {
50661           var buf = this.buf,
50662               val, b;
50663
50664           b = buf[this.pos++]; val  =  b & 0x7f;        if (b < 0x80) return val;
50665           b = buf[this.pos++]; val |= (b & 0x7f) << 7;  if (b < 0x80) return val;
50666           b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) return val;
50667           b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) return val;
50668           b = buf[this.pos];   val |= (b & 0x0f) << 28;
50669
50670           return readVarintRemainder(val, isSigned, this);
50671       },
50672
50673       readVarint64: function() { // for compatibility with v2.0.1
50674           return this.readVarint(true);
50675       },
50676
50677       readSVarint: function() {
50678           var num = this.readVarint();
50679           return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding
50680       },
50681
50682       readBoolean: function() {
50683           return Boolean(this.readVarint());
50684       },
50685
50686       readString: function() {
50687           var end = this.readVarint() + this.pos,
50688               str = readUtf8(this.buf, this.pos, end);
50689           this.pos = end;
50690           return str;
50691       },
50692
50693       readBytes: function() {
50694           var end = this.readVarint() + this.pos,
50695               buffer = this.buf.subarray(this.pos, end);
50696           this.pos = end;
50697           return buffer;
50698       },
50699
50700       // verbose for performance reasons; doesn't affect gzipped size
50701
50702       readPackedVarint: function(arr, isSigned) {
50703           var end = readPackedEnd(this);
50704           arr = arr || [];
50705           while (this.pos < end) arr.push(this.readVarint(isSigned));
50706           return arr;
50707       },
50708       readPackedSVarint: function(arr) {
50709           var end = readPackedEnd(this);
50710           arr = arr || [];
50711           while (this.pos < end) arr.push(this.readSVarint());
50712           return arr;
50713       },
50714       readPackedBoolean: function(arr) {
50715           var end = readPackedEnd(this);
50716           arr = arr || [];
50717           while (this.pos < end) arr.push(this.readBoolean());
50718           return arr;
50719       },
50720       readPackedFloat: function(arr) {
50721           var end = readPackedEnd(this);
50722           arr = arr || [];
50723           while (this.pos < end) arr.push(this.readFloat());
50724           return arr;
50725       },
50726       readPackedDouble: function(arr) {
50727           var end = readPackedEnd(this);
50728           arr = arr || [];
50729           while (this.pos < end) arr.push(this.readDouble());
50730           return arr;
50731       },
50732       readPackedFixed32: function(arr) {
50733           var end = readPackedEnd(this);
50734           arr = arr || [];
50735           while (this.pos < end) arr.push(this.readFixed32());
50736           return arr;
50737       },
50738       readPackedSFixed32: function(arr) {
50739           var end = readPackedEnd(this);
50740           arr = arr || [];
50741           while (this.pos < end) arr.push(this.readSFixed32());
50742           return arr;
50743       },
50744       readPackedFixed64: function(arr) {
50745           var end = readPackedEnd(this);
50746           arr = arr || [];
50747           while (this.pos < end) arr.push(this.readFixed64());
50748           return arr;
50749       },
50750       readPackedSFixed64: function(arr) {
50751           var end = readPackedEnd(this);
50752           arr = arr || [];
50753           while (this.pos < end) arr.push(this.readSFixed64());
50754           return arr;
50755       },
50756
50757       skip: function(val) {
50758           var type = val & 0x7;
50759           if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {}
50760           else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos;
50761           else if (type === Pbf.Fixed32) this.pos += 4;
50762           else if (type === Pbf.Fixed64) this.pos += 8;
50763           else throw new Error('Unimplemented type: ' + type);
50764       },
50765
50766       // === WRITING =================================================================
50767
50768       writeTag: function(tag, type) {
50769           this.writeVarint((tag << 3) | type);
50770       },
50771
50772       realloc: function(min) {
50773           var length = this.length || 16;
50774
50775           while (length < this.pos + min) length *= 2;
50776
50777           if (length !== this.length) {
50778               var buf = new Uint8Array(length);
50779               buf.set(this.buf);
50780               this.buf = buf;
50781               this.length = length;
50782           }
50783       },
50784
50785       finish: function() {
50786           this.length = this.pos;
50787           this.pos = 0;
50788           return this.buf.subarray(0, this.length);
50789       },
50790
50791       writeFixed32: function(val) {
50792           this.realloc(4);
50793           writeInt32(this.buf, val, this.pos);
50794           this.pos += 4;
50795       },
50796
50797       writeSFixed32: function(val) {
50798           this.realloc(4);
50799           writeInt32(this.buf, val, this.pos);
50800           this.pos += 4;
50801       },
50802
50803       writeFixed64: function(val) {
50804           this.realloc(8);
50805           writeInt32(this.buf, val & -1, this.pos);
50806           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
50807           this.pos += 8;
50808       },
50809
50810       writeSFixed64: function(val) {
50811           this.realloc(8);
50812           writeInt32(this.buf, val & -1, this.pos);
50813           writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4);
50814           this.pos += 8;
50815       },
50816
50817       writeVarint: function(val) {
50818           val = +val || 0;
50819
50820           if (val > 0xfffffff || val < 0) {
50821               writeBigVarint(val, this);
50822               return;
50823           }
50824
50825           this.realloc(4);
50826
50827           this.buf[this.pos++] =           val & 0x7f  | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50828           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50829           this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) return;
50830           this.buf[this.pos++] =   (val >>> 7) & 0x7f;
50831       },
50832
50833       writeSVarint: function(val) {
50834           this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2);
50835       },
50836
50837       writeBoolean: function(val) {
50838           this.writeVarint(Boolean(val));
50839       },
50840
50841       writeString: function(str) {
50842           str = String(str);
50843           this.realloc(str.length * 4);
50844
50845           this.pos++; // reserve 1 byte for short string length
50846
50847           var startPos = this.pos;
50848           // write the string directly to the buffer and see how much was written
50849           this.pos = writeUtf8(this.buf, str, this.pos);
50850           var len = this.pos - startPos;
50851
50852           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
50853
50854           // finally, write the message length in the reserved place and restore the position
50855           this.pos = startPos - 1;
50856           this.writeVarint(len);
50857           this.pos += len;
50858       },
50859
50860       writeFloat: function(val) {
50861           this.realloc(4);
50862           ieee754.write(this.buf, val, this.pos, true, 23, 4);
50863           this.pos += 4;
50864       },
50865
50866       writeDouble: function(val) {
50867           this.realloc(8);
50868           ieee754.write(this.buf, val, this.pos, true, 52, 8);
50869           this.pos += 8;
50870       },
50871
50872       writeBytes: function(buffer) {
50873           var len = buffer.length;
50874           this.writeVarint(len);
50875           this.realloc(len);
50876           for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i];
50877       },
50878
50879       writeRawMessage: function(fn, obj) {
50880           this.pos++; // reserve 1 byte for short message length
50881
50882           // write the message directly to the buffer and see how much was written
50883           var startPos = this.pos;
50884           fn(obj, this);
50885           var len = this.pos - startPos;
50886
50887           if (len >= 0x80) makeRoomForExtraLength(startPos, len, this);
50888
50889           // finally, write the message length in the reserved place and restore the position
50890           this.pos = startPos - 1;
50891           this.writeVarint(len);
50892           this.pos += len;
50893       },
50894
50895       writeMessage: function(tag, fn, obj) {
50896           this.writeTag(tag, Pbf.Bytes);
50897           this.writeRawMessage(fn, obj);
50898       },
50899
50900       writePackedVarint:   function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr);   },
50901       writePackedSVarint:  function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr);  },
50902       writePackedBoolean:  function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr);  },
50903       writePackedFloat:    function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr);    },
50904       writePackedDouble:   function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr);   },
50905       writePackedFixed32:  function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr);  },
50906       writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); },
50907       writePackedFixed64:  function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr);  },
50908       writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); },
50909
50910       writeBytesField: function(tag, buffer) {
50911           this.writeTag(tag, Pbf.Bytes);
50912           this.writeBytes(buffer);
50913       },
50914       writeFixed32Field: function(tag, val) {
50915           this.writeTag(tag, Pbf.Fixed32);
50916           this.writeFixed32(val);
50917       },
50918       writeSFixed32Field: function(tag, val) {
50919           this.writeTag(tag, Pbf.Fixed32);
50920           this.writeSFixed32(val);
50921       },
50922       writeFixed64Field: function(tag, val) {
50923           this.writeTag(tag, Pbf.Fixed64);
50924           this.writeFixed64(val);
50925       },
50926       writeSFixed64Field: function(tag, val) {
50927           this.writeTag(tag, Pbf.Fixed64);
50928           this.writeSFixed64(val);
50929       },
50930       writeVarintField: function(tag, val) {
50931           this.writeTag(tag, Pbf.Varint);
50932           this.writeVarint(val);
50933       },
50934       writeSVarintField: function(tag, val) {
50935           this.writeTag(tag, Pbf.Varint);
50936           this.writeSVarint(val);
50937       },
50938       writeStringField: function(tag, str) {
50939           this.writeTag(tag, Pbf.Bytes);
50940           this.writeString(str);
50941       },
50942       writeFloatField: function(tag, val) {
50943           this.writeTag(tag, Pbf.Fixed32);
50944           this.writeFloat(val);
50945       },
50946       writeDoubleField: function(tag, val) {
50947           this.writeTag(tag, Pbf.Fixed64);
50948           this.writeDouble(val);
50949       },
50950       writeBooleanField: function(tag, val) {
50951           this.writeVarintField(tag, Boolean(val));
50952       }
50953   };
50954
50955   function readVarintRemainder(l, s, p) {
50956       var buf = p.buf,
50957           h, b;
50958
50959       b = buf[p.pos++]; h  = (b & 0x70) >> 4;  if (b < 0x80) return toNum(l, h, s);
50960       b = buf[p.pos++]; h |= (b & 0x7f) << 3;  if (b < 0x80) return toNum(l, h, s);
50961       b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) return toNum(l, h, s);
50962       b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) return toNum(l, h, s);
50963       b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) return toNum(l, h, s);
50964       b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) return toNum(l, h, s);
50965
50966       throw new Error('Expected varint not more than 10 bytes');
50967   }
50968
50969   function readPackedEnd(pbf) {
50970       return pbf.type === Pbf.Bytes ?
50971           pbf.readVarint() + pbf.pos : pbf.pos + 1;
50972   }
50973
50974   function toNum(low, high, isSigned) {
50975       if (isSigned) {
50976           return high * 0x100000000 + (low >>> 0);
50977       }
50978
50979       return ((high >>> 0) * 0x100000000) + (low >>> 0);
50980   }
50981
50982   function writeBigVarint(val, pbf) {
50983       var low, high;
50984
50985       if (val >= 0) {
50986           low  = (val % 0x100000000) | 0;
50987           high = (val / 0x100000000) | 0;
50988       } else {
50989           low  = ~(-val % 0x100000000);
50990           high = ~(-val / 0x100000000);
50991
50992           if (low ^ 0xffffffff) {
50993               low = (low + 1) | 0;
50994           } else {
50995               low = 0;
50996               high = (high + 1) | 0;
50997           }
50998       }
50999
51000       if (val >= 0x10000000000000000 || val < -0x10000000000000000) {
51001           throw new Error('Given varint doesn\'t fit into 10 bytes');
51002       }
51003
51004       pbf.realloc(10);
51005
51006       writeBigVarintLow(low, high, pbf);
51007       writeBigVarintHigh(high, pbf);
51008   }
51009
51010   function writeBigVarintLow(low, high, pbf) {
51011       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
51012       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
51013       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
51014       pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7;
51015       pbf.buf[pbf.pos]   = low & 0x7f;
51016   }
51017
51018   function writeBigVarintHigh(high, pbf) {
51019       var lsb = (high & 0x07) << 4;
51020
51021       pbf.buf[pbf.pos++] |= lsb         | ((high >>>= 3) ? 0x80 : 0); if (!high) return;
51022       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
51023       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
51024       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
51025       pbf.buf[pbf.pos++]  = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) return;
51026       pbf.buf[pbf.pos++]  = high & 0x7f;
51027   }
51028
51029   function makeRoomForExtraLength(startPos, len, pbf) {
51030       var extraLen =
51031           len <= 0x3fff ? 1 :
51032           len <= 0x1fffff ? 2 :
51033           len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7));
51034
51035       // if 1 byte isn't enough for encoding message length, shift the data to the right
51036       pbf.realloc(extraLen);
51037       for (var i = pbf.pos - 1; i >= startPos; i--) pbf.buf[i + extraLen] = pbf.buf[i];
51038   }
51039
51040   function writePackedVarint(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]);   }
51041   function writePackedSVarint(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]);  }
51042   function writePackedFloat(arr, pbf)    { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]);    }
51043   function writePackedDouble(arr, pbf)   { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]);   }
51044   function writePackedBoolean(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]);  }
51045   function writePackedFixed32(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]);  }
51046   function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); }
51047   function writePackedFixed64(arr, pbf)  { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]);  }
51048   function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); }
51049
51050   // Buffer code below from https://github.com/feross/buffer, MIT-licensed
51051
51052   function readUInt32(buf, pos) {
51053       return ((buf[pos]) |
51054           (buf[pos + 1] << 8) |
51055           (buf[pos + 2] << 16)) +
51056           (buf[pos + 3] * 0x1000000);
51057   }
51058
51059   function writeInt32(buf, val, pos) {
51060       buf[pos] = val;
51061       buf[pos + 1] = (val >>> 8);
51062       buf[pos + 2] = (val >>> 16);
51063       buf[pos + 3] = (val >>> 24);
51064   }
51065
51066   function readInt32(buf, pos) {
51067       return ((buf[pos]) |
51068           (buf[pos + 1] << 8) |
51069           (buf[pos + 2] << 16)) +
51070           (buf[pos + 3] << 24);
51071   }
51072
51073   function readUtf8(buf, pos, end) {
51074       var str = '';
51075       var i = pos;
51076
51077       while (i < end) {
51078           var b0 = buf[i];
51079           var c = null; // codepoint
51080           var bytesPerSequence =
51081               b0 > 0xEF ? 4 :
51082               b0 > 0xDF ? 3 :
51083               b0 > 0xBF ? 2 : 1;
51084
51085           if (i + bytesPerSequence > end) break;
51086
51087           var b1, b2, b3;
51088
51089           if (bytesPerSequence === 1) {
51090               if (b0 < 0x80) {
51091                   c = b0;
51092               }
51093           } else if (bytesPerSequence === 2) {
51094               b1 = buf[i + 1];
51095               if ((b1 & 0xC0) === 0x80) {
51096                   c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F);
51097                   if (c <= 0x7F) {
51098                       c = null;
51099                   }
51100               }
51101           } else if (bytesPerSequence === 3) {
51102               b1 = buf[i + 1];
51103               b2 = buf[i + 2];
51104               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) {
51105                   c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F);
51106                   if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) {
51107                       c = null;
51108                   }
51109               }
51110           } else if (bytesPerSequence === 4) {
51111               b1 = buf[i + 1];
51112               b2 = buf[i + 2];
51113               b3 = buf[i + 3];
51114               if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) {
51115                   c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F);
51116                   if (c <= 0xFFFF || c >= 0x110000) {
51117                       c = null;
51118                   }
51119               }
51120           }
51121
51122           if (c === null) {
51123               c = 0xFFFD;
51124               bytesPerSequence = 1;
51125
51126           } else if (c > 0xFFFF) {
51127               c -= 0x10000;
51128               str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800);
51129               c = 0xDC00 | c & 0x3FF;
51130           }
51131
51132           str += String.fromCharCode(c);
51133           i += bytesPerSequence;
51134       }
51135
51136       return str;
51137   }
51138
51139   function writeUtf8(buf, str, pos) {
51140       for (var i = 0, c, lead; i < str.length; i++) {
51141           c = str.charCodeAt(i); // code point
51142
51143           if (c > 0xD7FF && c < 0xE000) {
51144               if (lead) {
51145                   if (c < 0xDC00) {
51146                       buf[pos++] = 0xEF;
51147                       buf[pos++] = 0xBF;
51148                       buf[pos++] = 0xBD;
51149                       lead = c;
51150                       continue;
51151                   } else {
51152                       c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000;
51153                       lead = null;
51154                   }
51155               } else {
51156                   if (c > 0xDBFF || (i + 1 === str.length)) {
51157                       buf[pos++] = 0xEF;
51158                       buf[pos++] = 0xBF;
51159                       buf[pos++] = 0xBD;
51160                   } else {
51161                       lead = c;
51162                   }
51163                   continue;
51164               }
51165           } else if (lead) {
51166               buf[pos++] = 0xEF;
51167               buf[pos++] = 0xBF;
51168               buf[pos++] = 0xBD;
51169               lead = null;
51170           }
51171
51172           if (c < 0x80) {
51173               buf[pos++] = c;
51174           } else {
51175               if (c < 0x800) {
51176                   buf[pos++] = c >> 0x6 | 0xC0;
51177               } else {
51178                   if (c < 0x10000) {
51179                       buf[pos++] = c >> 0xC | 0xE0;
51180                   } else {
51181                       buf[pos++] = c >> 0x12 | 0xF0;
51182                       buf[pos++] = c >> 0xC & 0x3F | 0x80;
51183                   }
51184                   buf[pos++] = c >> 0x6 & 0x3F | 0x80;
51185               }
51186               buf[pos++] = c & 0x3F | 0x80;
51187           }
51188       }
51189       return pos;
51190   }
51191
51192   var pointGeometry = Point;
51193
51194   /**
51195    * A standalone point geometry with useful accessor, comparison, and
51196    * modification methods.
51197    *
51198    * @class Point
51199    * @param {Number} x the x-coordinate. this could be longitude or screen
51200    * pixels, or any other sort of unit.
51201    * @param {Number} y the y-coordinate. this could be latitude or screen
51202    * pixels, or any other sort of unit.
51203    * @example
51204    * var point = new Point(-77, 38);
51205    */
51206   function Point(x, y) {
51207       this.x = x;
51208       this.y = y;
51209   }
51210
51211   Point.prototype = {
51212
51213       /**
51214        * Clone this point, returning a new point that can be modified
51215        * without affecting the old one.
51216        * @return {Point} the clone
51217        */
51218       clone: function() { return new Point(this.x, this.y); },
51219
51220       /**
51221        * Add this point's x & y coordinates to another point,
51222        * yielding a new point.
51223        * @param {Point} p the other point
51224        * @return {Point} output point
51225        */
51226       add:     function(p) { return this.clone()._add(p); },
51227
51228       /**
51229        * Subtract this point's x & y coordinates to from point,
51230        * yielding a new point.
51231        * @param {Point} p the other point
51232        * @return {Point} output point
51233        */
51234       sub:     function(p) { return this.clone()._sub(p); },
51235
51236       /**
51237        * Multiply this point's x & y coordinates by point,
51238        * yielding a new point.
51239        * @param {Point} p the other point
51240        * @return {Point} output point
51241        */
51242       multByPoint:    function(p) { return this.clone()._multByPoint(p); },
51243
51244       /**
51245        * Divide this point's x & y coordinates by point,
51246        * yielding a new point.
51247        * @param {Point} p the other point
51248        * @return {Point} output point
51249        */
51250       divByPoint:     function(p) { return this.clone()._divByPoint(p); },
51251
51252       /**
51253        * Multiply this point's x & y coordinates by a factor,
51254        * yielding a new point.
51255        * @param {Point} k factor
51256        * @return {Point} output point
51257        */
51258       mult:    function(k) { return this.clone()._mult(k); },
51259
51260       /**
51261        * Divide this point's x & y coordinates by a factor,
51262        * yielding a new point.
51263        * @param {Point} k factor
51264        * @return {Point} output point
51265        */
51266       div:     function(k) { return this.clone()._div(k); },
51267
51268       /**
51269        * Rotate this point around the 0, 0 origin by an angle a,
51270        * given in radians
51271        * @param {Number} a angle to rotate around, in radians
51272        * @return {Point} output point
51273        */
51274       rotate:  function(a) { return this.clone()._rotate(a); },
51275
51276       /**
51277        * Rotate this point around p point by an angle a,
51278        * given in radians
51279        * @param {Number} a angle to rotate around, in radians
51280        * @param {Point} p Point to rotate around
51281        * @return {Point} output point
51282        */
51283       rotateAround:  function(a,p) { return this.clone()._rotateAround(a,p); },
51284
51285       /**
51286        * Multiply this point by a 4x1 transformation matrix
51287        * @param {Array<Number>} m transformation matrix
51288        * @return {Point} output point
51289        */
51290       matMult: function(m) { return this.clone()._matMult(m); },
51291
51292       /**
51293        * Calculate this point but as a unit vector from 0, 0, meaning
51294        * that the distance from the resulting point to the 0, 0
51295        * coordinate will be equal to 1 and the angle from the resulting
51296        * point to the 0, 0 coordinate will be the same as before.
51297        * @return {Point} unit vector point
51298        */
51299       unit:    function() { return this.clone()._unit(); },
51300
51301       /**
51302        * Compute a perpendicular point, where the new y coordinate
51303        * is the old x coordinate and the new x coordinate is the old y
51304        * coordinate multiplied by -1
51305        * @return {Point} perpendicular point
51306        */
51307       perp:    function() { return this.clone()._perp(); },
51308
51309       /**
51310        * Return a version of this point with the x & y coordinates
51311        * rounded to integers.
51312        * @return {Point} rounded point
51313        */
51314       round:   function() { return this.clone()._round(); },
51315
51316       /**
51317        * Return the magitude of this point: this is the Euclidean
51318        * distance from the 0, 0 coordinate to this point's x and y
51319        * coordinates.
51320        * @return {Number} magnitude
51321        */
51322       mag: function() {
51323           return Math.sqrt(this.x * this.x + this.y * this.y);
51324       },
51325
51326       /**
51327        * Judge whether this point is equal to another point, returning
51328        * true or false.
51329        * @param {Point} other the other point
51330        * @return {boolean} whether the points are equal
51331        */
51332       equals: function(other) {
51333           return this.x === other.x &&
51334                  this.y === other.y;
51335       },
51336
51337       /**
51338        * Calculate the distance from this point to another point
51339        * @param {Point} p the other point
51340        * @return {Number} distance
51341        */
51342       dist: function(p) {
51343           return Math.sqrt(this.distSqr(p));
51344       },
51345
51346       /**
51347        * Calculate the distance from this point to another point,
51348        * without the square root step. Useful if you're comparing
51349        * relative distances.
51350        * @param {Point} p the other point
51351        * @return {Number} distance
51352        */
51353       distSqr: function(p) {
51354           var dx = p.x - this.x,
51355               dy = p.y - this.y;
51356           return dx * dx + dy * dy;
51357       },
51358
51359       /**
51360        * Get the angle from the 0, 0 coordinate to this point, in radians
51361        * coordinates.
51362        * @return {Number} angle
51363        */
51364       angle: function() {
51365           return Math.atan2(this.y, this.x);
51366       },
51367
51368       /**
51369        * Get the angle from this point to another point, in radians
51370        * @param {Point} b the other point
51371        * @return {Number} angle
51372        */
51373       angleTo: function(b) {
51374           return Math.atan2(this.y - b.y, this.x - b.x);
51375       },
51376
51377       /**
51378        * Get the angle between this point and another point, in radians
51379        * @param {Point} b the other point
51380        * @return {Number} angle
51381        */
51382       angleWith: function(b) {
51383           return this.angleWithSep(b.x, b.y);
51384       },
51385
51386       /*
51387        * Find the angle of the two vectors, solving the formula for
51388        * the cross product a x b = |a||b|sin(θ) for θ.
51389        * @param {Number} x the x-coordinate
51390        * @param {Number} y the y-coordinate
51391        * @return {Number} the angle in radians
51392        */
51393       angleWithSep: function(x, y) {
51394           return Math.atan2(
51395               this.x * y - this.y * x,
51396               this.x * x + this.y * y);
51397       },
51398
51399       _matMult: function(m) {
51400           var x = m[0] * this.x + m[1] * this.y,
51401               y = m[2] * this.x + m[3] * this.y;
51402           this.x = x;
51403           this.y = y;
51404           return this;
51405       },
51406
51407       _add: function(p) {
51408           this.x += p.x;
51409           this.y += p.y;
51410           return this;
51411       },
51412
51413       _sub: function(p) {
51414           this.x -= p.x;
51415           this.y -= p.y;
51416           return this;
51417       },
51418
51419       _mult: function(k) {
51420           this.x *= k;
51421           this.y *= k;
51422           return this;
51423       },
51424
51425       _div: function(k) {
51426           this.x /= k;
51427           this.y /= k;
51428           return this;
51429       },
51430
51431       _multByPoint: function(p) {
51432           this.x *= p.x;
51433           this.y *= p.y;
51434           return this;
51435       },
51436
51437       _divByPoint: function(p) {
51438           this.x /= p.x;
51439           this.y /= p.y;
51440           return this;
51441       },
51442
51443       _unit: function() {
51444           this._div(this.mag());
51445           return this;
51446       },
51447
51448       _perp: function() {
51449           var y = this.y;
51450           this.y = this.x;
51451           this.x = -y;
51452           return this;
51453       },
51454
51455       _rotate: function(angle) {
51456           var cos = Math.cos(angle),
51457               sin = Math.sin(angle),
51458               x = cos * this.x - sin * this.y,
51459               y = sin * this.x + cos * this.y;
51460           this.x = x;
51461           this.y = y;
51462           return this;
51463       },
51464
51465       _rotateAround: function(angle, p) {
51466           var cos = Math.cos(angle),
51467               sin = Math.sin(angle),
51468               x = p.x + cos * (this.x - p.x) - sin * (this.y - p.y),
51469               y = p.y + sin * (this.x - p.x) + cos * (this.y - p.y);
51470           this.x = x;
51471           this.y = y;
51472           return this;
51473       },
51474
51475       _round: function() {
51476           this.x = Math.round(this.x);
51477           this.y = Math.round(this.y);
51478           return this;
51479       }
51480   };
51481
51482   /**
51483    * Construct a point from an array if necessary, otherwise if the input
51484    * is already a Point, or an unknown type, return it unchanged
51485    * @param {Array<Number>|Point|*} a any kind of input value
51486    * @return {Point} constructed point, or passed-through value.
51487    * @example
51488    * // this
51489    * var point = Point.convert([0, 1]);
51490    * // is equivalent to
51491    * var point = new Point(0, 1);
51492    */
51493   Point.convert = function (a) {
51494       if (a instanceof Point) {
51495           return a;
51496       }
51497       if (Array.isArray(a)) {
51498           return new Point(a[0], a[1]);
51499       }
51500       return a;
51501   };
51502
51503   var vectortilefeature = VectorTileFeature;
51504
51505   function VectorTileFeature(pbf, end, extent, keys, values) {
51506       // Public
51507       this.properties = {};
51508       this.extent = extent;
51509       this.type = 0;
51510
51511       // Private
51512       this._pbf = pbf;
51513       this._geometry = -1;
51514       this._keys = keys;
51515       this._values = values;
51516
51517       pbf.readFields(readFeature, this, end);
51518   }
51519
51520   function readFeature(tag, feature, pbf) {
51521       if (tag == 1) feature.id = pbf.readVarint();
51522       else if (tag == 2) readTag(pbf, feature);
51523       else if (tag == 3) feature.type = pbf.readVarint();
51524       else if (tag == 4) feature._geometry = pbf.pos;
51525   }
51526
51527   function readTag(pbf, feature) {
51528       var end = pbf.readVarint() + pbf.pos;
51529
51530       while (pbf.pos < end) {
51531           var key = feature._keys[pbf.readVarint()],
51532               value = feature._values[pbf.readVarint()];
51533           feature.properties[key] = value;
51534       }
51535   }
51536
51537   VectorTileFeature.types = ['Unknown', 'Point', 'LineString', 'Polygon'];
51538
51539   VectorTileFeature.prototype.loadGeometry = function() {
51540       var pbf = this._pbf;
51541       pbf.pos = this._geometry;
51542
51543       var end = pbf.readVarint() + pbf.pos,
51544           cmd = 1,
51545           length = 0,
51546           x = 0,
51547           y = 0,
51548           lines = [],
51549           line;
51550
51551       while (pbf.pos < end) {
51552           if (length <= 0) {
51553               var cmdLen = pbf.readVarint();
51554               cmd = cmdLen & 0x7;
51555               length = cmdLen >> 3;
51556           }
51557
51558           length--;
51559
51560           if (cmd === 1 || cmd === 2) {
51561               x += pbf.readSVarint();
51562               y += pbf.readSVarint();
51563
51564               if (cmd === 1) { // moveTo
51565                   if (line) lines.push(line);
51566                   line = [];
51567               }
51568
51569               line.push(new pointGeometry(x, y));
51570
51571           } else if (cmd === 7) {
51572
51573               // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90
51574               if (line) {
51575                   line.push(line[0].clone()); // closePolygon
51576               }
51577
51578           } else {
51579               throw new Error('unknown command ' + cmd);
51580           }
51581       }
51582
51583       if (line) lines.push(line);
51584
51585       return lines;
51586   };
51587
51588   VectorTileFeature.prototype.bbox = function() {
51589       var pbf = this._pbf;
51590       pbf.pos = this._geometry;
51591
51592       var end = pbf.readVarint() + pbf.pos,
51593           cmd = 1,
51594           length = 0,
51595           x = 0,
51596           y = 0,
51597           x1 = Infinity,
51598           x2 = -Infinity,
51599           y1 = Infinity,
51600           y2 = -Infinity;
51601
51602       while (pbf.pos < end) {
51603           if (length <= 0) {
51604               var cmdLen = pbf.readVarint();
51605               cmd = cmdLen & 0x7;
51606               length = cmdLen >> 3;
51607           }
51608
51609           length--;
51610
51611           if (cmd === 1 || cmd === 2) {
51612               x += pbf.readSVarint();
51613               y += pbf.readSVarint();
51614               if (x < x1) x1 = x;
51615               if (x > x2) x2 = x;
51616               if (y < y1) y1 = y;
51617               if (y > y2) y2 = y;
51618
51619           } else if (cmd !== 7) {
51620               throw new Error('unknown command ' + cmd);
51621           }
51622       }
51623
51624       return [x1, y1, x2, y2];
51625   };
51626
51627   VectorTileFeature.prototype.toGeoJSON = function(x, y, z) {
51628       var size = this.extent * Math.pow(2, z),
51629           x0 = this.extent * x,
51630           y0 = this.extent * y,
51631           coords = this.loadGeometry(),
51632           type = VectorTileFeature.types[this.type],
51633           i, j;
51634
51635       function project(line) {
51636           for (var j = 0; j < line.length; j++) {
51637               var p = line[j], y2 = 180 - (p.y + y0) * 360 / size;
51638               line[j] = [
51639                   (p.x + x0) * 360 / size - 180,
51640                   360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90
51641               ];
51642           }
51643       }
51644
51645       switch (this.type) {
51646       case 1:
51647           var points = [];
51648           for (i = 0; i < coords.length; i++) {
51649               points[i] = coords[i][0];
51650           }
51651           coords = points;
51652           project(coords);
51653           break;
51654
51655       case 2:
51656           for (i = 0; i < coords.length; i++) {
51657               project(coords[i]);
51658           }
51659           break;
51660
51661       case 3:
51662           coords = classifyRings(coords);
51663           for (i = 0; i < coords.length; i++) {
51664               for (j = 0; j < coords[i].length; j++) {
51665                   project(coords[i][j]);
51666               }
51667           }
51668           break;
51669       }
51670
51671       if (coords.length === 1) {
51672           coords = coords[0];
51673       } else {
51674           type = 'Multi' + type;
51675       }
51676
51677       var result = {
51678           type: "Feature",
51679           geometry: {
51680               type: type,
51681               coordinates: coords
51682           },
51683           properties: this.properties
51684       };
51685
51686       if ('id' in this) {
51687           result.id = this.id;
51688       }
51689
51690       return result;
51691   };
51692
51693   // classifies an array of rings into polygons with outer rings and holes
51694
51695   function classifyRings(rings) {
51696       var len = rings.length;
51697
51698       if (len <= 1) return [rings];
51699
51700       var polygons = [],
51701           polygon,
51702           ccw;
51703
51704       for (var i = 0; i < len; i++) {
51705           var area = signedArea(rings[i]);
51706           if (area === 0) continue;
51707
51708           if (ccw === undefined) ccw = area < 0;
51709
51710           if (ccw === area < 0) {
51711               if (polygon) polygons.push(polygon);
51712               polygon = [rings[i]];
51713
51714           } else {
51715               polygon.push(rings[i]);
51716           }
51717       }
51718       if (polygon) polygons.push(polygon);
51719
51720       return polygons;
51721   }
51722
51723   function signedArea(ring) {
51724       var sum = 0;
51725       for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {
51726           p1 = ring[i];
51727           p2 = ring[j];
51728           sum += (p2.x - p1.x) * (p1.y + p2.y);
51729       }
51730       return sum;
51731   }
51732
51733   var vectortilelayer = VectorTileLayer;
51734
51735   function VectorTileLayer(pbf, end) {
51736       // Public
51737       this.version = 1;
51738       this.name = null;
51739       this.extent = 4096;
51740       this.length = 0;
51741
51742       // Private
51743       this._pbf = pbf;
51744       this._keys = [];
51745       this._values = [];
51746       this._features = [];
51747
51748       pbf.readFields(readLayer, this, end);
51749
51750       this.length = this._features.length;
51751   }
51752
51753   function readLayer(tag, layer, pbf) {
51754       if (tag === 15) layer.version = pbf.readVarint();
51755       else if (tag === 1) layer.name = pbf.readString();
51756       else if (tag === 5) layer.extent = pbf.readVarint();
51757       else if (tag === 2) layer._features.push(pbf.pos);
51758       else if (tag === 3) layer._keys.push(pbf.readString());
51759       else if (tag === 4) layer._values.push(readValueMessage(pbf));
51760   }
51761
51762   function readValueMessage(pbf) {
51763       var value = null,
51764           end = pbf.readVarint() + pbf.pos;
51765
51766       while (pbf.pos < end) {
51767           var tag = pbf.readVarint() >> 3;
51768
51769           value = tag === 1 ? pbf.readString() :
51770               tag === 2 ? pbf.readFloat() :
51771               tag === 3 ? pbf.readDouble() :
51772               tag === 4 ? pbf.readVarint64() :
51773               tag === 5 ? pbf.readVarint() :
51774               tag === 6 ? pbf.readSVarint() :
51775               tag === 7 ? pbf.readBoolean() : null;
51776       }
51777
51778       return value;
51779   }
51780
51781   // return feature `i` from this layer as a `VectorTileFeature`
51782   VectorTileLayer.prototype.feature = function(i) {
51783       if (i < 0 || i >= this._features.length) throw new Error('feature index out of bounds');
51784
51785       this._pbf.pos = this._features[i];
51786
51787       var end = this._pbf.readVarint() + this._pbf.pos;
51788       return new vectortilefeature(this._pbf, end, this.extent, this._keys, this._values);
51789   };
51790
51791   var vectortile = VectorTile;
51792
51793   function VectorTile(pbf, end) {
51794       this.layers = pbf.readFields(readTile, {}, end);
51795   }
51796
51797   function readTile(tag, layers, pbf) {
51798       if (tag === 3) {
51799           var layer = new vectortilelayer(pbf, pbf.readVarint() + pbf.pos);
51800           if (layer.length) layers[layer.name] = layer;
51801       }
51802   }
51803
51804   var VectorTile$1 = vectortile;
51805   var VectorTileFeature$1 = vectortilefeature;
51806   var VectorTileLayer$1 = vectortilelayer;
51807
51808   var vectorTile = {
51809         VectorTile: VectorTile$1,
51810         VectorTileFeature: VectorTileFeature$1,
51811         VectorTileLayer: VectorTileLayer$1
51812   };
51813
51814   var tiler$4 = utilTiler().tileSize(512).margin(1);
51815   var dispatch$5 = dispatch('loadedData');
51816   var _vtCache;
51817
51818
51819   function abortRequest$4(i) {
51820       i.abort();
51821   }
51822
51823
51824   function vtToGeoJSON(data, tile, mergeCache) {
51825       var vectorTile$$1 = new vectorTile.VectorTile(new pbf(data.response));
51826       var layers = Object.keys(vectorTile$$1.layers);
51827       if (!Array.isArray(layers)) { layers = [layers]; }
51828
51829       var features = [];
51830       layers.forEach(function(layerID) {
51831           var layer = vectorTile$$1.layers[layerID];
51832           if (layer) {
51833               for (var i = 0; i < layer.length; i++) {
51834                   var feature = layer.feature(i).toGeoJSON(tile.xyz[0], tile.xyz[1], tile.xyz[2]);
51835                   var geometry = feature.geometry;
51836
51837                   // Treat all Polygons as MultiPolygons
51838                   if (geometry.type === 'Polygon') {
51839                       geometry.type = 'MultiPolygon';
51840                       geometry.coordinates = [geometry.coordinates];
51841                   }
51842
51843                   // Clip to tile bounds
51844                   if (geometry.type === 'MultiPolygon') {
51845                       var isClipped = false;
51846                       var featureClip = turf_bboxClip(feature, tile.extent.rectangle());
51847                       if (!isEqual(feature.geometry, featureClip.geometry)) {
51848                           // feature = featureClip;
51849                           isClipped = true;
51850                       }
51851                       if (!feature.geometry.coordinates.length) continue;   // not actually on this tile
51852                       if (!feature.geometry.coordinates[0].length) continue;   // not actually on this tile
51853                   }
51854
51855                   // Generate some unique IDs and add some metadata
51856                   var featurehash = utilHashcode(fastJsonStableStringify(feature));
51857                   var propertyhash = utilHashcode(fastJsonStableStringify(feature.properties || {}));
51858                   feature.__layerID__ = layerID.replace(/[^_a-zA-Z0-9\-]/g, '_');
51859                   feature.__featurehash__ = featurehash;
51860                   feature.__propertyhash__ = propertyhash;
51861                   features.push(feature);
51862
51863                   // Clipped Polygons at same zoom with identical properties can get merged
51864                   if (isClipped && geometry.type === 'MultiPolygon') {
51865                       var merged = mergeCache[propertyhash];
51866                       if (merged && merged.length) {
51867                           var other = merged[0];
51868                           var coords = martinez.union(
51869                               feature.geometry.coordinates, other.geometry.coordinates
51870                           );
51871
51872                           if (!coords || !coords.length) {
51873                               continue;  // something failed in martinez union
51874                           }
51875
51876                           merged.push(feature);
51877                           for (var j = 0; j < merged.length; j++) {      // all these features get...
51878                               merged[j].geometry.coordinates = coords;   // same coords
51879                               merged[j].__featurehash__ = featurehash;   // same hash, so deduplication works
51880                           }
51881                       } else {
51882                           mergeCache[propertyhash] = [feature];
51883                       }
51884                   }
51885               }
51886           }
51887       });
51888
51889       return features;
51890   }
51891
51892
51893   function loadTile(source, tile) {
51894       if (source.loaded[tile.id] || source.inflight[tile.id]) return;
51895
51896       var url = source.template
51897           .replace('{x}', tile.xyz[0])
51898           .replace('{y}', tile.xyz[1])
51899           // TMS-flipped y coordinate
51900           .replace(/\{[t-]y\}/, Math.pow(2, tile.xyz[2]) - tile.xyz[1] - 1)
51901           .replace(/\{z(oom)?\}/, tile.xyz[2])
51902           .replace(/\{switch:([^}]+)\}/, function(s, r) {
51903               var subdomains = r.split(',');
51904               return subdomains[(tile.xyz[0] + tile.xyz[1]) % subdomains.length];
51905           });
51906
51907       source.inflight[tile.id] = request(url)
51908           .responseType('arraybuffer')
51909           .get(function(err, data) {
51910               source.loaded[tile.id] = [];
51911               delete source.inflight[tile.id];
51912               if (err || !data) return;
51913
51914               var z = tile.xyz[2];
51915               if (!source.canMerge[z]) {
51916                   source.canMerge[z] = {};  // initialize mergeCache
51917               }
51918
51919               source.loaded[tile.id] = vtToGeoJSON(data, tile, source.canMerge[z]);
51920               dispatch$5.call('loadedData');
51921           });
51922   }
51923
51924
51925   var serviceVectorTile = {
51926
51927       init: function() {
51928           if (!_vtCache) {
51929               this.reset();
51930           }
51931
51932           this.event = utilRebind(this, dispatch$5, 'on');
51933       },
51934
51935
51936       reset: function() {
51937           for (var sourceID in _vtCache) {
51938               var source = _vtCache[sourceID];
51939               if (source && source.inflight) {
51940                   forEach(source.inflight, abortRequest$4);
51941               }
51942           }
51943
51944           _vtCache = {};
51945       },
51946
51947
51948       addSource: function(sourceID, template) {
51949           _vtCache[sourceID] = { template: template, inflight: {}, loaded: {}, canMerge: {} };
51950           return _vtCache[sourceID];
51951       },
51952
51953
51954       data: function(sourceID, projection) {
51955           var source = _vtCache[sourceID];
51956           if (!source) return [];
51957
51958           var tiles = tiler$4.getTiles(projection);
51959           var seen = {};
51960           var results = [];
51961
51962           for (var i = 0; i < tiles.length; i++) {
51963               var features = source.loaded[tiles[i].id];
51964               if (!features || !features.length) continue;
51965
51966               for (var j = 0; j < features.length; j++) {
51967                   var feature = features[j];
51968                   var hash = feature.__featurehash__;
51969                   if (seen[hash]) continue;
51970                   seen[hash] = true;
51971
51972                   // return a shallow clone, because the hash may change
51973                   // later if this feature gets merged with another
51974                   results.push(clone(feature));
51975               }
51976           }
51977
51978           return results;
51979       },
51980
51981
51982       loadTiles: function(sourceID, template, projection) {
51983           var source = _vtCache[sourceID];
51984           if (!source) {
51985               source = this.addSource(sourceID, template);
51986           }
51987
51988           var tiles = tiler$4.getTiles(projection);
51989
51990           // abort inflight requests that are no longer needed
51991           forEach(source.inflight, function(v, k) {
51992               var wanted = find$1(tiles, function(tile) { return k === tile.id; });
51993
51994               if (!wanted) {
51995                   abortRequest$4(v);
51996                   delete source.inflight[k];
51997               }
51998           });
51999
52000           tiles.forEach(function(tile) {
52001               loadTile(source, tile);
52002           });
52003       },
52004
52005
52006       cache: function() {
52007           return _vtCache;
52008       }
52009
52010   };
52011
52012   var endpoint = 'https://www.wikidata.org/w/api.php?';
52013   var _wikidataCache = {};
52014
52015   var serviceWikidata = {
52016
52017       init: function() {},
52018
52019       reset: function() {
52020           _wikidataCache = {};
52021       },
52022
52023
52024       // Given a Wikipedia language and article title, return an array of
52025       // corresponding Wikidata entities.
52026       itemsByTitle: function(lang, title, callback) {
52027           if (!title) {
52028               callback('', {});
52029               return;
52030           }
52031
52032           lang = lang || 'en';
52033           d3_json(endpoint + utilQsString({
52034               action: 'wbgetentities',
52035               format: 'json',
52036               sites: lang.replace(/-/g, '_') + 'wiki',
52037               titles: title,
52038               languages: 'en', // shrink response by filtering to one language
52039               origin: '*'
52040           }), function(err, data) {
52041               if (err || !data || data.error) {
52042                   callback('', {});
52043               } else {
52044                   callback(title, data.entities || {});
52045               }
52046           });
52047       },
52048
52049       entityByQID: function(qid, callback) {
52050           if (!qid) {
52051               callback('', {});
52052               return;
52053           }
52054           if (_wikidataCache[qid]) {
52055               callback('', _wikidataCache[qid]);
52056               return;
52057           }
52058
52059           var lang = currentLocale.replace(/-/g, '_');
52060
52061           d3_json(endpoint + utilQsString({
52062               action: 'wbgetentities',
52063               format: 'json',
52064               ids: qid,
52065               props: /*sitelinks|*/'labels|descriptions',
52066               //sitefilter: lang + 'wiki',
52067               languages: lang,
52068               languagefallback: 1,
52069               origin: '*'
52070           }), function(err, data) {
52071               if (err || !data || data.error) {
52072                   callback('', {});
52073               } else {
52074                   _wikidataCache[qid] = data.entities[qid];
52075                   callback(qid, data.entities[qid] || {});
52076               }
52077           });
52078       }
52079
52080   };
52081
52082   var endpoint$1 = 'https://en.wikipedia.org/w/api.php?';
52083
52084   var serviceWikipedia = {
52085
52086       init: function() {},
52087       reset: function() {},
52088
52089
52090       search: function(lang, query, callback) {
52091           if (!query) {
52092               callback('', []);
52093               return;
52094           }
52095
52096           lang = lang || 'en';
52097           d3_json(endpoint$1.replace('en', lang) +
52098               utilQsString({
52099                   action: 'query',
52100                   list: 'search',
52101                   srlimit: '10',
52102                   srinfo: 'suggestion',
52103                   format: 'json',
52104                   origin: '*',
52105                   srsearch: query
52106               }), function(err, data) {
52107                   if (err || !data || !data.query || !data.query.search || data.error) {
52108                       callback('', []);
52109                   } else {
52110                       var results = data.query.search.map(function(d) { return d.title; });
52111                       callback(query, results);
52112                   }
52113               }
52114           );
52115       },
52116
52117
52118       suggestions: function(lang, query, callback) {
52119           if (!query) {
52120               callback('', []);
52121               return;
52122           }
52123
52124           lang = lang || 'en';
52125           d3_json(endpoint$1.replace('en', lang) +
52126               utilQsString({
52127                   action: 'opensearch',
52128                   namespace: 0,
52129                   suggest: '',
52130                   format: 'json',
52131                   origin: '*',
52132                   search: query
52133               }), function(err, data) {
52134                   if (err || !data || data.error) {
52135                       callback('', []);
52136                   } else {
52137                       callback(data[0], data[1] || []);
52138                   }
52139               }
52140           );
52141       },
52142
52143
52144       translations: function(lang, title, callback) {
52145           if (!title) {
52146               callback({});
52147               return;
52148           }
52149
52150           d3_json(endpoint$1.replace('en', lang) +
52151               utilQsString({
52152                   action: 'query',
52153                   prop: 'langlinks',
52154                   format: 'json',
52155                   origin: '*',
52156                   lllimit: 500,
52157                   titles: title
52158               }), function(err, data) {
52159                   if (err || !data || !data.query || !data.query.pages || data.error) {
52160                       callback({});
52161                   } else {
52162                       var list = data.query.pages[Object.keys(data.query.pages)[0]],
52163                           translations = {};
52164                       if (list && list.langlinks) {
52165                           list.langlinks.forEach(function(d) {
52166                               translations[d.lang] = d['*'];
52167                           });
52168                       }
52169                       callback(translations);
52170                   }
52171               }
52172           );
52173       }
52174
52175   };
52176
52177   var services = {
52178       geocoder: serviceNominatim,
52179       mapillary: serviceMapillary,
52180       openstreetcam: serviceOpenstreetcam,
52181       osm: serviceOsm,
52182       streetside: serviceStreetside,
52183       taginfo: serviceTaginfo,
52184       vectorTile: serviceVectorTile,
52185       wikidata: serviceWikidata,
52186       wikipedia: serviceWikipedia
52187   };
52188
52189   function modeAddNote$$1(context) {
52190       var mode = {
52191           id: 'add-note',
52192           button: 'note',
52193           title: t('modes.add_note.title'),
52194           description: t('modes.add_note.description'),
52195           key: '4'
52196       };
52197
52198       var behavior = behaviorDraw(context)
52199           .tail(t('modes.add_note.tail'))
52200           .on('click', add)
52201           .on('cancel', cancel)
52202           .on('finish', cancel);
52203
52204
52205       function add(loc) {
52206           var osm = services.osm;
52207           if (!osm) return;
52208
52209           var note = osmNote({ loc: loc, status: 'open', comments: [] });
52210           osm.replaceNote(note);
52211
52212           // force a reraw (there is no history change that would otherwise do this)
52213           context.pan([0,0]);
52214
52215           context
52216               .selectedNoteID(note.id)
52217               .enter(modeSelectNote$$1(context, note.id).newFeature(true));
52218       }
52219
52220
52221       function cancel() {
52222           context.enter(modeBrowse(context));
52223       }
52224
52225
52226       mode.enter = function() {
52227           context.install(behavior);
52228       };
52229
52230
52231       mode.exit = function() {
52232           context.uninstall(behavior);
52233       };
52234
52235
52236       return mode;
52237   }
52238
52239   /* Built-in method references for those with the same name as other `lodash` methods. */
52240   var nativeMin$1 = Math.min;
52241
52242   /**
52243    * The base implementation of methods like `_.intersection`, without support
52244    * for iteratee shorthands, that accepts an array of arrays to inspect.
52245    *
52246    * @private
52247    * @param {Array} arrays The arrays to inspect.
52248    * @param {Function} [iteratee] The iteratee invoked per element.
52249    * @param {Function} [comparator] The comparator invoked per element.
52250    * @returns {Array} Returns the new array of shared values.
52251    */
52252   function baseIntersection(arrays, iteratee, comparator) {
52253     var includes = comparator ? arrayIncludesWith : arrayIncludes,
52254         length = arrays[0].length,
52255         othLength = arrays.length,
52256         othIndex = othLength,
52257         caches = Array(othLength),
52258         maxLength = Infinity,
52259         result = [];
52260
52261     while (othIndex--) {
52262       var array = arrays[othIndex];
52263       if (othIndex && iteratee) {
52264         array = arrayMap(array, baseUnary(iteratee));
52265       }
52266       maxLength = nativeMin$1(array.length, maxLength);
52267       caches[othIndex] = !comparator && (iteratee || (length >= 120 && array.length >= 120))
52268         ? new SetCache(othIndex && array)
52269         : undefined;
52270     }
52271     array = arrays[0];
52272
52273     var index = -1,
52274         seen = caches[0];
52275
52276     outer:
52277     while (++index < length && result.length < maxLength) {
52278       var value = array[index],
52279           computed = iteratee ? iteratee(value) : value;
52280
52281       value = (comparator || value !== 0) ? value : 0;
52282       if (!(seen
52283             ? cacheHas(seen, computed)
52284             : includes(result, computed, comparator)
52285           )) {
52286         othIndex = othLength;
52287         while (--othIndex) {
52288           var cache = caches[othIndex];
52289           if (!(cache
52290                 ? cacheHas(cache, computed)
52291                 : includes(arrays[othIndex], computed, comparator))
52292               ) {
52293             continue outer;
52294           }
52295         }
52296         if (seen) {
52297           seen.push(computed);
52298         }
52299         result.push(value);
52300       }
52301     }
52302     return result;
52303   }
52304
52305   /**
52306    * Casts `value` to an empty array if it's not an array like object.
52307    *
52308    * @private
52309    * @param {*} value The value to inspect.
52310    * @returns {Array|Object} Returns the cast array-like object.
52311    */
52312   function castArrayLikeObject(value) {
52313     return isArrayLikeObject(value) ? value : [];
52314   }
52315
52316   /**
52317    * Creates an array of unique values that are included in all given arrays
52318    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
52319    * for equality comparisons. The order and references of result values are
52320    * determined by the first array.
52321    *
52322    * @static
52323    * @memberOf _
52324    * @since 0.1.0
52325    * @category Array
52326    * @param {...Array} [arrays] The arrays to inspect.
52327    * @returns {Array} Returns the new array of intersecting values.
52328    * @example
52329    *
52330    * _.intersection([2, 1], [2, 3]);
52331    * // => [2]
52332    */
52333   var intersection = baseRest(function(arrays) {
52334     var mapped = arrayMap(arrays, castArrayLikeObject);
52335     return (mapped.length && mapped[0] === arrays[0])
52336       ? baseIntersection(mapped)
52337       : [];
52338   });
52339
52340   function modeDragNode$$1(context) {
52341       var mode = {
52342           id: 'drag-node',
52343           button: 'browse'
52344       };
52345       var hover = behaviorHover(context).altDisables(true)
52346           .on('hover', context.ui().sidebar.hover);
52347       var edit = behaviorEdit(context);
52348
52349       var _nudgeInterval;
52350       var _restoreSelectedIDs = [];
52351       var _wasMidpoint = false;
52352       var _isCancelled = false;
52353       var _activeEntity;
52354       var _startLoc;
52355       var _lastLoc;
52356
52357
52358       function startNudge(entity, nudge) {
52359           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
52360           _nudgeInterval = window.setInterval(function() {
52361               context.pan(nudge);
52362               doMove(entity, nudge);
52363           }, 50);
52364       }
52365
52366
52367       function stopNudge() {
52368           if (_nudgeInterval) {
52369               window.clearInterval(_nudgeInterval);
52370               _nudgeInterval = null;
52371           }
52372       }
52373
52374
52375       function moveAnnotation(entity) {
52376           return t('operations.move.annotation.' + entity.geometry(context.graph()));
52377       }
52378
52379
52380       function connectAnnotation(nodeEntity, targetEntity) {
52381           var nodeGeometry = nodeEntity.geometry(context.graph());
52382           var targetGeometry = targetEntity.geometry(context.graph());
52383           if (nodeGeometry === 'vertex' && targetGeometry === 'vertex') {
52384               var nodeParentWayIDs = context.graph().parentWays(nodeEntity);
52385               var targetParentWayIDs = context.graph().parentWays(targetEntity);
52386               var sharedParentWays = intersection(nodeParentWayIDs, targetParentWayIDs);
52387               // if both vertices are part of the same way
52388               if (sharedParentWays.length !== 0) {
52389                   // if the nodes are next to each other, they are merged
52390                   if (sharedParentWays[0].areAdjacent(nodeEntity.id, targetEntity.id)) {
52391                       return t('operations.connect.annotation.from_vertex.to_adjacent_vertex');
52392                   }
52393                   return t('operations.connect.annotation.from_vertex.to_sibling_vertex');
52394               }
52395           }
52396           return t('operations.connect.annotation.from_' + nodeGeometry + '.to_' + targetGeometry);
52397       }
52398
52399
52400       function origin(entity) {
52401           return context.projection(entity.loc);
52402       }
52403
52404
52405       function keydown() {
52406           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
52407               if (context.surface().classed('nope')) {
52408                   context.surface()
52409                       .classed('nope-suppressed', true);
52410               }
52411               context.surface()
52412                   .classed('nope', false)
52413                   .classed('nope-disabled', true);
52414           }
52415       }
52416
52417
52418       function keyup() {
52419           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
52420               if (context.surface().classed('nope-suppressed')) {
52421                   context.surface()
52422                       .classed('nope', true);
52423               }
52424               context.surface()
52425                   .classed('nope-suppressed', false)
52426                   .classed('nope-disabled', false);
52427           }
52428       }
52429
52430
52431       function start(entity) {
52432           _wasMidpoint = entity.type === 'midpoint';
52433           var hasHidden = context.features().hasHiddenConnections(entity, context.graph());
52434           _isCancelled = event.sourceEvent.shiftKey || hasHidden;
52435
52436
52437           if (_isCancelled) {
52438               if (hasHidden) {
52439                   uiFlash()
52440                       .duration(4000)
52441                       .text(t('modes.drag_node.connected_to_hidden'))();
52442               }
52443               return drag.cancel();
52444           }
52445
52446           if (_wasMidpoint) {
52447               var midpoint = entity;
52448               entity = osmNode();
52449               context.perform(actionAddMidpoint(midpoint, entity));
52450               entity = context.entity(entity.id);   // get post-action entity
52451
52452               var vertex = context.surface().selectAll('.' + entity.id);
52453               drag.target(vertex.node(), entity);
52454
52455           } else {
52456               context.perform(actionNoop());
52457           }
52458
52459           _activeEntity = entity;
52460           _startLoc = entity.loc;
52461
52462           context.surface().selectAll('.' + _activeEntity.id)
52463               .classed('active', true);
52464
52465           context.enter(mode);
52466       }
52467
52468
52469       // related code
52470       // - `behavior/draw.js` `datum()`
52471       function datum() {
52472           var event$$1 = event && event.sourceEvent;
52473           if (!event$$1 || event$$1.altKey) {
52474               return {};
52475           } else {
52476               // When dragging, snap only to touch targets..
52477               // (this excludes area fills and active drawing elements)
52478               var d = event$$1.target.__data__;
52479               return (d && d.properties && d.properties.target) ? d : {};
52480           }
52481       }
52482
52483
52484       function doMove(entity, nudge) {
52485           nudge = nudge || [0, 0];
52486
52487           var currPoint = (event && event.point) || context.projection(_lastLoc);
52488           var currMouse = geoVecSubtract(currPoint, nudge);
52489           var loc = context.projection.invert(currMouse);
52490
52491           if (!_nudgeInterval) {   // If not nudging at the edge of the viewport, try to snap..
52492               // related code
52493               // - `mode/drag_node.js`     `doMode()`
52494               // - `behavior/draw.js`      `click()`
52495               // - `behavior/draw_way.js`  `move()`
52496               var d = datum();
52497               var target = d && d.properties && d.properties.entity;
52498               var targetLoc = target && target.loc;
52499               var targetNodes = d && d.properties && d.properties.nodes;
52500               var edge;
52501
52502               if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
52503                   loc = targetLoc;
52504
52505               } else if (targetNodes) {   // snap to way - a line target with `.nodes`
52506                   edge = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
52507                   if (edge) {
52508                       loc = edge.loc;
52509                   }
52510               }
52511           }
52512
52513           context.replace(
52514               actionMoveNode(entity.id, loc),
52515               moveAnnotation(entity)
52516           );
52517
52518           // Below here: validations
52519           var isInvalid = false;
52520
52521           // Check if this connection to `target` could cause relations to break..
52522           if (target) {
52523               isInvalid = hasRelationConflict(entity, target, edge, context.graph());
52524           }
52525
52526           // Check if this drag causes the geometry to break..
52527           if (!isInvalid) {
52528               isInvalid = hasInvalidGeometry(entity, context.graph());
52529           }
52530
52531
52532           var nope = context.surface().classed('nope');
52533           if (isInvalid === 'relation' || isInvalid === 'restriction') {
52534               if (!nope) {   // about to nope - show hint
52535                   uiFlash()
52536                       .duration(4000)
52537                       .text(t('operations.connect.' + isInvalid,
52538                           { relation: context.presets().item('type/restriction').name() }
52539                       ))();
52540               }
52541           } else {
52542               if (nope) {   // about to un-nope, remove hint
52543                   uiFlash()
52544                       .duration(1)
52545                       .text('')();
52546               }
52547           }
52548
52549
52550           var nopeDisabled = context.surface().classed('nope-disabled');
52551           if (nopeDisabled) {
52552               context.surface()
52553                   .classed('nope', false)
52554                   .classed('nope-suppressed', isInvalid);
52555           } else {
52556               context.surface()
52557                   .classed('nope', isInvalid)
52558                   .classed('nope-suppressed', false);
52559           }
52560
52561           _lastLoc = loc;
52562       }
52563
52564
52565       // Uses `actionConnect.disabled()` to know whether this connection is ok..
52566       function hasRelationConflict(entity, target, edge, graph) {
52567           var testGraph = graph.update();  // copy
52568
52569           // if snapping to way - add midpoint there and consider that the target..
52570           if (edge) {
52571               var midpoint = osmNode();
52572               var action = actionAddMidpoint({
52573                   loc: edge.loc,
52574                   edge: [target.nodes[edge.index - 1], target.nodes[edge.index]]
52575               }, midpoint);
52576
52577               testGraph = action(testGraph);
52578               target = midpoint;
52579           }
52580
52581           // can we connect to it?
52582           var ids = [entity.id, target.id];
52583           return actionConnect(ids).disabled(testGraph);
52584       }
52585
52586
52587       function hasInvalidGeometry(entity, graph) {
52588           var parents = graph.parentWays(entity);
52589           var i, j, k;
52590
52591           for (i = 0; i < parents.length; i++) {
52592               var parent = parents[i];
52593               var nodes = [];
52594               var activeIndex = null;    // which multipolygon ring contains node being dragged
52595
52596               // test any parent multipolygons for valid geometry
52597               var relations = graph.parentRelations(parent);
52598               for (j = 0; j < relations.length; j++) {
52599                   if (!relations[j].isMultipolygon()) continue;
52600
52601                   var rings = osmJoinWays(relations[j].members, graph);
52602
52603                   // find active ring and test it for self intersections
52604                   for (k = 0; k < rings.length; k++) {
52605                       nodes = rings[k].nodes;
52606                       if (find$1(nodes, function(n) { return n.id === entity.id; })) {
52607                           activeIndex = k;
52608                           if (geoHasSelfIntersections(nodes, entity.id)) {
52609                               return true;
52610                           }
52611                       }
52612                       rings[k].coords = nodes.map(function(n) { return n.loc; });
52613                   }
52614
52615                   // test active ring for intersections with other rings in the multipolygon
52616                   for (k = 0; k < rings.length; k++) {
52617                       if (k === activeIndex) continue;
52618
52619                       // make sure active ring doesnt cross passive rings
52620                       if (geoHasLineIntersections(rings[activeIndex].nodes, rings[k].nodes, entity.id)) {
52621                           return true;
52622                       }
52623                   }
52624               }
52625
52626
52627               // If we still haven't tested this node's parent way for self-intersections.
52628               // (because it's not a member of a multipolygon), test it now.
52629               if (activeIndex === null) {
52630                   nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
52631                   if (nodes.length && geoHasSelfIntersections(nodes, entity.id)) {
52632                       return true;
52633                   }
52634               }
52635
52636           }
52637
52638           return false;
52639       }
52640
52641
52642       function move(entity) {
52643           if (_isCancelled) return;
52644           event.sourceEvent.stopPropagation();
52645
52646           context.surface().classed('nope-disabled', event.sourceEvent.altKey);
52647
52648           _lastLoc = context.projection.invert(event.point);
52649
52650           doMove(entity);
52651           var nudge = geoViewportEdge(event.point, context.map().dimensions());
52652           if (nudge) {
52653               startNudge(entity, nudge);
52654           } else {
52655               stopNudge();
52656           }
52657       }
52658
52659
52660       function end(entity) {
52661           if (_isCancelled) return;
52662
52663           var d = datum();
52664           var nope = (d && d.properties && d.properties.nope) || context.surface().classed('nope');
52665           var target = d && d.properties && d.properties.entity;   // entity to snap to
52666
52667           if (nope) {   // bounce back
52668               context.perform(
52669                   _actionBounceBack(entity.id, _startLoc)
52670               );
52671
52672           } else if (target && target.type === 'way') {
52673               var choice = geoChooseEdge(context.childNodes(target), context.mouse(), context.projection, entity.id);
52674               context.replace(
52675                   actionAddMidpoint({
52676                       loc: choice.loc,
52677                       edge: [target.nodes[choice.index - 1], target.nodes[choice.index]]
52678                   }, entity),
52679                   connectAnnotation(entity, target)
52680               );
52681
52682           } else if (target && target.type === 'node') {
52683               context.replace(
52684                   actionConnect([target.id, entity.id]),
52685                   connectAnnotation(entity, target)
52686               );
52687
52688           } else if (_wasMidpoint) {
52689               context.replace(
52690                   actionNoop(),
52691                   t('operations.add.annotation.vertex')
52692               );
52693
52694           } else {
52695               context.replace(
52696                   actionNoop(),
52697                   moveAnnotation(entity)
52698               );
52699           }
52700
52701           var reselection = _restoreSelectedIDs.filter(function(id) {
52702               return context.graph().hasEntity(id);
52703           });
52704
52705           if (reselection.length) {
52706               context.enter(modeSelect(context, reselection));
52707           } else {
52708               context.enter(modeBrowse(context));
52709           }
52710       }
52711
52712
52713       function _actionBounceBack(nodeID, toLoc) {
52714           var moveNode = actionMoveNode(nodeID, toLoc);
52715           var action = function(graph, t$$1) {
52716               // last time through, pop off the bounceback perform.
52717               // it will then overwrite the initial perform with a moveNode that does nothing
52718               if (t$$1 === 1) context.pop();
52719               return moveNode(graph, t$$1);
52720           };
52721           action.transitionable = true;
52722           return action;
52723       }
52724
52725
52726       function cancel() {
52727           drag.cancel();
52728           context.enter(modeBrowse(context));
52729       }
52730
52731
52732       var drag = behaviorDrag()
52733           .selector('.layer-touch.points .target')
52734           .surface(select('#map').node())
52735           .origin(origin)
52736           .on('start', start)
52737           .on('move', move)
52738           .on('end', end);
52739
52740
52741       mode.enter = function() {
52742           context.install(hover);
52743           context.install(edit);
52744
52745           select(window)
52746               .on('keydown.drawWay', keydown)
52747               .on('keyup.drawWay', keyup);
52748
52749           context.history()
52750               .on('undone.drag-node', cancel);
52751       };
52752
52753
52754       mode.exit = function() {
52755           context.ui().sidebar.hover.cancel();
52756           context.uninstall(hover);
52757           context.uninstall(edit);
52758
52759           select(window)
52760               .on('keydown.hover', null)
52761               .on('keyup.hover', null);
52762
52763           context.history()
52764               .on('undone.drag-node', null);
52765
52766           _activeEntity = null;
52767
52768           context.surface()
52769               .classed('nope', false)
52770               .classed('nope-suppressed', false)
52771               .classed('nope-disabled', false)
52772               .selectAll('.active')
52773               .classed('active', false);
52774
52775           stopNudge();
52776       };
52777
52778
52779       mode.selectedIDs = function() {
52780           if (!arguments.length) return _activeEntity ? [_activeEntity.id] : [];
52781           // no assign
52782           return mode;
52783       };
52784
52785
52786       mode.activeID = function() {
52787           if (!arguments.length) return _activeEntity && _activeEntity.id;
52788           // no assign
52789           return mode;
52790       };
52791
52792
52793       mode.restoreSelectedIDs = function(_) {
52794           if (!arguments.length) return _restoreSelectedIDs;
52795           _restoreSelectedIDs = _;
52796           return mode;
52797       };
52798
52799
52800       mode.behavior = drag;
52801
52802
52803       return mode;
52804   }
52805
52806   function modeDragNote$$1(context) {
52807       var mode = {
52808           id: 'drag-note',
52809           button: 'browse'
52810       };
52811
52812       var edit = behaviorEdit(context);
52813
52814       var _nudgeInterval;
52815       var _lastLoc;
52816
52817
52818       function startNudge(note, nudge) {
52819           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
52820           _nudgeInterval = window.setInterval(function() {
52821               context.pan(nudge);
52822               doMove(note, nudge);
52823           }, 50);
52824       }
52825
52826
52827       function stopNudge() {
52828           if (_nudgeInterval) {
52829               window.clearInterval(_nudgeInterval);
52830               _nudgeInterval = null;
52831           }
52832       }
52833
52834
52835       function origin(note) {
52836           return context.projection(note.loc);
52837       }
52838
52839
52840       function start(note) {
52841           context.surface().selectAll('.note-' + note.id)
52842               .classed('active', true);
52843
52844           context.perform(actionNoop());
52845           context.enter(mode);
52846           context.selectedNoteID(note.id);
52847       }
52848
52849
52850       function move(note) {
52851           event.sourceEvent.stopPropagation();
52852           _lastLoc = context.projection.invert(event.point);
52853
52854           doMove(note);
52855           var nudge = geoViewportEdge(event.point, context.map().dimensions());
52856           if (nudge) {
52857               startNudge(note, nudge);
52858           } else {
52859               stopNudge();
52860           }
52861       }
52862
52863
52864       function doMove(note, nudge) {
52865           nudge = nudge || [0, 0];
52866
52867           var currPoint = (event && event.point) || context.projection(_lastLoc);
52868           var currMouse = geoVecSubtract(currPoint, nudge);
52869           var loc = context.projection.invert(currMouse);
52870
52871           note = note.move(loc);
52872
52873           var osm = services.osm;
52874           if (osm) {
52875               osm.replaceNote(note);  // update note cache
52876           }
52877
52878           context.replace(actionNoop());   // trigger redraw
52879       }
52880
52881
52882       function end(note) {
52883           context.replace(actionNoop());   // trigger redraw
52884
52885           context
52886               .selectedNoteID(note.id)
52887               .enter(modeSelectNote$$1(context, note.id));
52888       }
52889
52890
52891       var drag = behaviorDrag()
52892           .selector('.layer-notes .new')
52893           .surface(select('#map').node())
52894           .origin(origin)
52895           .on('start', start)
52896           .on('move', move)
52897           .on('end', end);
52898
52899
52900       mode.enter = function() {
52901           context.install(edit);
52902       };
52903
52904
52905       mode.exit = function() {
52906           context.ui().sidebar.hover.cancel();
52907           context.uninstall(edit);
52908
52909           context.surface()
52910               .selectAll('.active')
52911               .classed('active', false);
52912
52913           stopNudge();
52914       };
52915
52916       mode.behavior = drag;
52917
52918       return mode;
52919   }
52920
52921   function modeBrowse(context) {
52922       var mode = {
52923           button: 'browse',
52924           id: 'browse',
52925           title: t('modes.browse.title'),
52926           description: t('modes.browse.description')
52927       }, sidebar;
52928
52929       var behaviors = [
52930           behaviorPaste(context),
52931           behaviorHover(context).on('hover', context.ui().sidebar.hover),
52932           behaviorSelect(context),
52933           behaviorLasso(context),
52934           modeDragNode$$1(context).behavior,
52935           modeDragNote$$1(context).behavior
52936       ];
52937
52938
52939       mode.enter = function() {
52940           behaviors.forEach(context.install);
52941
52942           // Get focus on the body.
52943           if (document.activeElement && document.activeElement.blur) {
52944               document.activeElement.blur();
52945           }
52946
52947           if (sidebar) {
52948               context.ui().sidebar.show(sidebar);
52949           } else {
52950               context.ui().sidebar.select(null);
52951           }
52952       };
52953
52954
52955       mode.exit = function() {
52956           context.ui().sidebar.hover.cancel();
52957           behaviors.forEach(context.uninstall);
52958
52959           if (sidebar) {
52960               context.ui().sidebar.hide();
52961           }
52962       };
52963
52964
52965       mode.sidebar = function(_) {
52966           if (!arguments.length) return sidebar;
52967           sidebar = _;
52968           return mode;
52969       };
52970
52971
52972       return mode;
52973   }
52974
52975   function modeDrawArea(context, wayId, startGraph) {
52976       var mode = {
52977           button: 'area',
52978           id: 'draw-area'
52979       };
52980
52981       var behavior;
52982
52983
52984       mode.enter = function() {
52985           var way = context.entity(wayId);
52986
52987           behavior = behaviorDrawWay(context, wayId, undefined, mode, startGraph)
52988               .tail(t('modes.draw_area.tail'));
52989
52990           var addNode = behavior.addNode;
52991
52992           behavior.addNode = function(node, d) {
52993               var length = way.nodes.length;
52994               var penultimate = length > 2 ? way.nodes[length - 2] : null;
52995
52996               if (node.id === way.first() || node.id === penultimate) {
52997                   behavior.finish();
52998               } else {
52999                   addNode(node, d);
53000               }
53001           };
53002
53003           context.install(behavior);
53004       };
53005
53006
53007       mode.exit = function() {
53008           context.uninstall(behavior);
53009       };
53010
53011
53012       mode.selectedIDs = function() {
53013           return [wayId];
53014       };
53015
53016
53017       mode.activeID = function() {
53018           return (behavior && behavior.activeID()) || [];
53019       };
53020
53021
53022       return mode;
53023   }
53024
53025   function modeDrawLine(context, wayID, startGraph, affix) {
53026       var mode = {
53027           button: 'line',
53028           id: 'draw-line'
53029       };
53030
53031       var behavior;
53032
53033
53034       mode.enter = function() {
53035           var way = context.entity(wayID);
53036           var index = (affix === 'prefix') ? 0 : undefined;
53037           var headID = (affix === 'prefix') ? way.first() : way.last();
53038
53039           behavior = behaviorDrawWay(context, wayID, index, mode, startGraph)
53040               .tail(t('modes.draw_line.tail'));
53041
53042           var addNode = behavior.addNode;
53043           behavior.addNode = function(node, d) {
53044               if (node.id === headID) {
53045                   behavior.finish();
53046               } else {
53047                   addNode(node, d);
53048               }
53049           };
53050
53051           context.install(behavior);
53052       };
53053
53054
53055       mode.exit = function() {
53056           context.uninstall(behavior);
53057       };
53058
53059
53060       mode.selectedIDs = function() {
53061           return [wayID];
53062       };
53063
53064
53065       mode.activeID = function() {
53066           return (behavior && behavior.activeID()) || [];
53067       };
53068
53069       return mode;
53070   }
53071
53072   function operationCircularize(selectedIDs, context) {
53073       var entityId = selectedIDs[0],
53074           entity = context.entity(entityId),
53075           extent = entity.extent(context.graph()),
53076           geometry = context.geometry(entityId),
53077           action = actionCircularize(entityId, context.projection);
53078
53079
53080       var operation = function() {
53081           context.perform(action, operation.annotation());
53082       };
53083
53084
53085       operation.available = function() {
53086           return selectedIDs.length === 1 &&
53087               entity.type === 'way' &&
53088               uniq(entity.nodes).length > 1;
53089       };
53090
53091
53092       operation.disabled = function() {
53093           var reason;
53094           if (extent.percentContainedIn(context.extent()) < 0.8) {
53095               reason = 'too_large';
53096           } else if (context.hasHiddenConnections(entityId)) {
53097               reason = 'connected_to_hidden';
53098           }
53099           return action.disabled(context.graph()) || reason;
53100       };
53101
53102
53103       operation.tooltip = function() {
53104           var disable = operation.disabled();
53105           return disable ?
53106               t('operations.circularize.' + disable) :
53107               t('operations.circularize.description.' + geometry);
53108       };
53109
53110
53111       operation.annotation = function() {
53112           return t('operations.circularize.annotation.' + geometry);
53113       };
53114
53115
53116       operation.id = 'circularize';
53117       operation.keys = [t('operations.circularize.key')];
53118       operation.title = t('operations.circularize.title');
53119       operation.behavior = behaviorOperation(context).which(operation);
53120
53121       return operation;
53122   }
53123
53124   function operationContinue(selectedIDs, context) {
53125       var graph = context.graph(),
53126           entities = selectedIDs.map(function(id) { return graph.entity(id); }),
53127           geometries = assignIn({ line: [], vertex: [] },
53128               groupBy(entities, function(entity) { return entity.geometry(graph); })),
53129           vertex = geometries.vertex[0];
53130
53131
53132       function candidateWays() {
53133           return graph.parentWays(vertex).filter(function(parent) {
53134               return parent.geometry(graph) === 'line' &&
53135                   !parent.isClosed() &&
53136                   parent.affix(vertex.id) &&
53137                   (geometries.line.length === 0 || geometries.line[0] === parent);
53138           });
53139       }
53140
53141
53142       var operation = function() {
53143           var candidate = candidateWays()[0];
53144           context.enter(
53145               modeDrawLine(context, candidate.id, context.graph(), candidate.affix(vertex.id))
53146           );
53147       };
53148
53149
53150       operation.available = function() {
53151           return geometries.vertex.length === 1 && geometries.line.length <= 1 &&
53152               !context.features().hasHiddenConnections(vertex, context.graph());
53153       };
53154
53155
53156       operation.disabled = function() {
53157           var candidates = candidateWays();
53158           if (candidates.length === 0)
53159               return 'not_eligible';
53160           if (candidates.length > 1)
53161               return 'multiple';
53162       };
53163
53164
53165       operation.tooltip = function() {
53166           var disable = operation.disabled();
53167           return disable ?
53168               t('operations.continue.' + disable) :
53169               t('operations.continue.description');
53170       };
53171
53172
53173       operation.annotation = function() {
53174           return t('operations.continue.annotation.line');
53175       };
53176
53177
53178       operation.id = 'continue';
53179       operation.keys = [t('operations.continue.key')];
53180       operation.title = t('operations.continue.title');
53181       operation.behavior = behaviorOperation(context).which(operation);
53182
53183       return operation;
53184   }
53185
53186   function operationDelete(selectedIDs, context) {
53187       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
53188           action = actionDeleteMultiple(selectedIDs),
53189           extent = selectedIDs.reduce(function(extent, id) {
53190                   return extent.extend(context.entity(id).extent(context.graph()));
53191               }, geoExtent$$1());
53192
53193
53194       var operation = function() {
53195           var nextSelectedID;
53196           var nextSelectedLoc;
53197
53198           if (selectedIDs.length === 1) {
53199               var id = selectedIDs[0],
53200                   entity = context.entity(id),
53201                   geometry = context.geometry(id),
53202                   parents = context.graph().parentWays(entity),
53203                   parent = parents[0];
53204
53205               // Select the next closest node in the way.
53206               if (geometry === 'vertex') {
53207                   var nodes = parent.nodes,
53208                       i = nodes.indexOf(id);
53209
53210                   if (i === 0) {
53211                       i++;
53212                   } else if (i === nodes.length - 1) {
53213                       i--;
53214                   } else {
53215                       var a = geoSphericalDistance(entity.loc, context.entity(nodes[i - 1]).loc),
53216                           b = geoSphericalDistance(entity.loc, context.entity(nodes[i + 1]).loc);
53217                       i = a < b ? i - 1 : i + 1;
53218                   }
53219
53220                   nextSelectedID = nodes[i];
53221                   nextSelectedLoc = context.entity(nextSelectedID).loc;
53222               }
53223           }
53224
53225           context.perform(action, operation.annotation());
53226
53227           if (nextSelectedID && nextSelectedLoc) {
53228               if (context.hasEntity(nextSelectedID)) {
53229                   context.enter(modeSelect(context, [nextSelectedID]).follow(true));
53230               } else {
53231                   context.map().centerEase(nextSelectedLoc);
53232                   context.enter(modeBrowse(context));
53233               }
53234           } else {
53235               context.enter(modeBrowse(context));
53236           }
53237
53238       };
53239
53240
53241       operation.available = function() {
53242           return true;
53243       };
53244
53245
53246       operation.disabled = function() {
53247           var reason;
53248           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53249               reason = 'too_large';
53250           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53251               reason = 'connected_to_hidden';
53252           } else if (some(selectedIDs, protectedMember)) {
53253               reason = 'part_of_relation';
53254           } else if (some(selectedIDs, incompleteRelation)) {
53255               reason = 'incomplete_relation';
53256           }
53257           return reason;
53258
53259           function incompleteRelation(id) {
53260               var entity = context.entity(id);
53261               return entity.type === 'relation' && !entity.isComplete(context.graph());
53262           }
53263
53264           function protectedMember(id) {
53265               var entity = context.entity(id);
53266               if (entity.type !== 'way') return false;
53267
53268               var parents = context.graph().parentRelations(entity);
53269               for (var i = 0; i < parents.length; i++) {
53270                   var parent = parents[i],
53271                       type = parent.tags.type,
53272                       role = parent.memberById(id).role || 'outer';
53273                   if (type === 'route' || type === 'boundary' || (type === 'multipolygon' && role === 'outer')) {
53274                       return true;
53275                   }
53276               }
53277               return false;
53278           }
53279
53280       };
53281
53282
53283       operation.tooltip = function() {
53284           var disable = operation.disabled();
53285           return disable ?
53286               t('operations.delete.' + disable + '.' + multi) :
53287               t('operations.delete.description' + '.' + multi);
53288       };
53289
53290
53291       operation.annotation = function() {
53292           return selectedIDs.length === 1 ?
53293               t('operations.delete.annotation.' + context.geometry(selectedIDs[0])) :
53294               t('operations.delete.annotation.multiple', { n: selectedIDs.length });
53295       };
53296
53297
53298       operation.id = 'delete';
53299       operation.keys = [uiCmd('⌘⌫'), uiCmd('⌘⌦'), uiCmd('⌦')];
53300       operation.title = t('operations.delete.title');
53301       operation.behavior = behaviorOperation(context).which(operation);
53302
53303       return operation;
53304   }
53305
53306   function operationDisconnect(selectedIDs, context) {
53307       var vertices = filter(selectedIDs, function(entityId) {
53308           return context.geometry(entityId) === 'vertex';
53309       });
53310
53311       var entityId = vertices[0],
53312           action = actionDisconnect(entityId);
53313
53314       if (selectedIDs.length > 1) {
53315           action.limitWays(without(selectedIDs, entityId));
53316       }
53317
53318
53319       var operation = function() {
53320           context.perform(action, operation.annotation());
53321       };
53322
53323
53324       operation.available = function() {
53325           return vertices.length === 1;
53326       };
53327
53328
53329       operation.disabled = function() {
53330           var reason;
53331           if (some(selectedIDs, context.hasHiddenConnections)) {
53332               reason = 'connected_to_hidden';
53333           }
53334           return action.disabled(context.graph()) || reason;
53335       };
53336
53337
53338       operation.tooltip = function() {
53339           var disable = operation.disabled();
53340           return disable ?
53341               t('operations.disconnect.' + disable) :
53342               t('operations.disconnect.description');
53343       };
53344
53345
53346       operation.annotation = function() {
53347           return t('operations.disconnect.annotation');
53348       };
53349
53350
53351       operation.id = 'disconnect';
53352       operation.keys = [t('operations.disconnect.key')];
53353       operation.title = t('operations.disconnect.title');
53354       operation.behavior = behaviorOperation(context).which(operation);
53355
53356       return operation;
53357   }
53358
53359   function operationMerge(selectedIDs, context) {
53360
53361       function updatePresetTags(newGraph, ids) {
53362           var id = ids[0];
53363           var newEntity = newGraph.hasEntity(id);
53364
53365           if (!newEntity) return;
53366           var newPreset = context.presets().match(newEntity, newGraph);
53367           context.replace(actionChangePreset(id, null, newPreset), operation.annotation());
53368       }
53369
53370
53371       var join = actionJoin(selectedIDs);
53372       var merge = actionMerge(selectedIDs);
53373       var mergePolygon = actionMergePolygon(selectedIDs);
53374       var mergeNodes = actionMergeNodes(selectedIDs);
53375
53376
53377       var operation = function() {
53378           var doUpdateTags;
53379           var action;
53380
53381           if (!join.disabled(context.graph())) {
53382               doUpdateTags = false;
53383               action = join;
53384           } else if (!merge.disabled(context.graph())) {
53385               doUpdateTags = true;
53386               action = merge;
53387           } else if (!mergePolygon.disabled(context.graph())) {
53388               doUpdateTags = false;
53389               action = mergePolygon;
53390           } else {
53391               doUpdateTags = true;
53392               action = mergeNodes;
53393           }
53394
53395           context.perform(action, operation.annotation());
53396
53397           var ids = selectedIDs.filter(function(id) {
53398               var entity = context.hasEntity(id);
53399               return entity && entity.type !== 'node';
53400           });
53401
53402           // if we merged tags, rematch preset to update tags if necessary (#3851)
53403           if (doUpdateTags) {
53404               updatePresetTags(context.graph(), ids);
53405           }
53406
53407           context.enter(modeSelect(context, ids));
53408       };
53409
53410
53411       operation.available = function() {
53412           return selectedIDs.length >= 2;
53413       };
53414
53415
53416       operation.disabled = function() {
53417           return join.disabled(context.graph()) &&
53418               merge.disabled(context.graph()) &&
53419               mergePolygon.disabled(context.graph()) &&
53420               mergeNodes.disabled(context.graph());
53421       };
53422
53423
53424       operation.tooltip = function() {
53425           var j = join.disabled(context.graph());          // 'not_eligible', 'not_adjacent', 'restriction', 'conflicting_tags'
53426           var m = merge.disabled(context.graph());         // 'not_eligible'
53427           var p = mergePolygon.disabled(context.graph());  // 'not_eligible', 'incomplete_relation'
53428           var n = mergeNodes.disabled(context.graph());    // 'not_eligible', 'relation', 'restriction'
53429
53430           // disabled for one of various reasons
53431           if (j && m && p && n) {
53432               if (j === 'restriction' || n === 'restriction') {
53433                   return t('operations.merge.restriction',
53434                       { relation: context.presets().item('type/restriction').name() });
53435
53436               } else if (p === 'incomplete_relation') {
53437                   return t('operations.merge.incomplete_relation');
53438
53439               } else if (n === 'relation') {
53440                   return t('operations.merge.relation');
53441
53442               } else {
53443                   return t('operations.merge.' + j);
53444               }
53445
53446           } else {
53447               return t('operations.merge.description');
53448           }
53449       };
53450
53451
53452       operation.annotation = function() {
53453           return t('operations.merge.annotation', { n: selectedIDs.length });
53454       };
53455
53456
53457       operation.id = 'merge';
53458       operation.keys = [t('operations.merge.key')];
53459       operation.title = t('operations.merge.title');
53460       operation.behavior = behaviorOperation(context).which(operation);
53461
53462       return operation;
53463   }
53464
53465   function operationMove(selectedIDs, context) {
53466       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple');
53467       var extent = selectedIDs.reduce(function(extent, id) {
53468           return extent.extend(context.entity(id).extent(context.graph()));
53469       }, geoExtent$$1());
53470
53471
53472       var operation = function() {
53473           context.enter(modeMove$$1(context, selectedIDs));
53474       };
53475
53476
53477       operation.available = function() {
53478           return selectedIDs.length > 1 ||
53479               context.entity(selectedIDs[0]).type !== 'node';
53480       };
53481
53482
53483       operation.disabled = function() {
53484           var reason;
53485           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53486               reason = 'too_large';
53487           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53488               reason = 'connected_to_hidden';
53489           } else if (some(selectedIDs, incompleteRelation)) {
53490               reason = 'incomplete_relation';
53491           }
53492           return reason;
53493
53494           function incompleteRelation(id) {
53495               var entity = context.entity(id);
53496               return entity.type === 'relation' && !entity.isComplete(context.graph());
53497           }
53498       };
53499
53500
53501       operation.tooltip = function() {
53502           var disable = operation.disabled();
53503           return disable ?
53504               t('operations.move.' + disable + '.' + multi) :
53505               t('operations.move.description.' + multi);
53506       };
53507
53508
53509       operation.annotation = function() {
53510           return selectedIDs.length === 1 ?
53511               t('operations.move.annotation.' + context.geometry(selectedIDs[0])) :
53512               t('operations.move.annotation.multiple');
53513       };
53514
53515
53516       operation.id = 'move';
53517       operation.keys = [t('operations.move.key')];
53518       operation.title = t('operations.move.title');
53519       operation.behavior = behaviorOperation(context).which(operation);
53520
53521       return operation;
53522   }
53523
53524   function operationOrthogonalize(selectedIDs, context) {
53525       var entityId = selectedIDs[0],
53526           entity = context.entity(entityId),
53527           extent = entity.extent(context.graph()),
53528           geometry = context.geometry(entityId),
53529           action = actionOrthogonalize(entityId, context.projection);
53530
53531
53532       var operation = function() {
53533           context.perform(action, operation.annotation());
53534       };
53535
53536
53537       operation.available = function() {
53538           return selectedIDs.length === 1 &&
53539               entity.type === 'way' &&
53540               entity.isClosed() &&
53541               uniq(entity.nodes).length > 2;
53542       };
53543
53544
53545       operation.disabled = function() {
53546           var reason;
53547           if (extent.percentContainedIn(context.extent()) < 0.8) {
53548               reason = 'too_large';
53549           } else if (context.hasHiddenConnections(entityId)) {
53550               reason = 'connected_to_hidden';
53551           }
53552           return action.disabled(context.graph()) || reason;
53553       };
53554
53555
53556       operation.tooltip = function() {
53557           var disable = operation.disabled();
53558           return disable ?
53559               t('operations.orthogonalize.' + disable) :
53560               t('operations.orthogonalize.description.' + geometry);
53561       };
53562
53563
53564       operation.annotation = function() {
53565           return t('operations.orthogonalize.annotation.' + geometry);
53566       };
53567
53568
53569       operation.id = 'orthogonalize';
53570       operation.keys = [t('operations.orthogonalize.key')];
53571       operation.title = t('operations.orthogonalize.title');
53572       operation.behavior = behaviorOperation(context).which(operation);
53573
53574       return operation;
53575   }
53576
53577   /**
53578    * This method is like `_.uniq` except that it accepts `iteratee` which is
53579    * invoked for each element in `array` to generate the criterion by which
53580    * uniqueness is computed. The order of result values is determined by the
53581    * order they occur in the array. The iteratee is invoked with one argument:
53582    * (value).
53583    *
53584    * @static
53585    * @memberOf _
53586    * @since 4.0.0
53587    * @category Array
53588    * @param {Array} array The array to inspect.
53589    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
53590    * @returns {Array} Returns the new duplicate free array.
53591    * @example
53592    *
53593    * _.uniqBy([2.1, 1.2, 2.3], Math.floor);
53594    * // => [2.1, 1.2]
53595    *
53596    * // The `_.property` iteratee shorthand.
53597    * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');
53598    * // => [{ 'x': 1 }, { 'x': 2 }]
53599    */
53600   function uniqBy(array, iteratee) {
53601     return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];
53602   }
53603
53604   function operationReflectShort(selectedIDs, context) {
53605       return operationReflect(selectedIDs, context, 'short');
53606   }
53607
53608
53609   function operationReflectLong(selectedIDs, context) {
53610       return operationReflect(selectedIDs, context, 'long');
53611   }
53612
53613
53614   function operationReflect(selectedIDs, context, axis) {
53615       axis = axis || 'long';
53616       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
53617           extent = selectedIDs.reduce(function(extent, id) {
53618               return extent.extend(context.entity(id).extent(context.graph()));
53619           }, geoExtent$$1());
53620
53621
53622       var operation = function() {
53623           var action = actionReflect(selectedIDs, context.projection)
53624               .useLongAxis(Boolean(axis === 'long'));
53625           context.perform(action, operation.annotation());
53626       };
53627
53628
53629       operation.available = function() {
53630           var nodes = utilGetAllNodes(selectedIDs, context.graph());
53631           return uniqBy(nodes, function(n) { return n.loc; }).length >= 3;
53632       };
53633
53634
53635       operation.disabled = function() {
53636           var reason;
53637           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53638               reason = 'too_large';
53639           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53640               reason = 'connected_to_hidden';
53641           } else if (some(selectedIDs, incompleteRelation)) {
53642               reason = 'incomplete_relation';
53643           }
53644           return reason;
53645
53646           function incompleteRelation(id) {
53647               var entity = context.entity(id);
53648               return entity.type === 'relation' && !entity.isComplete(context.graph());
53649           }
53650       };
53651
53652
53653       operation.tooltip = function() {
53654           var disable = operation.disabled();
53655           return disable ?
53656               t('operations.reflect.' + disable + '.' + multi) :
53657               t('operations.reflect.description.' + axis + '.' + multi);
53658       };
53659
53660
53661       operation.annotation = function() {
53662           return t('operations.reflect.annotation.' + axis + '.' + multi);
53663       };
53664
53665
53666       operation.id = 'reflect-' + axis;
53667       operation.keys = [t('operations.reflect.key.' + axis)];
53668       operation.title = t('operations.reflect.title.' + axis);
53669       operation.behavior = behaviorOperation(context).which(operation);
53670
53671       return operation;
53672   }
53673
53674   function operationReverse(selectedIDs, context) {
53675       var entityId = selectedIDs[0];
53676
53677       var operation = function() {
53678           context.perform(actionReverse(entityId), operation.annotation());
53679       };
53680
53681
53682       operation.available = function() {
53683           return selectedIDs.length === 1 && context.geometry(entityId) === 'line';
53684       };
53685
53686
53687       operation.disabled = function() {
53688           return false;
53689       };
53690
53691
53692       operation.tooltip = function() {
53693           return t('operations.reverse.description');
53694       };
53695
53696
53697       operation.annotation = function() {
53698           return t('operations.reverse.annotation');
53699       };
53700
53701
53702       operation.id = 'reverse';
53703       operation.keys = [t('operations.reverse.key')];
53704       operation.title = t('operations.reverse.title');
53705       operation.behavior = behaviorOperation(context).which(operation);
53706
53707       return operation;
53708   }
53709
53710   function operationRotate(selectedIDs, context) {
53711       var multi = (selectedIDs.length === 1 ? 'single' : 'multiple'),
53712           extent = selectedIDs.reduce(function(extent, id) {
53713               return extent.extend(context.entity(id).extent(context.graph()));
53714           }, geoExtent$$1());
53715
53716
53717       var operation = function() {
53718           context.enter(modeRotate$$1(context, selectedIDs));
53719       };
53720
53721
53722       operation.available = function() {
53723           var nodes = utilGetAllNodes(selectedIDs, context.graph());
53724           return uniqBy(nodes, function(n) { return n.loc; }).length >= 2;
53725       };
53726
53727
53728       operation.disabled = function() {
53729           var reason;
53730           if (extent.area() && extent.percentContainedIn(context.extent()) < 0.8) {
53731               reason = 'too_large';
53732           } else if (some(selectedIDs, context.hasHiddenConnections)) {
53733               reason = 'connected_to_hidden';
53734           } else if (some(selectedIDs, incompleteRelation)) {
53735               reason = 'incomplete_relation';
53736           }
53737           return reason;
53738
53739           function incompleteRelation(id) {
53740               var entity = context.entity(id);
53741               return entity.type === 'relation' && !entity.isComplete(context.graph());
53742           }
53743       };
53744
53745
53746       operation.tooltip = function() {
53747           var disable = operation.disabled();
53748           return disable ?
53749               t('operations.rotate.' + disable + '.' + multi) :
53750               t('operations.rotate.description.' + multi);
53751       };
53752
53753
53754       operation.annotation = function() {
53755           return selectedIDs.length === 1 ?
53756               t('operations.rotate.annotation.' + context.geometry(selectedIDs[0])) :
53757               t('operations.rotate.annotation.multiple');
53758       };
53759
53760
53761       operation.id = 'rotate';
53762       operation.keys = [t('operations.rotate.key')];
53763       operation.title = t('operations.rotate.title');
53764       operation.behavior = behaviorOperation(context).which(operation);
53765
53766       return operation;
53767   }
53768
53769   function operationSplit(selectedIDs, context) {
53770       var vertices = filter(selectedIDs, function(entityId) {
53771           return context.geometry(entityId) === 'vertex';
53772       });
53773
53774       var entityId = vertices[0],
53775           action = actionSplit(entityId),
53776           ways = [];
53777
53778       if (vertices.length === 1) {
53779           if (selectedIDs.length > 1) {
53780               action.limitWays(without(selectedIDs, entityId));
53781           }
53782           ways = action.ways(context.graph());
53783       }
53784
53785
53786       var operation = function() {
53787           var difference = context.perform(action, operation.annotation());
53788           context.enter(modeSelect(context, difference.extantIDs()));
53789       };
53790
53791
53792       operation.available = function() {
53793           return vertices.length === 1;
53794       };
53795
53796
53797       operation.disabled = function() {
53798           var reason;
53799           if (some(selectedIDs, context.hasHiddenConnections)) {
53800               reason = 'connected_to_hidden';
53801           }
53802           return action.disabled(context.graph()) || reason;
53803       };
53804
53805
53806       operation.tooltip = function() {
53807           var disable = operation.disabled();
53808           if (disable) {
53809               return t('operations.split.' + disable);
53810           }
53811           if (ways.length === 1) {
53812               return t('operations.split.description.' + context.geometry(ways[0].id));
53813           } else {
53814               return t('operations.split.description.multiple');
53815           }
53816       };
53817
53818
53819       operation.annotation = function() {
53820           return ways.length === 1 ?
53821               t('operations.split.annotation.' + context.geometry(ways[0].id)) :
53822               t('operations.split.annotation.multiple', { n: ways.length });
53823       };
53824
53825
53826       operation.id = 'split';
53827       operation.keys = [t('operations.split.key')];
53828       operation.title = t('operations.split.title');
53829       operation.behavior = behaviorOperation(context).which(operation);
53830
53831       return operation;
53832   }
53833
53834   function operationStraighten(selectedIDs, context) {
53835       var entityId = selectedIDs[0],
53836           action = actionStraighten(entityId, context.projection);
53837
53838
53839       function operation() {
53840           context.perform(action, operation.annotation());
53841       }
53842
53843
53844       operation.available = function() {
53845           var entity = context.entity(entityId);
53846           return selectedIDs.length === 1 &&
53847               entity.type === 'way' &&
53848               !entity.isClosed() &&
53849               uniq(entity.nodes).length > 2;
53850       };
53851
53852
53853       operation.disabled = function() {
53854           var reason;
53855           if (context.hasHiddenConnections(entityId)) {
53856               reason = 'connected_to_hidden';
53857           }
53858           return action.disabled(context.graph()) || reason;
53859       };
53860
53861
53862       operation.tooltip = function() {
53863           var disable = operation.disabled();
53864           return disable ?
53865               t('operations.straighten.' + disable) :
53866               t('operations.straighten.description');
53867       };
53868
53869
53870       operation.annotation = function() {
53871           return t('operations.straighten.annotation');
53872       };
53873
53874
53875       operation.id = 'straighten';
53876       operation.keys = [t('operations.straighten.key')];
53877       operation.title = t('operations.straighten.title');
53878       operation.behavior = behaviorOperation(context).which(operation);
53879
53880       return operation;
53881   }
53882
53883   function operationDetachNode(selectedIDs, context) {
53884       var nodeID = selectedIDs.length && selectedIDs[0];
53885       var action = actionDetachNode(nodeID);
53886
53887       var operation = function () {
53888           context.perform(action);  // do the detach
53889
53890           var mouse = context.map().mouseCoordinates();
53891           if (mouse.some(isNaN)) {
53892               enterMoveMode();
53893
53894           } else {
53895               // move detached node to the mouse location (transitioned)
53896               context.perform(actionMoveNode(nodeID, mouse));
53897
53898               // after transition completes, put at final mouse location and enter move mode.
53899               window.setTimeout(function() {
53900                   mouse = context.map().mouseCoordinates();
53901                   context.replace(actionMoveNode(nodeID, mouse));
53902                   enterMoveMode();
53903               }, 150);
53904           }
53905
53906           function enterMoveMode() {
53907               var baseGraph = context.graph();
53908               context.enter(modeMove$$1(context, [nodeID], baseGraph));
53909           }
53910       };
53911
53912
53913       operation.available = function () {
53914           if (selectedIDs.length !== 1) return false;
53915
53916           var graph = context.graph();
53917           var entity = graph.hasEntity(nodeID);
53918           if (!entity) return false;
53919
53920           return entity.type === 'node' &&
53921               entity.hasInterestingTags() &&
53922               graph.parentWays(entity).length > 0;
53923       };
53924
53925
53926       operation.disabled = function () {
53927           var reason;
53928           if (some(selectedIDs, context.hasHiddenConnections)) {
53929               reason = 'connected_to_hidden';
53930           }
53931           return action.disabled(context.graph()) || reason;
53932       };
53933
53934
53935       operation.tooltip = function () {
53936           var disableReason = operation.disabled();
53937           if (disableReason) {
53938               return t('operations.detach_node.' + disableReason,
53939                   { relation: context.presets().item('type/restriction').name() });
53940           } else {
53941               return t('operations.detach_node.description');
53942           }
53943       };
53944
53945
53946       operation.annotation = function () {
53947           return t('operations.detach_node.annotation');
53948       };
53949
53950
53951       operation.id = 'detach-node';
53952       operation.keys = [t('operations.detach_node.key')];
53953       operation.title = t('operations.detach_node.title');
53954       operation.behavior = behaviorOperation(context).which(operation);
53955
53956
53957       return operation;
53958   }
53959
53960
53961
53962   var Operations = /*#__PURE__*/Object.freeze({
53963     operationCircularize: operationCircularize,
53964     operationContinue: operationContinue,
53965     operationDelete: operationDelete,
53966     operationDisconnect: operationDisconnect,
53967     operationMerge: operationMerge,
53968     operationMove: operationMove,
53969     operationOrthogonalize: operationOrthogonalize,
53970     operationReflectShort: operationReflectShort,
53971     operationReflectLong: operationReflectLong,
53972     operationReverse: operationReverse,
53973     operationRotate: operationRotate,
53974     operationSplit: operationSplit,
53975     operationStraighten: operationStraighten,
53976     operationDetachNode: operationDetachNode
53977   });
53978
53979   function modeMove$$1(context, entityIDs, baseGraph) {
53980       var mode = {
53981           id: 'move',
53982           button: 'browse'
53983       };
53984
53985       var keybinding = utilKeybinding('move');
53986       var behaviors = [
53987           behaviorEdit(context),
53988           operationCircularize(entityIDs, context).behavior,
53989           operationDelete(entityIDs, context).behavior,
53990           operationOrthogonalize(entityIDs, context).behavior,
53991           operationReflectLong(entityIDs, context).behavior,
53992           operationReflectShort(entityIDs, context).behavior,
53993           operationRotate(entityIDs, context).behavior
53994       ];
53995       var annotation = entityIDs.length === 1 ?
53996           t('operations.move.annotation.' + context.geometry(entityIDs[0])) :
53997           t('operations.move.annotation.multiple');
53998
53999       var _prevGraph;
54000       var _cache;
54001       var _origin;
54002       var _nudgeInterval;
54003
54004
54005       function doMove(nudge) {
54006           nudge = nudge || [0, 0];
54007
54008           var fn;
54009           if (_prevGraph !== context.graph()) {
54010               _cache = {};
54011               _origin = context.map().mouseCoordinates();
54012               fn = context.perform;
54013           } else {
54014               fn = context.overwrite;
54015           }
54016
54017           var currMouse = context.mouse();
54018           var origMouse = context.projection(_origin);
54019           var delta = geoVecSubtract(geoVecSubtract(currMouse, origMouse), nudge);
54020
54021           fn(actionMove(entityIDs, delta, context.projection, _cache), annotation);
54022           _prevGraph = context.graph();
54023       }
54024
54025
54026       function startNudge(nudge) {
54027           if (_nudgeInterval) window.clearInterval(_nudgeInterval);
54028           _nudgeInterval = window.setInterval(function() {
54029               context.pan(nudge);
54030               doMove(nudge);
54031           }, 50);
54032       }
54033
54034
54035       function stopNudge() {
54036           if (_nudgeInterval) {
54037               window.clearInterval(_nudgeInterval);
54038               _nudgeInterval = null;
54039           }
54040       }
54041
54042
54043       function move() {
54044           doMove();
54045           var nudge = geoViewportEdge(context.mouse(), context.map().dimensions());
54046           if (nudge) {
54047               startNudge(nudge);
54048           } else {
54049               stopNudge();
54050           }
54051       }
54052
54053
54054       function finish() {
54055           event.stopPropagation();
54056           context.enter(modeSelect(context, entityIDs));
54057           stopNudge();
54058       }
54059
54060
54061       function cancel() {
54062           if (baseGraph) {
54063               while (context.graph() !== baseGraph) context.pop();
54064               context.enter(modeBrowse(context));
54065           } else {
54066               context.pop();
54067               context.enter(modeSelect(context, entityIDs));
54068           }
54069           stopNudge();
54070       }
54071
54072
54073       function undone() {
54074           context.enter(modeBrowse(context));
54075       }
54076
54077
54078       mode.enter = function() {
54079           _origin = context.map().mouseCoordinates();
54080           _prevGraph = null;
54081           _cache = {};
54082
54083           behaviors.forEach(function(behavior) {
54084               context.install(behavior);
54085           });
54086
54087           context.surface()
54088               .on('mousemove.move', move)
54089               .on('click.move', finish);
54090
54091           context.history()
54092               .on('undone.move', undone);
54093
54094           keybinding
54095               .on('⎋', cancel)
54096               .on('↩', finish);
54097
54098           select(document)
54099               .call(keybinding);
54100       };
54101
54102
54103       mode.exit = function() {
54104           stopNudge();
54105
54106           behaviors.forEach(function(behavior) {
54107               context.uninstall(behavior);
54108           });
54109
54110           context.surface()
54111               .on('mousemove.move', null)
54112               .on('click.move', null);
54113
54114           context.history()
54115               .on('undone.move', null);
54116
54117           select(document)
54118               .call(keybinding.unbind);
54119       };
54120
54121
54122       mode.selectedIDs = function() {
54123           if (!arguments.length) return entityIDs;
54124           // no assign
54125           return mode;
54126       };
54127
54128
54129       return mode;
54130   }
54131
54132   function modeRotate$$1(context, entityIDs) {
54133       var mode = {
54134           id: 'rotate',
54135           button: 'browse'
54136       };
54137
54138       var keybinding = utilKeybinding('rotate');
54139       var behaviors = [
54140           behaviorEdit(context),
54141           operationCircularize(entityIDs, context).behavior,
54142           operationDelete(entityIDs, context).behavior,
54143           operationMove(entityIDs, context).behavior,
54144           operationOrthogonalize(entityIDs, context).behavior,
54145           operationReflectLong(entityIDs, context).behavior,
54146           operationReflectShort(entityIDs, context).behavior
54147       ];
54148       var annotation = entityIDs.length === 1 ?
54149           t('operations.rotate.annotation.' + context.geometry(entityIDs[0])) :
54150           t('operations.rotate.annotation.multiple');
54151
54152       var _prevGraph;
54153       var _prevAngle;
54154       var _prevTransform;
54155       var _pivot;
54156
54157
54158       function doRotate() {
54159           var fn;
54160           if (context.graph() !== _prevGraph) {
54161               fn = context.perform;
54162           } else {
54163               fn = context.replace;
54164           }
54165
54166           // projection changed, recalculate _pivot
54167           var projection = context.projection;
54168           var currTransform = projection.transform();
54169           if (!_prevTransform ||
54170               currTransform.k !== _prevTransform.k ||
54171               currTransform.x !== _prevTransform.x ||
54172               currTransform.y !== _prevTransform.y) {
54173
54174               var nodes = utilGetAllNodes(entityIDs, context.graph());
54175               var points = nodes.map(function(n) { return projection(n.loc); });
54176
54177               if (points.length === 1) {  // degenerate case
54178                   _pivot = points[0];
54179               } else if (points.length === 2) {
54180                   _pivot = geoVecInterp(points[0], points[1], 0.5);
54181               } else {
54182                   _pivot = d3_polygonCentroid(d3_polygonHull(points));
54183               }
54184               _prevAngle = undefined;
54185           }
54186
54187
54188           var currMouse = context.mouse();
54189           var currAngle = Math.atan2(currMouse[1] - _pivot[1], currMouse[0] - _pivot[0]);
54190
54191           if (typeof _prevAngle === 'undefined') _prevAngle = currAngle;
54192           var delta = currAngle - _prevAngle;
54193
54194           fn(actionRotate(entityIDs, _pivot, delta, projection), annotation);
54195
54196           _prevTransform = currTransform;
54197           _prevAngle = currAngle;
54198           _prevGraph = context.graph();
54199       }
54200
54201
54202       function finish() {
54203           event.stopPropagation();
54204           context.enter(modeSelect(context, entityIDs));
54205       }
54206
54207
54208       function cancel() {
54209           context.pop();
54210           context.enter(modeSelect(context, entityIDs));
54211       }
54212
54213
54214       function undone() {
54215           context.enter(modeBrowse(context));
54216       }
54217
54218
54219       mode.enter = function() {
54220           behaviors.forEach(context.install);
54221
54222           context.surface()
54223               .on('mousemove.rotate', doRotate)
54224               .on('click.rotate', finish);
54225
54226           context.history()
54227               .on('undone.rotate', undone);
54228
54229           keybinding
54230               .on('⎋', cancel)
54231               .on('↩', finish);
54232
54233           select(document)
54234               .call(keybinding);
54235       };
54236
54237
54238       mode.exit = function() {
54239           behaviors.forEach(context.uninstall);
54240
54241           context.surface()
54242               .on('mousemove.rotate', null)
54243               .on('click.rotate', null);
54244
54245           context.history()
54246               .on('undone.rotate', null);
54247
54248           select(document)
54249               .call(keybinding.unbind);
54250       };
54251
54252
54253       mode.selectedIDs = function() {
54254           if (!arguments.length) return entityIDs;
54255           // no assign
54256           return mode;
54257       };
54258
54259
54260       return mode;
54261   }
54262
54263   var _isSaving = false;
54264
54265
54266   function modeSave$$1(context) {
54267       var mode = { id: 'save' };
54268       var keybinding = utilKeybinding('modeSave');
54269
54270       var loading = uiLoading(context)
54271           .message(t('save.uploading'))
54272           .blocking(true);
54273
54274       var commit = uiCommit(context)
54275           .on('cancel', cancel)
54276           .on('save', save);
54277
54278       var _toCheck = [];
54279       var _toLoad = [];
54280       var _loaded = {};
54281       var _toLoadCount = 0;
54282       var _toLoadTotal = 0;
54283
54284       var _conflicts = [];
54285       var _errors = [];
54286       var _origChanges;
54287       var _location;
54288
54289
54290       function cancel(selectedID) {
54291           if (selectedID) {
54292               context.enter(modeSelect(context, [selectedID]));
54293           } else {
54294               context.enter(modeBrowse(context));
54295           }
54296       }
54297
54298
54299       function save(changeset, tryAgain, checkConflicts) {
54300           // Guard against accidentally entering save code twice - #4641
54301           if (_isSaving && !tryAgain) {
54302               return;
54303           }
54304
54305           var osm = context.connection();
54306           if (!osm) {
54307               cancel();
54308               return;
54309           }
54310
54311           // If user somehow got logged out mid-save, try to reauthenticate..
54312           // This can happen if they were logged in from before, but the tokens are no longer valid.
54313           if (!osm.authenticated()) {
54314               osm.authenticate(function(err) {
54315                   if (err) {
54316                       cancel();   // quit save mode..
54317                   } else {
54318                       save(changeset, tryAgain, checkConflicts);  // continue where we left off..
54319                   }
54320               });
54321               return;
54322           }
54323
54324           if (!_isSaving) {
54325               keybindingOff();
54326               context.container().call(loading);  // block input
54327               _isSaving = true;
54328           }
54329
54330           var history = context.history();
54331           var localGraph = context.graph();
54332           var remoteGraph = coreGraph$$1(history.base(), true);
54333
54334           _conflicts = [];
54335           _errors = [];
54336
54337           // Store original changes, in case user wants to download them as an .osc file
54338           _origChanges = history.changes(actionDiscardTags(history.difference()));
54339
54340           // First time, `history.perform` a no-op action.
54341           // Any conflict resolutions will be done as `history.replace`
54342           if (!tryAgain) {
54343               history.perform(actionNoop());
54344           }
54345
54346           // Attempt a fast upload.. If there are conflicts, re-enter with `checkConflicts = true`
54347           if (!checkConflicts) {
54348               upload(changeset);
54349
54350           // Do the full (slow) conflict check..
54351           } else {
54352               var modified = filter(history.difference().summary(), { changeType: 'modified' });
54353               _toCheck = map$3(map$3(modified, 'entity'), 'id');
54354               _toLoad = withChildNodes(_toCheck, localGraph);
54355               _loaded = {};
54356               _toLoadCount = 0;
54357               _toLoadTotal = _toLoad.length;
54358
54359               if (_toCheck.length) {
54360                   showProgress(_toLoadCount, _toLoadTotal);
54361                   _toLoad.forEach(function(id) { _loaded[id] = false; });
54362                   osm.loadMultiple(_toLoad, loaded);
54363               } else {
54364                   upload(changeset);
54365               }
54366           }
54367
54368           return;
54369
54370
54371           function withChildNodes(ids, graph) {
54372               return uniq(reduce(ids, function(result, id) {
54373                   var entity = graph.entity(id);
54374                   if (entity.type === 'way') {
54375                       try {
54376                           var children = graph.childNodes(entity);
54377                           result.push.apply(result, map$3(filter(children, 'version'), 'id'));
54378                       } catch (err) {
54379                           /* eslint-disable no-console */
54380                           if (typeof console !== 'undefined') console.error(err);
54381                           /* eslint-enable no-console */
54382                       }
54383                   }
54384                   return result;
54385               }, clone(ids)));
54386           }
54387
54388
54389           // Reload modified entities into an alternate graph and check for conflicts..
54390           function loaded(err, result) {
54391               if (_errors.length) return;
54392
54393               if (err) {
54394                   _errors.push({
54395                       msg: err.message || err.responseText,
54396                       details: [ t('save.status_code', { code: err.status }) ]
54397                   });
54398                   showErrors();
54399
54400               } else {
54401                   var loadMore = [];
54402
54403                   result.data.forEach(function(entity) {
54404                       remoteGraph.replace(entity);
54405                       _loaded[entity.id] = true;
54406                       _toLoad = without(_toLoad, entity.id);
54407
54408                       if (!entity.visible) return;
54409
54410                       // Because loadMultiple doesn't download /full like loadEntity,
54411                       // need to also load children that aren't already being checked..
54412                       var i, id;
54413                       if (entity.type === 'way') {
54414                           for (i = 0; i < entity.nodes.length; i++) {
54415                               id = entity.nodes[i];
54416                               if (_loaded[id] === undefined) {
54417                                   _loaded[id] = false;
54418                                   loadMore.push(id);
54419                               }
54420                           }
54421                       } else if (entity.type === 'relation' && entity.isMultipolygon()) {
54422                           for (i = 0; i < entity.members.length; i++) {
54423                               id = entity.members[i].id;
54424                               if (_loaded[id] === undefined) {
54425                                   _loaded[id] = false;
54426                                   loadMore.push(id);
54427                               }
54428                           }
54429                       }
54430                   });
54431
54432                   _toLoadCount += result.data.length;
54433                   _toLoadTotal += loadMore.length;
54434                   showProgress(_toLoadCount, _toLoadTotal);
54435
54436                   if (loadMore.length) {
54437                       _toLoad.push.apply(_toLoad, loadMore);
54438                       osm.loadMultiple(loadMore, loaded);
54439                   }
54440
54441                   if (!_toLoad.length) {
54442                       detectConflicts();
54443                   }
54444               }
54445           }
54446
54447
54448           function detectConflicts() {
54449               function choice(id, text, action) {
54450                   return { id: id, text: text, action: function() { history.replace(action); } };
54451               }
54452               function formatUser(d) {
54453                   return '<a href="' + osm.userURL(d) + '" target="_blank">' + d + '</a>';
54454               }
54455               function entityName(entity) {
54456                   return utilDisplayName(entity) || (utilDisplayType(entity.id) + ' ' + entity.id);
54457               }
54458
54459               function sameVersions(local$$1, remote) {
54460                   if (local$$1.version !== remote.version) return false;
54461
54462                   if (local$$1.type === 'way') {
54463                       var children = union(local$$1.nodes, remote.nodes);
54464                       for (var i = 0; i < children.length; i++) {
54465                           var a = localGraph.hasEntity(children[i]);
54466                           var b = remoteGraph.hasEntity(children[i]);
54467                           if (a && b && a.version !== b.version) return false;
54468                       }
54469                   }
54470
54471                   return true;
54472               }
54473
54474               _toCheck.forEach(function(id) {
54475                   var local$$1 = localGraph.entity(id);
54476                   var remote = remoteGraph.entity(id);
54477
54478                   if (sameVersions(local$$1, remote)) return;
54479
54480                   var action = actionMergeRemoteChanges;
54481                   var merge = action(id, localGraph, remoteGraph, formatUser);
54482
54483                   history.replace(merge);
54484
54485                   var mergeConflicts = merge.conflicts();
54486                   if (!mergeConflicts.length) return;  // merged safely
54487
54488                   var forceLocal = action(id, localGraph, remoteGraph).withOption('force_local');
54489                   var forceRemote = action(id, localGraph, remoteGraph).withOption('force_remote');
54490                   var keepMine = t('save.conflict.' + (remote.visible ? 'keep_local' : 'restore'));
54491                   var keepTheirs = t('save.conflict.' + (remote.visible ? 'keep_remote' : 'delete'));
54492
54493                   _conflicts.push({
54494                       id: id,
54495                       name: entityName(local$$1),
54496                       details: mergeConflicts,
54497                       chosen: 1,
54498                       choices: [
54499                           choice(id, keepMine, forceLocal),
54500                           choice(id, keepTheirs, forceRemote)
54501                       ]
54502                   });
54503               });
54504
54505               upload(changeset);
54506           }
54507       }
54508
54509
54510       function upload(changeset) {
54511           var osm = context.connection();
54512           if (!osm) {
54513               _errors.push({ msg: 'No OSM Service' });
54514           }
54515
54516           if (_conflicts.length) {
54517               _conflicts.sort(function(a, b) { return b.id.localeCompare(a.id); });
54518               showConflicts(changeset);
54519
54520           } else if (_errors.length) {
54521               showErrors();
54522
54523           } else {
54524               var history = context.history();
54525               var changes = history.changes(actionDiscardTags(history.difference()));
54526               if (changes.modified.length || changes.created.length || changes.deleted.length) {
54527                   loadLocation();  // so it is ready when we display the save screen
54528                   osm.putChangeset(changeset, changes, uploadCallback);
54529               } else {        // changes were insignificant or reverted by user
54530                   select('.inspector-wrap *').remove();
54531                   loading.close();
54532                   _isSaving = false;
54533                   context.flush();
54534                   cancel();
54535               }
54536           }
54537       }
54538
54539
54540       function uploadCallback(err, changeset) {
54541           if (err) {
54542               if (err.status === 409) {          // 409 Conflict
54543                   save(changeset, true, true);   // tryAgain = true, checkConflicts = true
54544               } else {
54545                   _errors.push({
54546                       msg: err.message || err.responseText,
54547                       details: [ t('save.status_code', { code: err.status }) ]
54548                   });
54549                   showErrors();
54550               }
54551
54552           } else {
54553               context.history().clearSaved();
54554               success(changeset);
54555               // Add delay to allow for postgres replication #1646 #2678
54556               window.setTimeout(function() {
54557                   select('.inspector-wrap *').remove();
54558                   loading.close();
54559                   _isSaving = false;
54560                   context.flush();
54561               }, 2500);
54562           }
54563       }
54564
54565
54566       function showProgress(num, total) {
54567           var modal = context.container().select('.loading-modal .modal-section');
54568           var progress = modal.selectAll('.progress')
54569               .data([0]);
54570
54571           // enter/update
54572           progress.enter()
54573               .append('div')
54574               .attr('class', 'progress')
54575               .merge(progress)
54576               .text(t('save.conflict_progress', { num: num, total: total }));
54577       }
54578
54579
54580       function showConflicts(changeset) {
54581           var history = context.history();
54582           var selection$$1 = context.container()
54583               .select('#sidebar')
54584               .append('div')
54585               .attr('class','sidebar-component');
54586
54587           loading.close();
54588           _isSaving = false;
54589
54590           var ui = uiConflicts(context)
54591               .conflictList(_conflicts)
54592               .origChanges(_origChanges)
54593               .on('cancel', function() {
54594                   history.pop();
54595                   selection$$1.remove();
54596                   keybindingOn();
54597               })
54598               .on('save', function() {
54599                   for (var i = 0; i < _conflicts.length; i++) {
54600                       if (_conflicts[i].chosen === 1) {  // user chose "keep theirs"
54601                           var entity = context.hasEntity(_conflicts[i].id);
54602                           if (entity && entity.type === 'way') {
54603                               var children = uniq(entity.nodes);
54604                               for (var j = 0; j < children.length; j++) {
54605                                   history.replace(actionRevert(children[j]));
54606                               }
54607                           }
54608                           history.replace(actionRevert(_conflicts[i].id));
54609                       }
54610                   }
54611
54612                   selection$$1.remove();
54613                   save(changeset, true, false);  // tryAgain = true, checkConflicts = false
54614               });
54615
54616           selection$$1.call(ui);
54617       }
54618
54619
54620       function showErrors() {
54621           keybindingOn();
54622           context.history().pop();
54623           loading.close();
54624           _isSaving = false;
54625
54626           var selection$$1 = uiConfirm(context.container());
54627           selection$$1
54628               .select('.modal-section.header')
54629               .append('h3')
54630               .text(t('save.error'));
54631
54632           addErrors(selection$$1, _errors);
54633           selection$$1.okButton();
54634       }
54635
54636
54637       function addErrors(selection$$1, data) {
54638           var message = selection$$1
54639               .select('.modal-section.message-text');
54640
54641           var items = message
54642               .selectAll('.error-container')
54643               .data(data);
54644
54645           var enter = items.enter()
54646               .append('div')
54647               .attr('class', 'error-container');
54648
54649           enter
54650               .append('a')
54651               .attr('class', 'error-description')
54652               .attr('href', '#')
54653               .classed('hide-toggle', true)
54654               .text(function(d) { return d.msg || t('save.unknown_error_details'); })
54655               .on('click', function() {
54656                   event.preventDefault();
54657
54658                   var error = select(this);
54659                   var detail = select(this.nextElementSibling);
54660                   var exp = error.classed('expanded');
54661
54662                   detail.style('display', exp ? 'none' : 'block');
54663                   error.classed('expanded', !exp);
54664               });
54665
54666           var details = enter
54667               .append('div')
54668               .attr('class', 'error-detail-container')
54669               .style('display', 'none');
54670
54671           details
54672               .append('ul')
54673               .attr('class', 'error-detail-list')
54674               .selectAll('li')
54675               .data(function(d) { return d.details || []; })
54676               .enter()
54677               .append('li')
54678               .attr('class', 'error-detail-item')
54679               .text(function(d) { return d; });
54680
54681           items.exit()
54682               .remove();
54683       }
54684
54685
54686       function success(changeset) {
54687           commit.reset();
54688
54689           var ui = uiSuccess$$1(context)
54690               .changeset(changeset)
54691               .location(_location)
54692               .on('cancel', function() { context.ui().sidebar.hide(); });
54693
54694           context.enter(modeBrowse(context).sidebar(ui));
54695       }
54696
54697
54698       function keybindingOn() {
54699           select(document)
54700               .call(keybinding.on('⎋', cancel, true));
54701       }
54702
54703
54704       function keybindingOff() {
54705           select(document)
54706               .call(keybinding.unbind);
54707       }
54708
54709
54710       // Reverse geocode current map location so we can display a message on
54711       // the success screen like "Thank you for editing around city, state."
54712       function loadLocation() {
54713           _location = null;
54714           if (!services.geocoder) return;
54715
54716           services.geocoder.reverse(context.map().center(), function(err, result) {
54717               if (err || !result || !result.address) return;
54718
54719               var parts = [];
54720               var addr = result.address;
54721               var city = addr && (addr.town || addr.city || addr.county);
54722               if (city) parts.push(city);
54723               var region = addr && (addr.state || addr.country);
54724               if (region) parts.push(region);
54725
54726               _location = parts.join(', ');
54727           });
54728       }
54729
54730
54731       mode.enter = function() {
54732           function done() {
54733               context.ui().sidebar.show(commit);
54734           }
54735
54736           keybindingOn();
54737
54738           context.container().selectAll('#content')
54739               .attr('class', 'inactive');
54740
54741           var osm = context.connection();
54742           if (!osm) {
54743               cancel();
54744               return;
54745           }
54746
54747           if (osm.authenticated()) {
54748               done();
54749           } else {
54750               osm.authenticate(function(err) {
54751                   if (err) {
54752                       cancel();
54753                   } else {
54754                       done();
54755                   }
54756               });
54757           }
54758       };
54759
54760
54761       mode.exit = function() {
54762           _isSaving = false;
54763
54764           keybindingOff();
54765
54766           context.container().selectAll('#content')
54767               .attr('class', 'active');
54768
54769           context.ui().sidebar.hide();
54770       };
54771
54772       return mode;
54773   }
54774
54775   // Translate a MacOS key command into the appropriate Windows/Linux equivalent.
54776   // For example, ⌘Z -> Ctrl+Z
54777   var uiCmd = function (code) {
54778       var detected = utilDetect();
54779
54780       if (detected.os === 'mac') {
54781           return code;
54782       }
54783
54784       if (detected.os === 'win') {
54785           if (code === '⌘⇧Z') return 'Ctrl+Y';
54786       }
54787
54788       var result = '',
54789           replacements = {
54790               '⌘': 'Ctrl',
54791               '⇧': 'Shift',
54792               '⌥': 'Alt',
54793               '⌫': 'Backspace',
54794               '⌦': 'Delete'
54795           };
54796
54797       for (var i = 0; i < code.length; i++) {
54798           if (code[i] in replacements) {
54799               result += replacements[code[i]] + (i < code.length - 1 ? '+' : '');
54800           } else {
54801               result += code[i];
54802           }
54803       }
54804
54805       return result;
54806   };
54807
54808
54809   // return a display-focused string for a given keyboard code
54810   uiCmd.display = function(code) {
54811       if (code.length !== 1) return code;
54812
54813       var detected = utilDetect();
54814       var mac = (detected.os === 'mac');
54815       var replacements = {
54816           '⌘': mac ? '⌘ ' + t('shortcuts.key.cmd')    : t('shortcuts.key.ctrl'),
54817           '⇧': mac ? '⇧ ' + t('shortcuts.key.shift')  : t('shortcuts.key.shift'),
54818           '⌥': mac ? '⌥ ' + t('shortcuts.key.option') : t('shortcuts.key.alt'),
54819           '⌃': mac ? '⌃ ' + t('shortcuts.key.ctrl')   : t('shortcuts.key.ctrl'),
54820           '⌫': mac ? '⌫ ' + t('shortcuts.key.delete') : t('shortcuts.key.backspace'),
54821           '⌦': mac ? '⌦ ' + t('shortcuts.key.del')    : t('shortcuts.key.del'),
54822           '↖': mac ? '↖ ' + t('shortcuts.key.pgup')   : t('shortcuts.key.pgup'),
54823           '↘': mac ? '↘ ' + t('shortcuts.key.pgdn')   : t('shortcuts.key.pgdn'),
54824           '⇞': mac ? '⇞ ' + t('shortcuts.key.home')   : t('shortcuts.key.home'),
54825           '⇟': mac ? '⇟ ' + t('shortcuts.key.end')    : t('shortcuts.key.end'),
54826           '↵': mac ? '↵ ' + t('shortcuts.key.return') : t('shortcuts.key.enter'),
54827           '⎋': mac ? '⎋ ' + t('shortcuts.key.esc')    : t('shortcuts.key.esc'),
54828       };
54829
54830       return replacements[code] || code;
54831   };
54832
54833   var _relatedParent;
54834
54835
54836   function modeSelect(context, selectedIDs) {
54837       var mode = {
54838           id: 'select',
54839           button: 'browse'
54840       };
54841
54842       var keybinding = utilKeybinding('select');
54843       var timeout = null;
54844       var behaviors = [
54845           behaviorCopy(context),
54846           behaviorPaste(context),
54847           behaviorBreathe(context),
54848           behaviorHover(context),
54849           behaviorSelect(context),
54850           behaviorLasso(context),
54851           modeDragNode$$1(context).restoreSelectedIDs(selectedIDs).behavior,
54852           modeDragNote$$1(context).behavior
54853       ];
54854       var editMenu;
54855       var newFeature = false;
54856       var suppressMenu = true;
54857       var follow = false;
54858
54859
54860       var wrap = context.container()
54861           .select('.inspector-wrap');
54862
54863
54864       function singular() {
54865           if (selectedIDs.length === 1) {
54866               return context.hasEntity(selectedIDs[0]);
54867           }
54868       }
54869
54870
54871       function checkSelectedIDs() {
54872           var ids = [];
54873           if (Array.isArray(selectedIDs)) {
54874               ids = selectedIDs.filter(function(id) {
54875                   return context.hasEntity(id);
54876               });
54877           }
54878
54879           if (ids.length) {
54880               selectedIDs = ids;
54881           } else {
54882               context.enter(modeBrowse(context));
54883           }
54884           return !!ids.length;
54885       }
54886
54887
54888       // find the common parent ways for nextVertex, previousVertex
54889       function commonParents() {
54890           var graph = context.graph();
54891           var commonParents = [];
54892
54893           for (var i = 0; i < selectedIDs.length; i++) {
54894               var entity = context.hasEntity(selectedIDs[i]);
54895               if (!entity || entity.geometry(graph) !== 'vertex') {
54896                   return [];  // selection includes some not vertexes
54897               }
54898
54899               var currParents = map$3(graph.parentWays(entity), 'id');
54900               if (!commonParents.length) {
54901                   commonParents = currParents;
54902                   continue;
54903               }
54904
54905               commonParents = intersection(commonParents, currParents);
54906               if (!commonParents.length) {
54907                   return [];
54908               }
54909           }
54910
54911           return commonParents;
54912       }
54913
54914
54915       function singularParent() {
54916           var parents = commonParents();
54917           if (!parents || parents.length === 0) {
54918               _relatedParent = null;
54919               return null;
54920           }
54921
54922           // relatedParent is used when we visit a vertex with multiple
54923           // parents, and we want to remember which parent line we started on.
54924
54925           if (parents.length === 1) {
54926               _relatedParent = parents[0];  // remember this parent for later
54927               return _relatedParent;
54928           }
54929
54930           if (parents.indexOf(_relatedParent) !== -1) {
54931               return _relatedParent;   // prefer the previously seen parent
54932           }
54933
54934           return parents[0];
54935       }
54936
54937
54938       function closeMenu() {
54939           if (editMenu) {
54940               context.surface().call(editMenu.close);
54941           }
54942       }
54943
54944
54945       function positionMenu() {
54946           if (!editMenu) { return; }
54947
54948           var entity = singular();
54949           if (entity && context.geometry(entity.id) === 'relation') {
54950               suppressMenu = true;
54951           } else {
54952               var point$$1 = context.mouse();
54953               var viewport = geoExtent$$1(context.projection.clipExtent()).polygon();
54954
54955               if (point$$1 && geoPointInPolygon(point$$1, viewport)) {
54956                   editMenu.center(point$$1);
54957               } else {
54958                   suppressMenu = true;
54959               }
54960           }
54961       }
54962
54963
54964       function showMenu() {
54965           closeMenu();
54966           if (editMenu) {
54967               context.surface().call(editMenu);
54968           }
54969       }
54970
54971
54972       function toggleMenu() {
54973           // deprecation warning - Radial Menu to be removed in iD v3
54974           if (select('.edit-menu, .radial-menu').empty()) {
54975               positionMenu();
54976               showMenu();
54977           } else {
54978               closeMenu();
54979           }
54980       }
54981
54982
54983       mode.selectedIDs = function() {
54984           return selectedIDs;
54985       };
54986
54987
54988       mode.reselect = function() {
54989           if (!checkSelectedIDs()) return;
54990
54991           var surfaceNode = context.surface().node();
54992           if (surfaceNode.focus) {   // FF doesn't support it
54993               surfaceNode.focus();
54994           }
54995
54996           positionMenu();
54997           if (!suppressMenu) {
54998               showMenu();
54999           }
55000       };
55001
55002
55003       mode.newFeature = function(_) {
55004           if (!arguments.length) return newFeature;
55005           newFeature = _;
55006           return mode;
55007       };
55008
55009
55010       mode.suppressMenu = function(_) {
55011           if (!arguments.length) return suppressMenu;
55012           suppressMenu = _;
55013           return mode;
55014       };
55015
55016
55017       mode.follow = function(_) {
55018           if (!arguments.length) return follow;
55019           follow = _;
55020           return mode;
55021       };
55022
55023
55024       mode.enter = function() {
55025
55026           function update() {
55027               closeMenu();
55028               checkSelectedIDs();
55029           }
55030
55031
55032           function dblclick() {
55033               var target = select(event.target);
55034
55035               var datum = target.datum();
55036               var entity = datum && datum.properties && datum.properties.entity;
55037               if (!entity) return;
55038
55039               if (entity instanceof osmWay && target.classed('target')) {
55040                   var choice = geoChooseEdge(context.childNodes(entity), context.mouse(), context.projection);
55041                   var prev = entity.nodes[choice.index - 1];
55042                   var next = entity.nodes[choice.index];
55043
55044                   context.perform(
55045                       actionAddMidpoint({loc: choice.loc, edge: [prev, next]}, osmNode()),
55046                       t('operations.add.annotation.vertex')
55047                   );
55048
55049                   event.preventDefault();
55050                   event.stopPropagation();
55051
55052               } else if (entity.type === 'midpoint') {
55053                   context.perform(
55054                       actionAddMidpoint({loc: entity.loc, edge: entity.edge}, osmNode()),
55055                       t('operations.add.annotation.vertex'));
55056
55057                   event.preventDefault();
55058                   event.stopPropagation();
55059               }
55060           }
55061
55062
55063           function selectElements(drawn) {
55064               if (!checkSelectedIDs()) return;
55065
55066               var surface = context.surface();
55067               var entity = singular();
55068
55069               if (entity && context.geometry(entity.id) === 'relation') {
55070                   suppressMenu = true;
55071                   return;
55072               }
55073
55074               surface.selectAll('.related')
55075                   .classed('related', false);
55076
55077               singularParent();
55078               if (_relatedParent) {
55079                   surface.selectAll(utilEntitySelector([_relatedParent]))
55080                       .classed('related', true);
55081               }
55082
55083               var selection$$1 = context.surface()
55084                   .selectAll(utilEntityOrMemberSelector(selectedIDs, context.graph()));
55085
55086               if (selection$$1.empty()) {
55087                   // Return to browse mode if selected DOM elements have
55088                   // disappeared because the user moved them out of view..
55089                   var source = event && event.type === 'zoom' && event.sourceEvent;
55090                   if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
55091                       context.enter(modeBrowse(context));
55092                   }
55093               } else {
55094                   selection$$1
55095                       .classed('selected', true);
55096               }
55097           }
55098
55099
55100           function esc() {
55101               context.enter(modeBrowse(context));
55102           }
55103
55104
55105           function firstVertex() {
55106               event.preventDefault();
55107               var entity = singular();
55108               var parent = singularParent();
55109               var way;
55110
55111               if (entity && entity.type === 'way') {
55112                   way = entity;
55113               } else if (parent) {
55114                   way = context.entity(parent);
55115               }
55116
55117               if (way) {
55118                   context.enter(
55119                       modeSelect(context, [way.first()]).follow(true)
55120                   );
55121               }
55122           }
55123
55124
55125           function lastVertex() {
55126               event.preventDefault();
55127               var entity = singular();
55128               var parent = singularParent();
55129               var way;
55130
55131               if (entity && entity.type === 'way') {
55132                   way = entity;
55133               } else if (parent) {
55134                   way = context.entity(parent);
55135               }
55136
55137               if (way) {
55138                   context.enter(
55139                       modeSelect(context, [way.last()]).follow(true)
55140                   );
55141               }
55142           }
55143
55144
55145           function previousVertex() {
55146               event.preventDefault();
55147               var parent = singularParent();
55148               if (!parent) return;
55149
55150               var way = context.entity(parent);
55151               var length = way.nodes.length;
55152               var curr = way.nodes.indexOf(selectedIDs[0]);
55153               var index = -1;
55154
55155               if (curr > 0) {
55156                   index = curr - 1;
55157               } else if (way.isClosed()) {
55158                   index = length - 2;
55159               }
55160
55161               if (index !== -1) {
55162                   context.enter(
55163                       modeSelect(context, [way.nodes[index]]).follow(true)
55164                   );
55165               }
55166           }
55167
55168
55169           function nextVertex() {
55170               event.preventDefault();
55171               var parent = singularParent();
55172               if (!parent) return;
55173
55174               var way = context.entity(parent);
55175               var length = way.nodes.length;
55176               var curr = way.nodes.indexOf(selectedIDs[0]);
55177               var index = -1;
55178
55179               if (curr < length - 1) {
55180                   index = curr + 1;
55181               } else if (way.isClosed()) {
55182                   index = 0;
55183               }
55184
55185               if (index !== -1) {
55186                   context.enter(
55187                       modeSelect(context, [way.nodes[index]]).follow(true)
55188                   );
55189               }
55190           }
55191
55192
55193           function nextParent() {
55194               event.preventDefault();
55195               var parents = uniq(commonParents());
55196               if (!parents || parents.length < 2) return;
55197
55198               var index = parents.indexOf(_relatedParent);
55199               if (index < 0 || index > parents.length - 2) {
55200                   _relatedParent = parents[0];
55201               } else {
55202                   _relatedParent = parents[index + 1];
55203               }
55204
55205               var surface = context.surface();
55206               surface.selectAll('.related')
55207                   .classed('related', false);
55208
55209               if (_relatedParent) {
55210                   surface.selectAll(utilEntitySelector([_relatedParent]))
55211                       .classed('related', true);
55212               }
55213           }
55214
55215
55216           if (!checkSelectedIDs()) return;
55217
55218           var operations = without(values$1(Operations), operationDelete)
55219               .map(function(o) { return o(selectedIDs, context); })
55220               .filter(function(o) { return o.available(); });
55221
55222           // deprecation warning - Radial Menu to be removed in iD v3
55223           var isRadialMenu = context.storage('edit-menu-style') === 'radial';
55224           if (isRadialMenu) {
55225               operations = operations.slice(0,7);
55226               operations.unshift(operationDelete(selectedIDs, context));
55227           } else {
55228               operations.push(operationDelete(selectedIDs, context));
55229           }
55230
55231           operations.forEach(function(operation) {
55232               if (operation.behavior) {
55233                   behaviors.push(operation.behavior);
55234               }
55235           });
55236
55237           behaviors.forEach(context.install);
55238
55239           keybinding
55240               .on(['[', 'pgup'], previousVertex)
55241               .on([']', 'pgdown'], nextVertex)
55242               .on(['{', uiCmd('⌘['), 'home'], firstVertex)
55243               .on(['}', uiCmd('⌘]'), 'end'], lastVertex)
55244               .on(['\\', 'pause'], nextParent)
55245               .on('⎋', esc, true)
55246               .on('space', toggleMenu);
55247
55248           select(document)
55249               .call(keybinding);
55250
55251
55252           // deprecation warning - Radial Menu to be removed in iD v3
55253           editMenu = isRadialMenu
55254               ? uiRadialMenu(context, operations)
55255               : uiEditMenu(context, operations);
55256
55257           context.ui().sidebar
55258               .select(singular() ? singular().id : null, newFeature);
55259
55260           context.history()
55261               .on('undone.select', update)
55262               .on('redone.select', update);
55263
55264           context.map()
55265               .on('move.select', closeMenu)
55266               .on('drawn.select', selectElements);
55267
55268           context.surface()
55269               .on('dblclick.select', dblclick);
55270
55271
55272           selectElements();
55273
55274           if (selectedIDs.length > 1) {
55275               var entities = uiSelectionList(context, selectedIDs);
55276               context.ui().sidebar.show(entities);
55277           }
55278
55279           if (follow) {
55280               var extent = geoExtent$$1();
55281               var graph = context.graph();
55282               selectedIDs.forEach(function(id) {
55283                   var entity = context.entity(id);
55284                   extent._extend(entity.extent(graph));
55285               });
55286
55287               var loc = extent.center();
55288               context.map().centerEase(loc);
55289           } else if (singular() && singular().type === 'way') {
55290               context.map().pan([0,0]);  // full redraw, to adjust z-sorting #2914
55291           }
55292
55293           timeout = window.setTimeout(function() {
55294               positionMenu();
55295               if (!suppressMenu) {
55296                   showMenu();
55297               }
55298           }, 270);  /* after any centerEase completes */
55299       };
55300
55301
55302       mode.exit = function() {
55303           if (timeout) window.clearTimeout(timeout);
55304
55305           behaviors.forEach(context.uninstall);
55306
55307           select(document)
55308               .call(keybinding.unbind);
55309
55310           closeMenu();
55311           editMenu = undefined;
55312
55313           context.history()
55314               .on('undone.select', null)
55315               .on('redone.select', null);
55316
55317           var surface = context.surface();
55318
55319           surface
55320               .on('dblclick.select', null);
55321
55322           surface
55323               .selectAll('.selected')
55324               .classed('selected', false);
55325
55326           surface
55327               .selectAll('.related')
55328               .classed('related', false);
55329
55330           context.map().on('drawn.select', null);
55331           context.ui().sidebar.hide();
55332       };
55333
55334
55335       return mode;
55336   }
55337
55338   function modeSelectData$$1(context, selectedDatum) {
55339       var mode = {
55340           id: 'select-data',
55341           button: 'browse'
55342       };
55343
55344       var keybinding = utilKeybinding('select-data');
55345       var dataEditor = uiDataEditor$$1(context);
55346
55347       var behaviors = [
55348           behaviorBreathe(context),
55349           behaviorHover(context),
55350           behaviorSelect(context),
55351           behaviorLasso(context),
55352           modeDragNode$$1(context).behavior,
55353           modeDragNote$$1(context).behavior
55354       ];
55355
55356
55357       // class the data as selected, or return to browse mode if the data is gone
55358       function selectData(drawn) {
55359           var selection$$1 = context.surface().selectAll('.layer-mapdata .data' + selectedDatum.__featurehash__);
55360
55361           if (selection$$1.empty()) {
55362               // Return to browse mode if selected DOM elements have
55363               // disappeared because the user moved them out of view..
55364               var source = event && event.type === 'zoom' && event.sourceEvent;
55365               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
55366                   context.enter(modeBrowse(context));
55367               }
55368           } else {
55369               selection$$1.classed('selected', true);
55370           }
55371       }
55372
55373
55374       function esc() {
55375           context.enter(modeBrowse(context));
55376       }
55377
55378
55379       mode.enter = function() {
55380           behaviors.forEach(context.install);
55381           keybinding.on('⎋', esc, true);
55382
55383           select(document)
55384               .call(keybinding);
55385
55386           selectData();
55387
55388           var sidebar = context.ui().sidebar;
55389           sidebar.show(dataEditor.datum(selectedDatum));
55390
55391           // expand the sidebar, avoid obscuring the data if needed
55392           var extent = geoExtent$$1(d3_geoBounds(selectedDatum));
55393           sidebar.expand(sidebar.intersects(extent));
55394
55395           context.map()
55396               .on('drawn.select-data', selectData);
55397       };
55398
55399
55400       mode.exit = function() {
55401           behaviors.forEach(context.uninstall);
55402
55403           select(document)
55404               .call(keybinding.unbind);
55405
55406           context.surface()
55407               .selectAll('.layer-mapdata .selected')
55408               .classed('selected hover', false);
55409
55410           context.map()
55411               .on('drawn.select-data', null);
55412
55413           context.ui().sidebar
55414               .hide();
55415       };
55416
55417
55418       return mode;
55419   }
55420
55421   function modeSelectNote$$1(context, selectedNoteID) {
55422       var mode = {
55423           id: 'select-note',
55424           button: 'browse'
55425       };
55426
55427       var osm = services.osm;
55428       var keybinding = utilKeybinding('select-note');
55429       var noteEditor = uiNoteEditor$$1(context)
55430           .on('change', function() {
55431               context.map().pan([0,0]);  // trigger a redraw
55432               var note = checkSelectedID();
55433               if (!note) return;
55434               context.ui().sidebar
55435                   .show(noteEditor.note(note));
55436           });
55437
55438       var behaviors = [
55439           behaviorBreathe(context),
55440           behaviorHover(context),
55441           behaviorSelect(context),
55442           behaviorLasso(context),
55443           modeDragNode$$1(context).behavior,
55444           modeDragNote$$1(context).behavior
55445       ];
55446
55447       var newFeature = false;
55448
55449
55450       function checkSelectedID() {
55451           if (!osm) return;
55452           var note = osm.getNote(selectedNoteID);
55453           if (!note) {
55454               context.enter(modeBrowse(context));
55455           }
55456           return note;
55457       }
55458
55459
55460       // class the note as selected, or return to browse mode if the note is gone
55461       function selectNote(drawn) {
55462           if (!checkSelectedID()) return;
55463
55464           var selection$$1 = context.surface().selectAll('.layer-notes .note-' + selectedNoteID);
55465
55466           if (selection$$1.empty()) {
55467               // Return to browse mode if selected DOM elements have
55468               // disappeared because the user moved them out of view..
55469               var source = event && event.type === 'zoom' && event.sourceEvent;
55470               if (drawn && source && (source.type === 'mousemove' || source.type === 'touchmove')) {
55471                   context.enter(modeBrowse(context));
55472               }
55473
55474           } else {
55475               selection$$1
55476                   .classed('selected', true);
55477               context.selectedNoteID(selectedNoteID);
55478           }
55479       }
55480
55481
55482       function esc() {
55483           context.enter(modeBrowse(context));
55484       }
55485
55486
55487       mode.newFeature = function(_) {
55488           if (!arguments.length) return newFeature;
55489           newFeature = _;
55490           return mode;
55491       };
55492
55493
55494       mode.enter = function() {
55495           var note = checkSelectedID();
55496           if (!note) return;
55497
55498           behaviors.forEach(context.install);
55499           keybinding.on('⎋', esc, true);
55500
55501           select(document)
55502               .call(keybinding);
55503
55504           selectNote();
55505
55506           var sidebar = context.ui().sidebar;
55507           sidebar.show(noteEditor.note(note));
55508
55509           // expand the sidebar, avoid obscuring the note if needed
55510           sidebar.expand(sidebar.intersects(note.extent()));
55511
55512           context.map()
55513               .on('drawn.select', selectNote);
55514       };
55515
55516
55517       mode.exit = function() {
55518           behaviors.forEach(context.uninstall);
55519
55520           select(document)
55521               .call(keybinding.unbind);
55522
55523           context.surface()
55524               .selectAll('.layer-notes .selected')
55525               .classed('selected hover', false);
55526
55527           context.map()
55528               .on('drawn.select', null);
55529
55530           context.ui().sidebar
55531               .hide();
55532
55533           context.selectedNoteID(null);
55534       };
55535
55536
55537       return mode;
55538   }
55539
55540   function behaviorAddWay(context) {
55541       var dispatch$$1 = dispatch('start', 'startFromWay', 'startFromNode');
55542       var draw = behaviorDraw(context);
55543
55544       function behavior(surface) {
55545           draw.on('click', function() { dispatch$$1.apply('start', this, arguments); })
55546               .on('clickWay', function() { dispatch$$1.apply('startFromWay', this, arguments); })
55547               .on('clickNode', function() { dispatch$$1.apply('startFromNode', this, arguments); })
55548               .on('cancel', behavior.cancel)
55549               .on('finish', behavior.cancel);
55550
55551           context.map()
55552               .dblclickEnable(false);
55553
55554           surface.call(draw);
55555       }
55556
55557
55558       behavior.off = function(surface) {
55559           surface.call(draw.off);
55560       };
55561
55562
55563       behavior.cancel = function() {
55564           window.setTimeout(function() {
55565               context.map().dblclickEnable(true);
55566           }, 1000);
55567
55568           context.enter(modeBrowse(context));
55569       };
55570
55571
55572       behavior.tail = function(text) {
55573           draw.tail(text);
55574           return behavior;
55575       };
55576
55577
55578       return utilRebind(behavior, dispatch$$1, 'on');
55579   }
55580
55581   function behaviorBreathe() {
55582       var duration = 800;
55583       var steps = 4;
55584       var selector$$1 = '.selected.shadow, .selected .shadow';
55585       var _selected = select(null);
55586       var _classed = '';
55587       var _params = {};
55588       var _done = false;
55589       var _timer;
55590
55591
55592       function ratchetyInterpolator(a, b, steps, units) {
55593           a = parseFloat(a);
55594           b = parseFloat(b);
55595           var sample = quantize()
55596               .domain([0, 1])
55597               .range(d3_quantize(interpolateNumber(a, b), steps));
55598
55599           return function(t) {
55600               return String(sample(t)) + (units || '');
55601           };
55602       }
55603
55604
55605       function reset(selection$$1) {
55606           selection$$1
55607               .style('stroke-opacity', null)
55608               .style('stroke-width', null)
55609               .style('fill-opacity', null)
55610               .style('r', null);
55611       }
55612
55613
55614       function setAnimationParams(transition, fromTo) {
55615           var toFrom = (fromTo === 'from' ? 'to' : 'from');
55616
55617           transition
55618               .styleTween('stroke-opacity', function(d) {
55619                   return ratchetyInterpolator(
55620                       _params[d.id][toFrom].opacity,
55621                       _params[d.id][fromTo].opacity,
55622                       steps
55623                   );
55624               })
55625               .styleTween('stroke-width', function(d) {
55626                   return ratchetyInterpolator(
55627                       _params[d.id][toFrom].width,
55628                       _params[d.id][fromTo].width,
55629                       steps,
55630                       'px'
55631                   );
55632               })
55633               .styleTween('fill-opacity', function(d) {
55634                   return ratchetyInterpolator(
55635                       _params[d.id][toFrom].opacity,
55636                       _params[d.id][fromTo].opacity,
55637                       steps
55638                   );
55639               })
55640               .styleTween('r', function(d) {
55641                   return ratchetyInterpolator(
55642                       _params[d.id][toFrom].width,
55643                       _params[d.id][fromTo].width,
55644                       steps,
55645                       'px'
55646                   );
55647               });
55648       }
55649
55650
55651       function calcAnimationParams(selection$$1) {
55652           selection$$1
55653               .call(reset)
55654               .each(function(d) {
55655                   var s = select(this);
55656                   var tag = s.node().tagName;
55657                   var p = {'from': {}, 'to': {}};
55658                   var opacity;
55659                   var width;
55660
55661                   // determine base opacity and width
55662                   if (tag === 'circle') {
55663                       opacity = parseFloat(s.style('fill-opacity') || 0.5);
55664                       width = parseFloat(s.style('r') || 15.5);
55665                   } else {
55666                       opacity = parseFloat(s.style('stroke-opacity') || 0.7);
55667                       width = parseFloat(s.style('stroke-width') || 10);
55668                   }
55669
55670                   // calculate from/to interpolation params..
55671                   p.tag = tag;
55672                   p.from.opacity = opacity * 0.6;
55673                   p.to.opacity = opacity * 1.25;
55674                   p.from.width = width * 0.7;
55675                   p.to.width = width * (tag === 'circle' ? 1.5 : 1);
55676                   _params[d.id] = p;
55677               });
55678       }
55679
55680
55681       function run(surface, fromTo) {
55682           var toFrom = (fromTo === 'from' ? 'to' : 'from');
55683           var currSelected = surface.selectAll(selector$$1);
55684           var currClassed = surface.attr('class');
55685
55686           if (_done || currSelected.empty()) {
55687               _selected.call(reset);
55688               return;
55689           }
55690
55691           if (!isEqual(currSelected.data(), _selected.data()) || currClassed !== _classed) {
55692               _selected.call(reset);
55693               _classed = currClassed;
55694               _selected = currSelected.call(calcAnimationParams);
55695           }
55696
55697           _selected
55698               .transition()
55699               .duration(duration)
55700               .call(setAnimationParams, fromTo)
55701               .on('end', function() {
55702                   surface.call(run, toFrom);
55703               });
55704       }
55705
55706
55707       function behavior(surface) {
55708           _done = false;
55709           _timer = timer(function() {
55710               // wait for elements to actually become selected
55711               if (surface.selectAll(selector$$1).empty()) {
55712                   return false;
55713               }
55714
55715               surface.call(run, 'from');
55716               _timer.stop();
55717               return true;
55718           }, 20);
55719       }
55720
55721
55722       behavior.off = function() {
55723           _done = true;
55724           if (_timer) {
55725               _timer.stop();
55726           }
55727           _selected
55728               .interrupt()
55729               .call(reset);
55730       };
55731
55732
55733       return behavior;
55734   }
55735
55736   function behaviorCopy(context) {
55737
55738       function groupEntities(ids, graph) {
55739           var entities = ids.map(function (id) { return graph.entity(id); });
55740           return assignIn({relation: [], way: [], node: []},
55741               groupBy(entities, function(entity) { return entity.type; }));
55742       }
55743
55744
55745       function getDescendants(id, graph, descendants) {
55746           var entity = graph.entity(id);
55747           var children;
55748
55749           descendants = descendants || {};
55750
55751           if (entity.type === 'relation') {
55752               children = map$3(entity.members, 'id');
55753           } else if (entity.type === 'way') {
55754               children = entity.nodes;
55755           } else {
55756               children = [];
55757           }
55758
55759           for (var i = 0; i < children.length; i++) {
55760               if (!descendants[children[i]]) {
55761                   descendants[children[i]] = true;
55762                   descendants = getDescendants(children[i], graph, descendants);
55763               }
55764           }
55765
55766           return descendants;
55767       }
55768
55769
55770       function getSelectionText() {
55771           return window.getSelection().toString();
55772       }
55773
55774
55775       function doCopy() {
55776           if (!getSelectionText()) {
55777               event.preventDefault();
55778           }
55779
55780           var graph = context.graph();
55781           var selected = groupEntities(context.selectedIDs(), graph);
55782           var canCopy = [];
55783           var skip = {};
55784           var entity;
55785           var i;
55786
55787           for (i = 0; i < selected.relation.length; i++) {
55788               entity = selected.relation[i];
55789               if (!skip[entity.id] && entity.isComplete(graph)) {
55790                   canCopy.push(entity.id);
55791                   skip = getDescendants(entity.id, graph, skip);
55792               }
55793           }
55794           for (i = 0; i < selected.way.length; i++) {
55795               entity = selected.way[i];
55796               if (!skip[entity.id]) {
55797                   canCopy.push(entity.id);
55798                   skip = getDescendants(entity.id, graph, skip);
55799               }
55800           }
55801           for (i = 0; i < selected.node.length; i++) {
55802               entity = selected.node[i];
55803               if (!skip[entity.id]) {
55804                   canCopy.push(entity.id);
55805               }
55806           }
55807
55808           context.copyIDs(canCopy);
55809       }
55810
55811
55812       function behavior() {
55813           context.keybinding().on(uiCmd('⌘C'), doCopy);
55814           return behavior;
55815       }
55816
55817       behavior.off = function() {
55818           context.keybinding().off(uiCmd('⌘C'));
55819       };
55820
55821
55822       return behavior;
55823   }
55824
55825   /*
55826       `behaviorDrag` is like `d3_behavior.drag`, with the following differences:
55827
55828       * The `origin` function is expected to return an [x, y] tuple rather than an
55829         {x, y} object.
55830       * The events are `start`, `move`, and `end`.
55831         (https://github.com/mbostock/d3/issues/563)
55832       * The `start` event is not dispatched until the first cursor movement occurs.
55833         (https://github.com/mbostock/d3/pull/368)
55834       * The `move` event has a `point` and `delta` [x, y] tuple properties rather
55835         than `x`, `y`, `dx`, and `dy` properties.
55836       * The `end` event is not dispatched if no movement occurs.
55837       * An `off` function is available that unbinds the drag's internal event handlers.
55838    */
55839
55840   function behaviorDrag() {
55841       var dispatch$$1 = dispatch('start', 'move', 'end');
55842       var _origin = null;
55843       var _selector = '';
55844       var _event;
55845       var _target;
55846       var _surface;
55847
55848
55849       var d3_event_userSelectProperty = utilPrefixCSSProperty('UserSelect');
55850       var d3_event_userSelectSuppress = function() {
55851               var selection$$1 = selection();
55852               var select$$1 = selection$$1.style(d3_event_userSelectProperty);
55853               selection$$1.style(d3_event_userSelectProperty, 'none');
55854               return function() {
55855                   selection$$1.style(d3_event_userSelectProperty, select$$1);
55856               };
55857           };
55858
55859
55860       function d3_eventCancel() {
55861           event.stopPropagation();
55862           event.preventDefault();
55863       }
55864
55865
55866       function eventOf(thiz, argumentz) {
55867           return function(e1) {
55868               e1.target = behavior;
55869               customEvent(e1, dispatch$$1.apply, dispatch$$1, [e1.type, thiz, argumentz]);
55870           };
55871       }
55872
55873
55874       function dragstart() {
55875           _target = this;
55876           _event = eventOf(_target, arguments);
55877
55878           var eventTarget = event.target;
55879           var touchId = event.touches ? event.changedTouches[0].identifier : null;
55880           var offset;
55881           var startOrigin = point$$1();
55882           var started = false;
55883           var selectEnable = d3_event_userSelectSuppress(touchId !== null ? 'drag-' + touchId : 'drag');
55884
55885           select(window)
55886               .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', dragmove)
55887               .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', dragend, true);
55888
55889           if (_origin) {
55890               offset = _origin.apply(_target, arguments);
55891               offset = [offset[0] - startOrigin[0], offset[1] - startOrigin[1]];
55892           } else {
55893               offset = [0, 0];
55894           }
55895
55896           if (touchId === null) {
55897               event.stopPropagation();
55898           }
55899
55900
55901           function point$$1() {
55902               var p = _surface || _target.parentNode;
55903               return touchId !== null ? d3_touches(p).filter(function(p) {
55904                   return p.identifier === touchId;
55905               })[0] : mouse(p);
55906           }
55907
55908
55909           function dragmove() {
55910               var p = point$$1();
55911               var dx = p[0] - startOrigin[0];
55912               var dy = p[1] - startOrigin[1];
55913
55914               if (dx === 0 && dy === 0)
55915                   return;
55916
55917               startOrigin = p;
55918               d3_eventCancel();
55919
55920               if (!started) {
55921                   started = true;
55922                   _event({ type: 'start' });
55923               } else {
55924                   _event({
55925                       type: 'move',
55926                       point: [p[0] + offset[0],  p[1] + offset[1]],
55927                       delta: [dx, dy]
55928                   });
55929               }
55930           }
55931
55932
55933           function dragend() {
55934               if (started) {
55935                   _event({ type: 'end' });
55936
55937                   d3_eventCancel();
55938                   if (event.target === eventTarget) {
55939                       select(window)
55940                           .on('click.drag', click, true);
55941                   }
55942               }
55943
55944               select(window)
55945                   .on(touchId !== null ? 'touchmove.drag-' + touchId : 'mousemove.drag', null)
55946                   .on(touchId !== null ? 'touchend.drag-' + touchId : 'mouseup.drag', null);
55947
55948               selectEnable();
55949           }
55950
55951
55952           function click() {
55953               d3_eventCancel();
55954               select(window)
55955                   .on('click.drag', null);
55956           }
55957       }
55958
55959
55960       function behavior(selection$$1) {
55961           var matchesSelector = utilPrefixDOMProperty('matchesSelector');
55962           var delegate = dragstart;
55963
55964           if (_selector) {
55965               delegate = function() {
55966                   var root = this;
55967                   var target = event.target;
55968                   for (; target && target !== root; target = target.parentNode) {
55969                       var datum = target.__data__;
55970
55971                       var entity = datum instanceof osmNote ?
55972                           datum : datum && datum.properties && datum.properties.entity;
55973
55974                       if (entity && target[matchesSelector](_selector)) {
55975                           return dragstart.call(target, entity);
55976                       }
55977                   }
55978               };
55979           }
55980
55981           selection$$1
55982               .on('mousedown.drag' + _selector, delegate)
55983               .on('touchstart.drag' + _selector, delegate);
55984       }
55985
55986
55987       behavior.off = function(selection$$1) {
55988           selection$$1
55989               .on('mousedown.drag' + _selector, null)
55990               .on('touchstart.drag' + _selector, null);
55991       };
55992
55993
55994       behavior.selector = function(_) {
55995           if (!arguments.length) return _selector;
55996           _selector = _;
55997           return behavior;
55998       };
55999
56000
56001       behavior.origin = function(_) {
56002           if (!arguments.length) return _origin;
56003           _origin = _;
56004           return behavior;
56005       };
56006
56007
56008       behavior.cancel = function() {
56009           select(window)
56010               .on('mousemove.drag', null)
56011               .on('mouseup.drag', null);
56012           return behavior;
56013       };
56014
56015
56016       behavior.target = function() {
56017           if (!arguments.length) return _target;
56018           _target = arguments[0];
56019           _event = eventOf(_target, Array.prototype.slice.call(arguments, 1));
56020           return behavior;
56021       };
56022
56023
56024       behavior.surface = function() {
56025           if (!arguments.length) return _surface;
56026           _surface = arguments[0];
56027           return behavior;
56028       };
56029
56030
56031       return utilRebind(behavior, dispatch$$1, 'on');
56032   }
56033
56034   function behaviorDrawWay(context, wayId, index, mode, startGraph) {
56035       var origWay = context.entity(wayId);
56036       var annotation = t((origWay.isDegenerate() ?
56037           'operations.start.annotation.' :
56038           'operations.continue.annotation.') + context.geometry(wayId)
56039       );
56040       var behavior = behaviorDraw(context);
56041       var _tempEdits = 0;
56042
56043       var end = osmNode({ loc: context.map().mouseCoordinates() });
56044
56045       // Push an annotated state for undo to return back to.
56046       // We must make sure to remove this edit later.
56047       context.perform(actionNoop(), annotation);
56048       _tempEdits++;
56049
56050       // Add the drawing node to the graph.
56051       // We must make sure to remove this edit later.
56052       context.perform(_actionAddDrawNode());
56053       _tempEdits++;
56054
56055
56056       function keydown() {
56057           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
56058               if (context.surface().classed('nope')) {
56059                   context.surface()
56060                       .classed('nope-suppressed', true);
56061               }
56062               context.surface()
56063                   .classed('nope', false)
56064                   .classed('nope-disabled', true);
56065           }
56066       }
56067
56068
56069       function keyup() {
56070           if (event.keyCode === utilKeybinding.modifierCodes.alt) {
56071               if (context.surface().classed('nope-suppressed')) {
56072                   context.surface()
56073                       .classed('nope', true);
56074               }
56075               context.surface()
56076                   .classed('nope-suppressed', false)
56077                   .classed('nope-disabled', false);
56078           }
56079       }
56080
56081
56082       // related code
56083       // - `mode/drag_node.js`     `doMode()`
56084       // - `behavior/draw.js`      `click()`
56085       // - `behavior/draw_way.js`  `move()`
56086       function move(datum) {
56087           context.surface().classed('nope-disabled', event.altKey);
56088
56089           var targetLoc = datum && datum.properties && datum.properties.entity && datum.properties.entity.loc;
56090           var targetNodes = datum && datum.properties && datum.properties.nodes;
56091           var loc = context.map().mouseCoordinates();
56092
56093           if (targetLoc) {   // snap to node/vertex - a point target with `.loc`
56094               loc = targetLoc;
56095
56096           } else if (targetNodes) {   // snap to way - a line target with `.nodes`
56097               var choice = geoChooseEdge(targetNodes, context.mouse(), context.projection, end.id);
56098               if (choice) {
56099                   loc = choice.loc;
56100               }
56101           }
56102
56103           context.replace(actionMoveNode(end.id, loc));
56104           end = context.entity(end.id);
56105           checkGeometry(false);
56106       }
56107
56108
56109       // Check whether this edit causes the geometry to break.
56110       // If so, class the surface with a nope cursor.
56111       // `finishDraw` - Only checks the relevant line segments if finishing drawing
56112       function checkGeometry(finishDraw) {
56113           var nopeDisabled = context.surface().classed('nope-disabled');
56114           var isInvalid = isInvalidGeometry(end, context.graph(), finishDraw);
56115
56116           if (nopeDisabled) {
56117               context.surface()
56118                   .classed('nope', false)
56119                   .classed('nope-suppressed', isInvalid);
56120           } else {
56121               context.surface()
56122                   .classed('nope', isInvalid)
56123                   .classed('nope-suppressed', false);
56124           }
56125       }
56126
56127
56128       function isInvalidGeometry(entity, graph, finishDraw) {
56129           var parents = graph.parentWays(entity);
56130
56131           for (var i = 0; i < parents.length; i++) {
56132               var parent = parents[i];
56133               var nodes = parent.nodes.map(function(nodeID) { return graph.entity(nodeID); });
56134
56135               if (origWay.isClosed()) { // Check if Area
56136                   if (finishDraw) {
56137                       nodes.splice(-2, 1);
56138                       entity = nodes[nodes.length-2];
56139                   } else {
56140                       nodes.pop();
56141                   }
56142               } else { // Line
56143                   if (finishDraw) {
56144                       nodes.pop();
56145                   }
56146               }
56147
56148               if (geoHasSelfIntersections(nodes, entity.id)) {
56149                   return true;
56150               }
56151           }
56152
56153           return false;
56154       }
56155
56156
56157       function undone() {
56158           // Undo popped the history back to the initial annotated no-op edit.
56159           // Remove initial no-op edit and whatever edit happened immediately before it.
56160           context.pop(2);
56161           _tempEdits = 0;
56162
56163           if (context.hasEntity(wayId)) {
56164               context.enter(mode);
56165           } else {
56166               context.enter(modeBrowse(context));
56167           }
56168       }
56169
56170
56171       function setActiveElements() {
56172           context.surface().selectAll('.' + end.id)
56173               .classed('active', true);
56174       }
56175
56176
56177       var drawWay = function(surface) {
56178           behavior
56179               .on('move', move)
56180               .on('click', drawWay.add)
56181               .on('clickWay', drawWay.addWay)
56182               .on('clickNode', drawWay.addNode)
56183               .on('undo', context.undo)
56184               .on('cancel', drawWay.cancel)
56185               .on('finish', drawWay.finish);
56186
56187           select(window)
56188               .on('keydown.drawWay', keydown)
56189               .on('keyup.drawWay', keyup);
56190
56191           context.map()
56192               .dblclickEnable(false)
56193               .on('drawn.draw', setActiveElements);
56194
56195           setActiveElements();
56196
56197           surface.call(behavior);
56198
56199           context.history()
56200               .on('undone.draw', undone);
56201       };
56202
56203
56204       drawWay.off = function(surface) {
56205           // Drawing was interrupted unexpectedly.
56206           // This can happen if the user changes modes,
56207           // clicks geolocate button, a hashchange event occurs, etc.
56208           if (_tempEdits) {
56209               context.pop(_tempEdits);
56210               while (context.graph() !== startGraph) {
56211                   context.pop();
56212               }
56213           }
56214
56215           context.map()
56216               .on('drawn.draw', null);
56217
56218           surface.call(behavior.off)
56219               .selectAll('.active')
56220               .classed('active', false);
56221
56222           surface
56223               .classed('nope', false)
56224               .classed('nope-suppressed', false)
56225               .classed('nope-disabled', false);
56226
56227           select(window)
56228               .on('keydown.hover', null)
56229               .on('keyup.hover', null);
56230
56231           context.history()
56232               .on('undone.draw', null);
56233       };
56234
56235
56236       function _actionAddDrawNode() {
56237           return function(graph) {
56238               return graph
56239                   .replace(end)
56240                   .replace(origWay.addNode(end.id, index));
56241           };
56242       }
56243
56244
56245       function _actionReplaceDrawNode(newNode) {
56246           return function(graph) {
56247               return graph
56248                   .replace(origWay.addNode(newNode.id, index))
56249                   .remove(end);
56250           };
56251       }
56252
56253
56254       // Accept the current position of the drawing node and continue drawing.
56255       drawWay.add = function(loc, d) {
56256           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56257               return;   // can't click here
56258           }
56259
56260           context.pop(_tempEdits);
56261           _tempEdits = 0;
56262
56263           context.perform(
56264               _actionAddDrawNode(),
56265               annotation
56266           );
56267
56268           checkGeometry(false);   // finishDraw = false
56269           context.enter(mode);
56270       };
56271
56272
56273       // Connect the way to an existing way.
56274       drawWay.addWay = function(loc, edge, d) {
56275           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56276               return;   // can't click here
56277           }
56278
56279           context.pop(_tempEdits);
56280           _tempEdits = 0;
56281
56282           context.perform(
56283               _actionAddDrawNode(),
56284               actionAddMidpoint({ loc: loc, edge: edge }, end),
56285               annotation
56286           );
56287
56288           checkGeometry(false);   // finishDraw = false
56289           context.enter(mode);
56290       };
56291
56292
56293       // Connect the way to an existing node and continue drawing.
56294       drawWay.addNode = function(node, d) {
56295           if ((d && d.properties && d.properties.nope) || context.surface().classed('nope')) {
56296               return;   // can't click here
56297           }
56298
56299           context.pop(_tempEdits);
56300           _tempEdits = 0;
56301
56302           context.perform(
56303               _actionReplaceDrawNode(node),
56304               annotation
56305           );
56306
56307           checkGeometry(false);   // finishDraw = false
56308           context.enter(mode);
56309       };
56310
56311
56312       // Finish the draw operation, removing the temporary edits.
56313       // If the way has enough nodes to be valid, it's selected.
56314       // Otherwise, delete everything and return to browse mode.
56315       drawWay.finish = function() {
56316           checkGeometry(true);   // finishDraw = true
56317           if (context.surface().classed('nope')) {
56318               return;   // can't click here
56319           }
56320
56321           context.pop(_tempEdits);
56322           _tempEdits = 0;
56323
56324           var way = context.hasEntity(wayId);
56325           if (!way || way.isDegenerate()) {
56326               drawWay.cancel();
56327               return;
56328           }
56329
56330           window.setTimeout(function() {
56331               context.map().dblclickEnable(true);
56332           }, 1000);
56333
56334           context.enter(modeSelect(context, [wayId]).newFeature(true));
56335       };
56336
56337
56338       // Cancel the draw operation, delete everything, and return to browse mode.
56339       drawWay.cancel = function() {
56340           context.pop(_tempEdits);
56341           _tempEdits = 0;
56342
56343           while (context.graph() !== startGraph) {
56344               context.pop();
56345           }
56346
56347           window.setTimeout(function() {
56348               context.map().dblclickEnable(true);
56349           }, 1000);
56350
56351           context.surface()
56352               .classed('nope', false)
56353               .classed('nope-disabled', false)
56354               .classed('nope-suppressed', false);
56355
56356           context.enter(modeBrowse(context));
56357       };
56358
56359
56360       drawWay.activeID = function() {
56361           if (!arguments.length) return end.id;
56362           // no assign
56363           return drawWay;
56364       };
56365
56366
56367       drawWay.tail = function(text) {
56368           behavior.tail(text);
56369           return drawWay;
56370       };
56371
56372
56373       return drawWay;
56374   }
56375
56376   function behaviorHash(context) {
56377       var s0 = null; // cached window.location.hash
56378       var lat = 90 - 1e-8; // allowable latitude range
56379
56380
56381       var parser = function(map, s) {
56382           var q = utilStringQs(s);
56383           var args = (q.map || '').split('/').map(Number);
56384
56385           if (args.length < 3 || args.some(isNaN)) {
56386               return true; // replace bogus hash
56387
56388           } else if (s !== formatter(map).slice(1)) {   // hash has changed
56389               var mode = context.mode(),
56390                   dist = geoSphericalDistance(map.center(), [args[2], args[1]]),
56391                   maxdist = 500;
56392
56393               // Don't allow the hash location to change too much while drawing
56394               // This can happen if the user accidently hit the back button.  #3996
56395               if (mode && mode.id.match(/^draw/) !== null && dist > maxdist) {
56396                   context.enter(modeBrowse(context));
56397               }
56398
56399               map.centerZoom([args[2], Math.min(lat, Math.max(-lat, args[1]))], args[0]);
56400           }
56401       };
56402
56403
56404       var formatter = function(map) {
56405           var center = map.center();
56406           var zoom = map.zoom();
56407           var precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2));
56408           var q = omit(utilStringQs(window.location.hash.substring(1)),
56409               ['comment', 'source', 'hashtags', 'walkthrough']
56410           );
56411           var newParams = {};
56412
56413           delete q.id;
56414           var selected = context.selectedIDs().filter(function(id) {
56415               return !context.entity(id).isNew();
56416           });
56417           if (selected.length) {
56418               newParams.id = selected.join(',');
56419           }
56420
56421           newParams.map = zoom.toFixed(2) +
56422               '/' + center[1].toFixed(precision) +
56423               '/' + center[0].toFixed(precision);
56424
56425           return '#' + utilQsString(assign(q, newParams), true);
56426       };
56427
56428
56429       function update() {
56430           if (context.inIntro()) return;
56431           var s1 = formatter(context.map());
56432           if (s0 !== s1) {
56433               window.location.replace(s0 = s1);  // don't recenter the map!
56434           }
56435       }
56436
56437
56438       var throttledUpdate = throttle(update, 500);
56439
56440
56441       function hashchange() {
56442           if (window.location.hash === s0) return;  // ignore spurious hashchange events
56443           if (parser(context.map(), (s0 = window.location.hash).substring(1))) {
56444               update(); // replace bogus hash
56445           }
56446       }
56447
56448
56449       function behavior() {
56450           context.map()
56451               .on('move.hash', throttledUpdate);
56452
56453           context
56454               .on('enter.hash', throttledUpdate);
56455
56456           select(window)
56457               .on('hashchange.hash', hashchange);
56458
56459           if (window.location.hash) {
56460               var q = utilStringQs(window.location.hash.substring(1));
56461
56462               if (q.id) {
56463                   context.zoomToEntity(q.id.split(',')[0], !q.map);
56464               }
56465
56466               if (q.comment) {
56467                   context.storage('comment', q.comment);
56468                   context.storage('commentDate', Date.now());
56469               }
56470
56471               if (q.source) {
56472                   context.storage('source', q.source);
56473                   context.storage('commentDate', Date.now());
56474               }
56475
56476               if (q.hashtags) {
56477                   context.storage('hashtags', q.hashtags);
56478               }
56479
56480               if (q.walkthrough === 'true') {
56481                   behavior.startWalkthrough = true;
56482               }
56483
56484               hashchange();
56485
56486               if (q.map) {
56487                   behavior.hadHash = true;
56488               }
56489           }
56490       }
56491
56492
56493       behavior.off = function() {
56494           throttledUpdate.cancel();
56495
56496           context.map()
56497               .on('move.hash', null);
56498
56499           context
56500               .on('enter.hash', null);
56501
56502           select(window)
56503               .on('hashchange.hash', null);
56504
56505           window.location.hash = '';
56506       };
56507
56508
56509       return behavior;
56510   }
56511
56512   function behaviorLasso(context) {
56513
56514       var behavior = function(selection$$1) {
56515           var lasso;
56516
56517
56518           function mousedown() {
56519               var button = 0;  // left
56520               if (event.button === button && event.shiftKey === true) {
56521                   lasso = null;
56522
56523                   select(window)
56524                       .on('mousemove.lasso', mousemove)
56525                       .on('mouseup.lasso', mouseup);
56526
56527                   event.stopPropagation();
56528               }
56529           }
56530
56531
56532           function mousemove() {
56533               if (!lasso) {
56534                   lasso = uiLasso(context);
56535                   context.surface().call(lasso);
56536               }
56537
56538               lasso.p(context.mouse());
56539           }
56540
56541
56542           function normalize(a, b) {
56543               return [
56544                   [Math.min(a[0], b[0]), Math.min(a[1], b[1])],
56545                   [Math.max(a[0], b[0]), Math.max(a[1], b[1])]];
56546           }
56547
56548
56549           function lassoed() {
56550               if (!lasso) return [];
56551
56552               var graph = context.graph();
56553               var bounds = lasso.extent().map(context.projection.invert);
56554               var extent = geoExtent$$1(normalize(bounds[0], bounds[1]));
56555
56556               return map$3(context.intersects(extent).filter(function(entity) {
56557                   return entity.type === 'node' &&
56558                       geoPointInPolygon(context.projection(entity.loc), lasso.coordinates) &&
56559                       !context.features().isHidden(entity, graph, entity.geometry(graph));
56560               }), 'id');
56561           }
56562
56563
56564           function mouseup() {
56565               select(window)
56566                   .on('mousemove.lasso', null)
56567                   .on('mouseup.lasso', null);
56568
56569               if (!lasso) return;
56570
56571               var ids = lassoed();
56572               lasso.close();
56573
56574               if (ids.length) {
56575                   context.enter(modeSelect(context, ids));
56576               }
56577           }
56578
56579           selection$$1
56580               .on('mousedown.lasso', mousedown);
56581       };
56582
56583
56584       behavior.off = function(selection$$1) {
56585           selection$$1.on('mousedown.lasso', null);
56586       };
56587
56588
56589       return behavior;
56590   }
56591
56592   /* Creates a keybinding behavior for an operation */
56593   function behaviorOperation(context) {
56594       var _operation;
56595
56596       function keypress() {
56597           event.preventDefault();
56598           var disabled = _operation.disabled();
56599           var flash;
56600
56601           if (disabled) {
56602               flash = uiFlash()
56603                   .duration(4000)
56604                   .iconName('#iD-operation-' + _operation.id)
56605                   .iconClass('operation disabled')
56606                   .text(_operation.tooltip);
56607
56608               flash();
56609
56610           } else {
56611               flash = uiFlash()
56612                   .duration(2000)
56613                   .iconName('#iD-operation-' + _operation.id)
56614                   .iconClass('operation')
56615                   .text(_operation.annotation() || _operation.title);
56616
56617               flash();
56618               _operation();
56619           }
56620       }
56621
56622
56623       function behavior() {
56624           if (_operation && _operation.available()) {
56625               context.keybinding()
56626                   .on(_operation.keys, keypress);
56627           }
56628
56629           return behavior;
56630       }
56631
56632
56633       behavior.off = function() {
56634           context.keybinding()
56635               .off(_operation.keys);
56636       };
56637
56638
56639       behavior.which = function (_) {
56640           if (!arguments.length) return _operation;
56641           _operation = _;
56642           return behavior;
56643       };
56644
56645
56646       return behavior;
56647   }
56648
56649   /**
56650    * The base implementation of `_.invert` and `_.invertBy` which inverts
56651    * `object` with values transformed by `iteratee` and set by `setter`.
56652    *
56653    * @private
56654    * @param {Object} object The object to iterate over.
56655    * @param {Function} setter The function to set `accumulator` values.
56656    * @param {Function} iteratee The iteratee to transform values.
56657    * @param {Object} accumulator The initial inverted object.
56658    * @returns {Function} Returns `accumulator`.
56659    */
56660   function baseInverter(object, setter, iteratee, accumulator) {
56661     baseForOwn(object, function(value, key, object) {
56662       setter(accumulator, iteratee(value), key, object);
56663     });
56664     return accumulator;
56665   }
56666
56667   /**
56668    * Creates a function like `_.invertBy`.
56669    *
56670    * @private
56671    * @param {Function} setter The function to set accumulator values.
56672    * @param {Function} toIteratee The function to resolve iteratees.
56673    * @returns {Function} Returns the new inverter function.
56674    */
56675   function createInverter(setter, toIteratee) {
56676     return function(object, iteratee) {
56677       return baseInverter(object, setter, toIteratee(iteratee), {});
56678     };
56679   }
56680
56681   /** Used for built-in method references. */
56682   var objectProto$j = Object.prototype;
56683
56684   /**
56685    * Used to resolve the
56686    * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)
56687    * of values.
56688    */
56689   var nativeObjectToString$2 = objectProto$j.toString;
56690
56691   /**
56692    * Creates an object composed of the inverted keys and values of `object`.
56693    * If `object` contains duplicate values, subsequent values overwrite
56694    * property assignments of previous values.
56695    *
56696    * @static
56697    * @memberOf _
56698    * @since 0.7.0
56699    * @category Object
56700    * @param {Object} object The object to invert.
56701    * @returns {Object} Returns the new inverted object.
56702    * @example
56703    *
56704    * var object = { 'a': 1, 'b': 2, 'c': 1 };
56705    *
56706    * _.invert(object);
56707    * // => { '1': 'c', '2': 'b' }
56708    */
56709   var invert = createInverter(function(result, value, key) {
56710     if (value != null &&
56711         typeof value.toString != 'function') {
56712       value = nativeObjectToString$2.call(value);
56713     }
56714
56715     result[value] = key;
56716   }, constant$d(identity$8));
56717
56718   /**
56719    * Creates an object with the same keys as `object` and values generated
56720    * by running each own enumerable string keyed property of `object` thru
56721    * `iteratee`. The iteratee is invoked with three arguments:
56722    * (value, key, object).
56723    *
56724    * @static
56725    * @memberOf _
56726    * @since 2.4.0
56727    * @category Object
56728    * @param {Object} object The object to iterate over.
56729    * @param {Function} [iteratee=_.identity] The function invoked per iteration.
56730    * @returns {Object} Returns the new mapped object.
56731    * @see _.mapKeys
56732    * @example
56733    *
56734    * var users = {
56735    *   'fred':    { 'user': 'fred',    'age': 40 },
56736    *   'pebbles': { 'user': 'pebbles', 'age': 1 }
56737    * };
56738    *
56739    * _.mapValues(users, function(o) { return o.age; });
56740    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
56741    *
56742    * // The `_.property` iteratee shorthand.
56743    * _.mapValues(users, 'age');
56744    * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)
56745    */
56746   function mapValues(object, iteratee) {
56747     var result = {};
56748     iteratee = baseIteratee(iteratee, 3);
56749
56750     baseForOwn(object, function(value, key, object) {
56751       baseAssignValue(result, key, iteratee(value, key, object));
56752     });
56753     return result;
56754   }
56755
56756   function behaviorPaste(context) {
56757
56758       function doPaste() {
56759           event.preventDefault();
56760
56761           var baseGraph = context.graph();
56762           var mouse$$1 = context.mouse();
56763           var projection = context.projection;
56764           var viewport = geoExtent$$1(projection.clipExtent()).polygon();
56765
56766           if (!geoPointInPolygon(mouse$$1, viewport)) return;
56767
56768           var extent = geoExtent$$1();
56769           var oldIDs = context.copyIDs();
56770           var oldGraph = context.copyGraph();
56771           var newIDs = [];
56772
56773           if (!oldIDs.length) return;
56774
56775           var action = actionCopyEntities(oldIDs, oldGraph);
56776           context.perform(action);
56777
56778           var copies = action.copies();
56779           var originals = invert(mapValues(copies, 'id'));
56780           for (var id in copies) {
56781               var oldEntity = oldGraph.entity(id);
56782               var newEntity = copies[id];
56783
56784               extent._extend(oldEntity.extent(oldGraph));
56785
56786               // Exclude child nodes from newIDs if their parent way was also copied.
56787               var parents = context.graph().parentWays(newEntity);
56788               var parentCopied = false;
56789               for (var i = 0; i < parents.length; i++) {
56790                   if (originals[parents[i].id]) {
56791                       parentCopied = true;
56792                       break;
56793                   }
56794               }
56795
56796               if (!parentCopied) {
56797                   newIDs.push(newEntity.id);
56798               }
56799           }
56800
56801           // Put pasted objects where mouse pointer is..
56802           var center = projection(extent.center());
56803           var delta = geoVecSubtract(mouse$$1, center);
56804
56805           context.perform(actionMove(newIDs, delta, projection));
56806           context.enter(modeMove$$1(context, newIDs, baseGraph));
56807       }
56808
56809
56810       function behavior() {
56811           context.keybinding().on(uiCmd('⌘V'), doPaste);
56812           return behavior;
56813       }
56814
56815
56816       behavior.off = function() {
56817           context.keybinding().off(uiCmd('⌘V'));
56818       };
56819
56820
56821       return behavior;
56822   }
56823
56824   function behaviorSelect(context) {
56825       var lastMouse = null;
56826       var suppressMenu = true;
56827       var tolerance = 4;
56828       var p1 = null;
56829
56830
56831       function point$$1() {
56832           return mouse(context.container().node());
56833       }
56834
56835
56836       function keydown() {
56837           var e = event;
56838           if (e && e.shiftKey) {
56839               context.surface()
56840                   .classed('behavior-multiselect', true);
56841           }
56842
56843           if (e && e.keyCode === 93) {  // context menu
56844               e.preventDefault();
56845               e.stopPropagation();
56846           }
56847       }
56848
56849
56850       function keyup() {
56851           var e = event;
56852           if (!e || !e.shiftKey) {
56853               context.surface()
56854                   .classed('behavior-multiselect', false);
56855           }
56856
56857
56858           if (e && e.keyCode === 93) {  // context menu
56859               e.preventDefault();
56860               e.stopPropagation();
56861               contextmenu();
56862           }
56863       }
56864
56865
56866       function mousedown() {
56867           if (!p1) p1 = point$$1();
56868           select(window)
56869               .on('mouseup.select', mouseup, true);
56870
56871           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
56872           suppressMenu = !isShowAlways;
56873       }
56874
56875
56876       function mousemove() {
56877           if (event) lastMouse = event;
56878       }
56879
56880
56881       function mouseup() {
56882           click();
56883       }
56884
56885
56886       function contextmenu() {
56887           var e = event;
56888           e.preventDefault();
56889           e.stopPropagation();
56890
56891           if (!+e.clientX && !+e.clientY) {
56892               if (lastMouse) {
56893                   e.sourceEvent = lastMouse;
56894               } else {
56895                   return;
56896               }
56897           }
56898
56899           if (!p1) p1 = point$$1();
56900           suppressMenu = false;
56901           click();
56902       }
56903
56904
56905       function click() {
56906           select(window)
56907               .on('mouseup.select', null, true);
56908
56909           if (!p1) return;
56910           var p2 = point$$1();
56911           var dist = geoVecLength(p1, p2);
56912
56913           p1 = null;
56914           if (dist > tolerance) {
56915               return;
56916           }
56917
56918           var isMultiselect = event.shiftKey || select('#surface .lasso').node();
56919           var isShowAlways = +context.storage('edit-menu-show-always') === 1;
56920           var datum = event.target.__data__ || (lastMouse && lastMouse.target.__data__);
56921           var mode = context.mode();
56922
56923           var entity = datum && datum.properties && datum.properties.entity;
56924           if (entity) datum = entity;
56925
56926           if (datum && datum.type === 'midpoint') {
56927               datum = datum.parents[0];
56928           }
56929
56930           if (datum instanceof osmEntity$$1) {    // clicked an entity..
56931               var selectedIDs = context.selectedIDs();
56932               context.selectedNoteID(null);
56933
56934               if (!isMultiselect) {
56935                   if (selectedIDs.length > 1 && (!suppressMenu && !isShowAlways)) {
56936                       // multiple things already selected, just show the menu...
56937                       mode.suppressMenu(false).reselect();
56938                   } else {
56939                       // select a single thing..
56940                       context.enter(modeSelect(context, [datum.id]).suppressMenu(suppressMenu));
56941                   }
56942
56943               } else {
56944                   if (selectedIDs.indexOf(datum.id) !== -1) {
56945                       // clicked entity is already in the selectedIDs list..
56946                       if (!suppressMenu && !isShowAlways) {
56947                           // don't deselect clicked entity, just show the menu.
56948                           mode.suppressMenu(false).reselect();
56949                       } else {
56950                           // deselect clicked entity, then reenter select mode or return to browse mode..
56951                           selectedIDs = without(selectedIDs, datum.id);
56952                           context.enter(selectedIDs.length ? modeSelect(context, selectedIDs) : modeBrowse(context));
56953                       }
56954                   } else {
56955                       // clicked entity is not in the selected list, add it..
56956                       selectedIDs = selectedIDs.concat([datum.id]);
56957                       context.enter(modeSelect(context, selectedIDs).suppressMenu(suppressMenu));
56958                   }
56959               }
56960
56961           } else if (datum && datum.__featurehash__ && !isMultiselect) {    // clicked Data..
56962               context
56963                   .selectedNoteID(null)
56964                   .enter(modeSelectData$$1(context, datum));
56965
56966           } else if (datum instanceof osmNote && !isMultiselect) {    // clicked a Note..
56967               context
56968                   .selectedNoteID(datum.id)
56969                   .enter(modeSelectNote$$1(context, datum.id));
56970
56971           } else {    // clicked nothing..
56972               context.selectedNoteID(null);
56973               if (!isMultiselect && mode.id !== 'browse') {
56974                   context.enter(modeBrowse(context));
56975               }
56976           }
56977
56978           // reset for next time..
56979           suppressMenu = true;
56980       }
56981
56982
56983       function behavior(selection$$1) {
56984           lastMouse = null;
56985           suppressMenu = true;
56986           p1 = null;
56987
56988           select(window)
56989               .on('keydown.select', keydown)
56990               .on('keyup.select', keyup)
56991               .on('contextmenu.select-window', function() {
56992                   // Edge and IE really like to show the contextmenu on the
56993                   // menubar when user presses a keyboard menu button
56994                   // even after we've already preventdefaulted the key event.
56995                   var e = event;
56996                   if (+e.clientX === 0 && +e.clientY === 0) {
56997                       event.preventDefault();
56998                       event.stopPropagation();
56999                   }
57000               });
57001
57002           selection$$1
57003               .on('mousedown.select', mousedown)
57004               .on('mousemove.select', mousemove)
57005               .on('contextmenu.select', contextmenu);
57006
57007           if (event && event.shiftKey) {
57008               context.surface()
57009                   .classed('behavior-multiselect', true);
57010           }
57011       }
57012
57013
57014       behavior.off = function(selection$$1) {
57015           select(window)
57016               .on('keydown.select', null)
57017               .on('keyup.select', null)
57018               .on('contextmenu.select-window', null)
57019               .on('mouseup.select', null, true);
57020
57021           selection$$1
57022               .on('mousedown.select', null)
57023               .on('mousemove.select', null)
57024               .on('contextmenu.select', null);
57025
57026           context.surface()
57027               .classed('behavior-multiselect', false);
57028       };
57029
57030
57031       return behavior;
57032   }
57033
57034   function uiAccount(context) {
57035       var osm = context.connection();
57036
57037
57038       function update(selection$$1) {
57039           if (!osm) return;
57040
57041           if (!osm.authenticated()) {
57042               selection$$1.selectAll('#userLink, #logoutLink')
57043                   .classed('hide', true);
57044               return;
57045           }
57046
57047           osm.userDetails(function(err, details) {
57048               var userLink = selection$$1.select('#userLink'),
57049                   logoutLink = selection$$1.select('#logoutLink');
57050
57051               userLink.html('');
57052               logoutLink.html('');
57053
57054               if (err) return;
57055
57056               selection$$1.selectAll('#userLink, #logoutLink')
57057                   .classed('hide', false);
57058
57059               // Link
57060               userLink.append('a')
57061                   .attr('href', osm.userURL(details.display_name))
57062                   .attr('target', '_blank');
57063
57064               // Add thumbnail or dont
57065               if (details.image_url) {
57066                   userLink.append('img')
57067                       .attr('class', 'icon pre-text user-icon')
57068                       .attr('src', details.image_url);
57069               } else {
57070                   userLink
57071                       .call(svgIcon('#iD-icon-avatar', 'pre-text light'));
57072               }
57073
57074               // Add user name
57075               userLink.append('span')
57076                   .attr('class', 'label')
57077                   .text(details.display_name);
57078
57079               logoutLink.append('a')
57080                   .attr('class', 'logout')
57081                   .attr('href', '#')
57082                   .text(t('logout'))
57083                   .on('click.logout', function() {
57084                       event.preventDefault();
57085                       osm.logout();
57086                   });
57087           });
57088       }
57089
57090
57091       return function(selection$$1) {
57092           selection$$1.append('li')
57093               .attr('id', 'logoutLink')
57094               .classed('hide', true);
57095
57096           selection$$1.append('li')
57097               .attr('id', 'userLink')
57098               .classed('hide', true);
57099
57100           if (osm) {
57101               osm.on('change.account', function() { update(selection$$1); });
57102               update(selection$$1);
57103           }
57104       };
57105   }
57106
57107   function uiAttribution(context) {
57108       var selection$$1;
57109
57110
57111       function attribution(data, klass) {
57112           var div = selection$$1.selectAll('.' + klass)
57113               .data([0]);
57114
57115           div = div.enter()
57116               .append('div')
57117               .attr('class', klass)
57118               .merge(div);
57119
57120
57121           var background = div.selectAll('.attribution')
57122               .data(data, function(d) { return d.name(); });
57123
57124           background.exit()
57125               .remove();
57126
57127           background = background.enter()
57128               .append('span')
57129               .attr('class', 'attribution')
57130               .each(function(d) {
57131                   if (d.terms_html) {
57132                       select(this)
57133                           .html(d.terms_html);
57134                       return;
57135                   }
57136
57137                   var selection$$1;
57138                   if (d.terms_url) {
57139                       selection$$1 = select(this)
57140                           .append('a')
57141                           .attr('href', d.terms_url)
57142                           .attr('target', '_blank');
57143                   } else {
57144                       selection$$1 = select(this);
57145                   }
57146
57147
57148                   var id_safe = d.id.replace('.', '<TX_DOT>');
57149                   var terms_text = t('imagery.' + id_safe + '.attribution.text',
57150                       { default: d.terms_text || d.id || d.name() }
57151                   );
57152
57153                   if (d.icon && !d.overlay) {
57154                       selection$$1
57155                           .append('img')
57156                           .attr('class', 'source-image')
57157                           .attr('src', d.icon);
57158                   }
57159
57160                   selection$$1
57161                       .append('span')
57162                       .attr('class', 'attribution-text')
57163                       .text(terms_text);
57164               })
57165               .merge(background);
57166
57167
57168           var copyright = background.selectAll('.copyright-notice')
57169               .data(function(d) {
57170                   var notice = d.copyrightNotices(context.map().zoom(), context.map().extent());
57171                   return notice ? [notice] : [];
57172               });
57173
57174           copyright.exit()
57175               .remove();
57176
57177           copyright = copyright.enter()
57178               .append('span')
57179               .attr('class', 'copyright-notice')
57180               .merge(copyright);
57181
57182           copyright
57183               .text(String);
57184       }
57185
57186
57187       function update() {
57188           attribution([context.background().baseLayerSource()], 'base-layer-attribution');
57189           attribution(context.background().overlayLayerSources().filter(function (s) {
57190               return s.validZoom(context.map().zoom());
57191           }), 'overlay-layer-attribution');
57192       }
57193
57194
57195       return function(select$$1) {
57196           selection$$1 = select$$1;
57197
57198           context.background()
57199               .on('change.attribution', update);
57200
57201           context.map()
57202               .on('move.attribution', throttle(update, 400, {leading: false}));
57203
57204           update();
57205       };
57206   }
57207
57208   // toggles the visibility of ui elements, using a combination of the
57209   // hide class, which sets display=none, and a d3 transition for opacity.
57210   // this will cause blinking when called repeatedly, so check that the
57211   // value actually changes between calls.
57212   function uiToggle(show, callback) {
57213       return function(selection$$1) {
57214           selection$$1
57215               .style('opacity', show ? 0 : 1)
57216               .classed('hide', false)
57217               .transition()
57218               .style('opacity', show ? 1 : 0)
57219               .on('end', function() {
57220                   select(this)
57221                       .classed('hide', !show)
57222                       .style('opacity', null);
57223                   if (callback) callback.apply(this);
57224               });
57225       };
57226   }
57227
57228   function uiDisclosure(context, key, expandedDefault) {
57229       var dispatch$$1 = dispatch('toggled');
57230       var _preference = (context.storage('disclosure.' + key + '.expanded'));
57231       var _expanded = (_preference === null ? !!expandedDefault : (_preference === 'true'));
57232       var _title;
57233       var _updatePreference = true;
57234       var _content = function () {};
57235
57236
57237       var disclosure = function(selection$$1) {
57238           var hideToggle = selection$$1.selectAll('.hide-toggle-' + key)
57239               .data([0]);
57240
57241           // enter
57242           var hideToggleEnter = hideToggle.enter()
57243               .append('a')
57244               .attr('href', '#')
57245               .attr('class', 'hide-toggle hide-toggle-' + key)
57246               .call(svgIcon('', 'pre-text', 'hide-toggle-icon'));
57247
57248           hideToggleEnter
57249               .append('span')
57250               .attr('class', 'hide-toggle-text');
57251
57252           // update
57253           hideToggle = hideToggleEnter
57254               .merge(hideToggle);
57255
57256           hideToggle
57257               .on('click', toggle)
57258               .classed('expanded', _expanded);
57259
57260           hideToggle.selectAll('.hide-toggle-text')
57261               .text(_title);
57262
57263           hideToggle.selectAll('.hide-toggle-icon')
57264               .attr('xlink:href', _expanded ? '#iD-icon-down'
57265                   : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57266               );
57267
57268
57269           var wrap = selection$$1.selectAll('.disclosure-wrap')
57270               .data([0]);
57271
57272           wrap = wrap.enter()
57273               .append('div')
57274               .attr('class', 'disclosure-wrap disclosure-wrap-' + key)
57275               .merge(wrap);
57276
57277           wrap
57278               .classed('hide', !_expanded)
57279               .call(_content);
57280
57281
57282           function toggle() {
57283               event.preventDefault();
57284
57285               _expanded = !_expanded;
57286
57287               if (_updatePreference) {
57288                   context.storage('disclosure.' + key + '.expanded', _expanded);
57289               }
57290
57291               hideToggle
57292                   .classed('expanded', _expanded);
57293
57294               hideToggle.selectAll('.hide-toggle-icon')
57295                   .attr('xlink:href', _expanded ? '#iD-icon-down'
57296                       : (textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'
57297                   );
57298
57299               wrap
57300                   .call(uiToggle(_expanded));
57301
57302               dispatch$$1.call('toggled', this, _expanded);
57303           }
57304       };
57305
57306
57307       disclosure.title = function(_) {
57308           if (!arguments.length) return _title;
57309           _title = _;
57310           return disclosure;
57311       };
57312
57313
57314       disclosure.expanded = function(_) {
57315           if (!arguments.length) return _expanded;
57316           _expanded = _;
57317           return disclosure;
57318       };
57319
57320
57321       disclosure.updatePreference = function(_) {
57322           if (!arguments.length) return _updatePreference;
57323           _updatePreference = _;
57324           return disclosure;
57325       };
57326
57327
57328       disclosure.content = function(_) {
57329           if (!arguments.length) return _content;
57330           _content = _;
57331           return disclosure;
57332       };
57333
57334
57335       return utilRebind(disclosure, dispatch$$1, 'on');
57336   }
57337
57338   function uiBackgroundDisplayOptions(context) {
57339       var detected = utilDetect();
57340       var storedOpacity = context.storage('background-opacity');
57341       var minVal = 0.25;
57342       var maxVal = detected.cssfilters ? 2 : 1;
57343
57344       var sliders = detected.cssfilters
57345           ? ['brightness', 'contrast', 'saturation', 'sharpness']
57346           : ['brightness'];
57347
57348       var _options = {
57349           brightness: (storedOpacity !== null ? (+storedOpacity) : 1),
57350           contrast: 1,
57351           saturation: 1,
57352           sharpness: 1
57353       };
57354
57355       var _selection = select(null);
57356
57357
57358       function clamp(x, min, max) {
57359           return Math.max(min, Math.min(x, max));
57360       }
57361
57362
57363       function updateValue(d, val) {
57364           if (!val && event && event.target) {
57365               val = event.target.value;
57366           }
57367
57368           val = clamp(val, minVal, maxVal);
57369
57370           _options[d] = val;
57371           context.background()[d](val);
57372
57373           if (d === 'brightness') {
57374               context.storage('background-opacity', val);
57375           }
57376
57377           _selection
57378               .call(render);
57379       }
57380
57381
57382       function render(selection$$1) {
57383           var container = selection$$1.selectAll('.display-options-container')
57384               .data([0]);
57385
57386           var containerEnter = container.enter()
57387               .append('div')
57388               .attr('class', 'display-options-container controls-list');
57389
57390           // add slider controls
57391           var slidersEnter = containerEnter.selectAll('.display-control')
57392               .data(sliders)
57393               .enter()
57394               .append('div')
57395               .attr('class', function(d) { return 'display-control display-control-' + d; });
57396
57397           slidersEnter
57398               .append('h5')
57399               .text(function(d) { return t('background.' + d); })
57400               .append('span')
57401               .attr('class', function(d) { return 'display-option-value display-option-value-' + d; });
57402
57403           slidersEnter
57404               .append('input')
57405               .attr('class', function(d) { return 'display-option-input display-option-input-' + d; })
57406               .attr('type', 'range')
57407               .attr('min', minVal)
57408               .attr('max', maxVal)
57409               .attr('step', '0.05')
57410               .on('input', function(d) {
57411                   var val = select(this).property('value');
57412                   updateValue(d, val);
57413               });
57414
57415           slidersEnter
57416               .append('button')
57417               .attr('title', t('background.reset'))
57418               .attr('class', function(d) { return 'display-option-reset display-option-reset-' + d; })
57419               .on('click', function(d) {
57420                   if (event.button !== 0) return;
57421                   updateValue(d, 1);
57422               })
57423               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
57424
57425
57426           // update
57427           container = containerEnter
57428               .merge(container);
57429
57430           container.selectAll('.display-option-input')
57431               .property('value', function(d) { return _options[d]; });
57432
57433           container.selectAll('.display-option-value')
57434               .text(function(d) { return Math.floor(_options[d] * 100) + '%'; });
57435
57436           container.selectAll('.display-option-reset')
57437               .classed('disabled', function(d) { return _options[d] === 1; });
57438
57439           // first time only, set brightness if needed
57440           if (containerEnter.size() && _options.brightness !== 1) {
57441               context.background().brightness(_options.brightness);
57442           }
57443       }
57444
57445
57446       function backgroundDisplayOptions(selection$$1) {
57447           _selection = selection$$1;
57448
57449           selection$$1
57450               .call(uiDisclosure(context, 'background_display_options', true)
57451                   .title(t('background.display_options'))
57452                   .content(render)
57453               );
57454       }
57455
57456
57457       return backgroundDisplayOptions;
57458   }
57459
57460   function uiBackgroundOffset(context) {
57461       var directions = [
57462           ['right', [0.5, 0]],
57463           ['top', [0, -0.5]],
57464           ['left', [-0.5, 0]],
57465           ['bottom', [0, 0.5]]
57466       ];
57467
57468
57469       function d3_eventCancel() {
57470           event.stopPropagation();
57471           event.preventDefault();
57472       }
57473
57474
57475       function updateValue() {
57476           var meters = geoOffsetToMeters(context.background().offset());
57477           var x = +meters[0].toFixed(2);
57478           var y = +meters[1].toFixed(2);
57479
57480           d3_selectAll('.nudge-inner-rect')
57481               .select('input')
57482               .classed('error', false)
57483               .property('value', x + ', ' + y);
57484
57485           d3_selectAll('.nudge-reset')
57486               .classed('disabled', function() {
57487                   return (x === 0 && y === 0);
57488               });
57489       }
57490
57491
57492       function resetOffset() {
57493           context.background().offset([0, 0]);
57494           updateValue();
57495       }
57496
57497
57498       function nudge(d) {
57499           context.background().nudge(d, context.map().zoom());
57500           updateValue();
57501       }
57502
57503
57504       function clickNudgeButton(d) {
57505           var interval;
57506           var timeout = window.setTimeout(function() {
57507                   interval = window.setInterval(nudge.bind(null, d), 100);
57508               }, 500);
57509
57510           function doneNudge() {
57511               window.clearTimeout(timeout);
57512               window.clearInterval(interval);
57513               select(window)
57514                   .on('mouseup.buttonoffset', null, true)
57515                   .on('mousedown.buttonoffset', null, true);
57516           }
57517
57518           select(window)
57519               .on('mouseup.buttonoffset', doneNudge, true)
57520               .on('mousedown.buttonoffset', doneNudge, true);
57521
57522           nudge(d);
57523       }
57524
57525
57526       function inputOffset() {
57527           var input = select(this);
57528           var d = input.node().value;
57529
57530           if (d === '') return resetOffset();
57531
57532           d = d.replace(/;/g, ',').split(',').map(function(n) {
57533               // if n is NaN, it will always get mapped to false.
57534               return !isNaN(n) && n;
57535           });
57536
57537           if (d.length !== 2 || !d[0] || !d[1]) {
57538               input.classed('error', true);
57539               return;
57540           }
57541
57542           context.background().offset(geoMetersToOffset(d));
57543           updateValue();
57544       }
57545
57546
57547       function dragOffset() {
57548           event.preventDefault();
57549           if (event.button !== 0) return;
57550
57551           var origin = [event.clientX, event.clientY];
57552
57553           context.container()
57554               .append('div')
57555               .attr('class', 'nudge-surface');
57556
57557           select(window)
57558               .on('mousemove.offset', function() {
57559                   var latest = [event.clientX, event.clientY];
57560                   var d = [
57561                       -(origin[0] - latest[0]) / 4,
57562                       -(origin[1] - latest[1]) / 4
57563                   ];
57564
57565                   origin = latest;
57566                   nudge(d);
57567               })
57568               .on('mouseup.offset', function() {
57569                   if (event.button !== 0) return;
57570                   d3_selectAll('.nudge-surface')
57571                       .remove();
57572
57573                   select(window)
57574                       .on('mousemove.offset', null)
57575                       .on('mouseup.offset', null);
57576               });
57577       }
57578
57579
57580       function render(selection$$1) {
57581           var container = selection$$1.selectAll('.nudge-container')
57582               .data([0]);
57583
57584           var containerEnter = container.enter()
57585               .append('div')
57586               .attr('class', 'nudge-container cf');
57587
57588           containerEnter
57589               .append('div')
57590               .attr('class', 'nudge-instructions')
57591               .text(t('background.offset'));
57592
57593           var nudgeEnter = containerEnter
57594               .append('div')
57595               .attr('class', 'nudge-outer-rect')
57596               .on('mousedown', dragOffset);
57597
57598           nudgeEnter
57599               .append('div')
57600               .attr('class', 'nudge-inner-rect')
57601               .append('input')
57602               .on('change', inputOffset);
57603
57604           containerEnter
57605               .append('div')
57606               .selectAll('button')
57607               .data(directions).enter()
57608               .append('button')
57609               .attr('class', function(d) { return d[0] + ' nudge'; })
57610               .on('contextmenu', d3_eventCancel)
57611               .on('mousedown', function(d) {
57612                   if (event.button !== 0) return;
57613                   clickNudgeButton(d[1]);
57614               });
57615
57616           containerEnter
57617               .append('button')
57618               .attr('title', t('background.reset'))
57619               .attr('class', 'nudge-reset disabled')
57620               .on('contextmenu', d3_eventCancel)
57621               .on('click', function() {
57622                   if (event.button !== 0) return;
57623                   resetOffset();
57624               })
57625               .call(svgIcon('#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo')));
57626
57627           updateValue();
57628       }
57629
57630
57631       function backgroundOffset(selection$$1) {
57632           selection$$1
57633               .call(uiDisclosure(context, 'background_offset', false)
57634                   .title(t('background.fix_misalignment'))
57635                   .content(render)
57636               );
57637       }
57638
57639
57640       context.background()
57641           .on('change.backgroundOffset-update', updateValue);
57642
57643       return backgroundOffset;
57644   }
57645
57646   var marked = createCommonjsModule(function (module, exports) {
57647   (function(root) {
57648
57649   /**
57650    * Block-Level Grammar
57651    */
57652
57653   var block = {
57654     newline: /^\n+/,
57655     code: /^( {4}[^\n]+\n*)+/,
57656     fences: noop,
57657     hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
57658     heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
57659     nptable: noop,
57660     blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
57661     list: /^( *)(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
57662     html: '^ {0,3}(?:' // optional indentation
57663       + '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
57664       + '|comment[^\\n]*(\\n+|$)' // (2)
57665       + '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
57666       + '|<![A-Z][\\s\\S]*?>\\n*' // (4)
57667       + '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
57668       + '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
57669       + '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
57670       + '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=\\h*\\n)[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
57671       + ')',
57672     def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
57673     table: noop,
57674     lheading: /^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,
57675     paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading| {0,3}>|<\/?(?:tag)(?: +|\n|\/?>)|<(?:script|pre|style|!--))[^\n]+)*)/,
57676     text: /^[^\n]+/
57677   };
57678
57679   block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
57680   block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
57681   block.def = edit(block.def)
57682     .replace('label', block._label)
57683     .replace('title', block._title)
57684     .getRegex();
57685
57686   block.bullet = /(?:[*+-]|\d+\.)/;
57687   block.item = /^( *)(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/;
57688   block.item = edit(block.item, 'gm')
57689     .replace(/bull/g, block.bullet)
57690     .getRegex();
57691
57692   block.list = edit(block.list)
57693     .replace(/bull/g, block.bullet)
57694     .replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
57695     .replace('def', '\\n+(?=' + block.def.source + ')')
57696     .getRegex();
57697
57698   block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
57699     + '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
57700     + '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
57701     + '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
57702     + '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
57703     + '|track|ul';
57704   block._comment = /<!--(?!-?>)[\s\S]*?-->/;
57705   block.html = edit(block.html, 'i')
57706     .replace('comment', block._comment)
57707     .replace('tag', block._tag)
57708     .replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
57709     .getRegex();
57710
57711   block.paragraph = edit(block.paragraph)
57712     .replace('hr', block.hr)
57713     .replace('heading', block.heading)
57714     .replace('lheading', block.lheading)
57715     .replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
57716     .getRegex();
57717
57718   block.blockquote = edit(block.blockquote)
57719     .replace('paragraph', block.paragraph)
57720     .getRegex();
57721
57722   /**
57723    * Normal Block Grammar
57724    */
57725
57726   block.normal = merge({}, block);
57727
57728   /**
57729    * GFM Block Grammar
57730    */
57731
57732   block.gfm = merge({}, block.normal, {
57733     fences: /^ *(`{3,}|~{3,})[ \.]*(\S+)? *\n([\s\S]*?)\n? *\1 *(?:\n+|$)/,
57734     paragraph: /^/,
57735     heading: /^ *(#{1,6}) +([^\n]+?) *#* *(?:\n+|$)/
57736   });
57737
57738   block.gfm.paragraph = edit(block.paragraph)
57739     .replace('(?!', '(?!'
57740       + block.gfm.fences.source.replace('\\1', '\\2') + '|'
57741       + block.list.source.replace('\\1', '\\3') + '|')
57742     .getRegex();
57743
57744   /**
57745    * GFM + Tables Block Grammar
57746    */
57747
57748   block.tables = merge({}, block.gfm, {
57749     nptable: /^ *([^|\n ].*\|.*)\n *([-:]+ *\|[-| :]*)(?:\n((?:.*[^>\n ].*(?:\n|$))*)\n*|$)/,
57750     table: /^ *\|(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/
57751   });
57752
57753   /**
57754    * Pedantic grammar
57755    */
57756
57757   block.pedantic = merge({}, block.normal, {
57758     html: edit(
57759       '^ *(?:comment *(?:\\n|\\s*$)'
57760       + '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
57761       + '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
57762       .replace('comment', block._comment)
57763       .replace(/tag/g, '(?!(?:'
57764         + 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
57765         + '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
57766         + '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
57767       .getRegex(),
57768     def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/
57769   });
57770
57771   /**
57772    * Block Lexer
57773    */
57774
57775   function Lexer(options) {
57776     this.tokens = [];
57777     this.tokens.links = Object.create(null);
57778     this.options = options || marked.defaults;
57779     this.rules = block.normal;
57780
57781     if (this.options.pedantic) {
57782       this.rules = block.pedantic;
57783     } else if (this.options.gfm) {
57784       if (this.options.tables) {
57785         this.rules = block.tables;
57786       } else {
57787         this.rules = block.gfm;
57788       }
57789     }
57790   }
57791
57792   /**
57793    * Expose Block Rules
57794    */
57795
57796   Lexer.rules = block;
57797
57798   /**
57799    * Static Lex Method
57800    */
57801
57802   Lexer.lex = function(src, options) {
57803     var lexer = new Lexer(options);
57804     return lexer.lex(src);
57805   };
57806
57807   /**
57808    * Preprocessing
57809    */
57810
57811   Lexer.prototype.lex = function(src) {
57812     src = src
57813       .replace(/\r\n|\r/g, '\n')
57814       .replace(/\t/g, '    ')
57815       .replace(/\u00a0/g, ' ')
57816       .replace(/\u2424/g, '\n');
57817
57818     return this.token(src, true);
57819   };
57820
57821   /**
57822    * Lexing
57823    */
57824
57825   Lexer.prototype.token = function(src, top) {
57826     src = src.replace(/^ +$/gm, '');
57827     var next,
57828         loose,
57829         cap,
57830         bull,
57831         b,
57832         item,
57833         listStart,
57834         listItems,
57835         t,
57836         space,
57837         i,
57838         tag,
57839         l,
57840         isordered,
57841         istask,
57842         ischecked;
57843
57844     while (src) {
57845       // newline
57846       if (cap = this.rules.newline.exec(src)) {
57847         src = src.substring(cap[0].length);
57848         if (cap[0].length > 1) {
57849           this.tokens.push({
57850             type: 'space'
57851           });
57852         }
57853       }
57854
57855       // code
57856       if (cap = this.rules.code.exec(src)) {
57857         src = src.substring(cap[0].length);
57858         cap = cap[0].replace(/^ {4}/gm, '');
57859         this.tokens.push({
57860           type: 'code',
57861           text: !this.options.pedantic
57862             ? rtrim(cap, '\n')
57863             : cap
57864         });
57865         continue;
57866       }
57867
57868       // fences (gfm)
57869       if (cap = this.rules.fences.exec(src)) {
57870         src = src.substring(cap[0].length);
57871         this.tokens.push({
57872           type: 'code',
57873           lang: cap[2],
57874           text: cap[3] || ''
57875         });
57876         continue;
57877       }
57878
57879       // heading
57880       if (cap = this.rules.heading.exec(src)) {
57881         src = src.substring(cap[0].length);
57882         this.tokens.push({
57883           type: 'heading',
57884           depth: cap[1].length,
57885           text: cap[2]
57886         });
57887         continue;
57888       }
57889
57890       // table no leading pipe (gfm)
57891       if (top && (cap = this.rules.nptable.exec(src))) {
57892         item = {
57893           type: 'table',
57894           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
57895           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
57896           cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
57897         };
57898
57899         if (item.header.length === item.align.length) {
57900           src = src.substring(cap[0].length);
57901
57902           for (i = 0; i < item.align.length; i++) {
57903             if (/^ *-+: *$/.test(item.align[i])) {
57904               item.align[i] = 'right';
57905             } else if (/^ *:-+: *$/.test(item.align[i])) {
57906               item.align[i] = 'center';
57907             } else if (/^ *:-+ *$/.test(item.align[i])) {
57908               item.align[i] = 'left';
57909             } else {
57910               item.align[i] = null;
57911             }
57912           }
57913
57914           for (i = 0; i < item.cells.length; i++) {
57915             item.cells[i] = splitCells(item.cells[i], item.header.length);
57916           }
57917
57918           this.tokens.push(item);
57919
57920           continue;
57921         }
57922       }
57923
57924       // hr
57925       if (cap = this.rules.hr.exec(src)) {
57926         src = src.substring(cap[0].length);
57927         this.tokens.push({
57928           type: 'hr'
57929         });
57930         continue;
57931       }
57932
57933       // blockquote
57934       if (cap = this.rules.blockquote.exec(src)) {
57935         src = src.substring(cap[0].length);
57936
57937         this.tokens.push({
57938           type: 'blockquote_start'
57939         });
57940
57941         cap = cap[0].replace(/^ *> ?/gm, '');
57942
57943         // Pass `top` to keep the current
57944         // "toplevel" state. This is exactly
57945         // how markdown.pl works.
57946         this.token(cap, top);
57947
57948         this.tokens.push({
57949           type: 'blockquote_end'
57950         });
57951
57952         continue;
57953       }
57954
57955       // list
57956       if (cap = this.rules.list.exec(src)) {
57957         src = src.substring(cap[0].length);
57958         bull = cap[2];
57959         isordered = bull.length > 1;
57960
57961         listStart = {
57962           type: 'list_start',
57963           ordered: isordered,
57964           start: isordered ? +bull : '',
57965           loose: false
57966         };
57967
57968         this.tokens.push(listStart);
57969
57970         // Get each top-level item.
57971         cap = cap[0].match(this.rules.item);
57972
57973         listItems = [];
57974         next = false;
57975         l = cap.length;
57976         i = 0;
57977
57978         for (; i < l; i++) {
57979           item = cap[i];
57980
57981           // Remove the list item's bullet
57982           // so it is seen as the next token.
57983           space = item.length;
57984           item = item.replace(/^ *([*+-]|\d+\.) +/, '');
57985
57986           // Outdent whatever the
57987           // list item contains. Hacky.
57988           if (~item.indexOf('\n ')) {
57989             space -= item.length;
57990             item = !this.options.pedantic
57991               ? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
57992               : item.replace(/^ {1,4}/gm, '');
57993           }
57994
57995           // Determine whether the next list item belongs here.
57996           // Backpedal if it does not belong in this list.
57997           if (this.options.smartLists && i !== l - 1) {
57998             b = block.bullet.exec(cap[i + 1])[0];
57999             if (bull !== b && !(bull.length > 1 && b.length > 1)) {
58000               src = cap.slice(i + 1).join('\n') + src;
58001               i = l - 1;
58002             }
58003           }
58004
58005           // Determine whether item is loose or not.
58006           // Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
58007           // for discount behavior.
58008           loose = next || /\n\n(?!\s*$)/.test(item);
58009           if (i !== l - 1) {
58010             next = item.charAt(item.length - 1) === '\n';
58011             if (!loose) loose = next;
58012           }
58013
58014           if (loose) {
58015             listStart.loose = true;
58016           }
58017
58018           // Check for task list items
58019           istask = /^\[[ xX]\] /.test(item);
58020           ischecked = undefined;
58021           if (istask) {
58022             ischecked = item[1] !== ' ';
58023             item = item.replace(/^\[[ xX]\] +/, '');
58024           }
58025
58026           t = {
58027             type: 'list_item_start',
58028             task: istask,
58029             checked: ischecked,
58030             loose: loose
58031           };
58032
58033           listItems.push(t);
58034           this.tokens.push(t);
58035
58036           // Recurse.
58037           this.token(item, false);
58038
58039           this.tokens.push({
58040             type: 'list_item_end'
58041           });
58042         }
58043
58044         if (listStart.loose) {
58045           l = listItems.length;
58046           i = 0;
58047           for (; i < l; i++) {
58048             listItems[i].loose = true;
58049           }
58050         }
58051
58052         this.tokens.push({
58053           type: 'list_end'
58054         });
58055
58056         continue;
58057       }
58058
58059       // html
58060       if (cap = this.rules.html.exec(src)) {
58061         src = src.substring(cap[0].length);
58062         this.tokens.push({
58063           type: this.options.sanitize
58064             ? 'paragraph'
58065             : 'html',
58066           pre: !this.options.sanitizer
58067             && (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
58068           text: cap[0]
58069         });
58070         continue;
58071       }
58072
58073       // def
58074       if (top && (cap = this.rules.def.exec(src))) {
58075         src = src.substring(cap[0].length);
58076         if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
58077         tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
58078         if (!this.tokens.links[tag]) {
58079           this.tokens.links[tag] = {
58080             href: cap[2],
58081             title: cap[3]
58082           };
58083         }
58084         continue;
58085       }
58086
58087       // table (gfm)
58088       if (top && (cap = this.rules.table.exec(src))) {
58089         item = {
58090           type: 'table',
58091           header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
58092           align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
58093           cells: cap[3] ? cap[3].replace(/(?: *\| *)?\n$/, '').split('\n') : []
58094         };
58095
58096         if (item.header.length === item.align.length) {
58097           src = src.substring(cap[0].length);
58098
58099           for (i = 0; i < item.align.length; i++) {
58100             if (/^ *-+: *$/.test(item.align[i])) {
58101               item.align[i] = 'right';
58102             } else if (/^ *:-+: *$/.test(item.align[i])) {
58103               item.align[i] = 'center';
58104             } else if (/^ *:-+ *$/.test(item.align[i])) {
58105               item.align[i] = 'left';
58106             } else {
58107               item.align[i] = null;
58108             }
58109           }
58110
58111           for (i = 0; i < item.cells.length; i++) {
58112             item.cells[i] = splitCells(
58113               item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
58114               item.header.length);
58115           }
58116
58117           this.tokens.push(item);
58118
58119           continue;
58120         }
58121       }
58122
58123       // lheading
58124       if (cap = this.rules.lheading.exec(src)) {
58125         src = src.substring(cap[0].length);
58126         this.tokens.push({
58127           type: 'heading',
58128           depth: cap[2] === '=' ? 1 : 2,
58129           text: cap[1]
58130         });
58131         continue;
58132       }
58133
58134       // top-level paragraph
58135       if (top && (cap = this.rules.paragraph.exec(src))) {
58136         src = src.substring(cap[0].length);
58137         this.tokens.push({
58138           type: 'paragraph',
58139           text: cap[1].charAt(cap[1].length - 1) === '\n'
58140             ? cap[1].slice(0, -1)
58141             : cap[1]
58142         });
58143         continue;
58144       }
58145
58146       // text
58147       if (cap = this.rules.text.exec(src)) {
58148         // Top-level should never reach here.
58149         src = src.substring(cap[0].length);
58150         this.tokens.push({
58151           type: 'text',
58152           text: cap[0]
58153         });
58154         continue;
58155       }
58156
58157       if (src) {
58158         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
58159       }
58160     }
58161
58162     return this.tokens;
58163   };
58164
58165   /**
58166    * Inline-Level Grammar
58167    */
58168
58169   var inline = {
58170     escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
58171     autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
58172     url: noop,
58173     tag: '^comment'
58174       + '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
58175       + '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
58176       + '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
58177       + '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
58178       + '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
58179     link: /^!?\[(label)\]\(href(?:\s+(title))?\s*\)/,
58180     reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
58181     nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
58182     strong: /^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
58183     em: /^_([^\s_])_(?!_)|^\*([^\s*"<\[])\*(?!\*)|^_([^\s][\s\S]*?[^\s_])_(?!_|[^\s.])|^_([^\s_][\s\S]*?[^\s])_(?!_|[^\s.])|^\*([^\s"<\[][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
58184     code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
58185     br: /^( {2,}|\\)\n(?!\s*$)/,
58186     del: noop,
58187     text: /^(`+|[^`])[\s\S]*?(?=[\\<!\[`*]|\b_| {2,}\n|$)/
58188   };
58189
58190   inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
58191
58192   inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
58193   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])?)+(?![-_])/;
58194   inline.autolink = edit(inline.autolink)
58195     .replace('scheme', inline._scheme)
58196     .replace('email', inline._email)
58197     .getRegex();
58198
58199   inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
58200
58201   inline.tag = edit(inline.tag)
58202     .replace('comment', block._comment)
58203     .replace('attribute', inline._attribute)
58204     .getRegex();
58205
58206   inline._label = /(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/;
58207   inline._href = /\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f\\]*\)|[^\s\x00-\x1f()\\])*?)/;
58208   inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
58209
58210   inline.link = edit(inline.link)
58211     .replace('label', inline._label)
58212     .replace('href', inline._href)
58213     .replace('title', inline._title)
58214     .getRegex();
58215
58216   inline.reflink = edit(inline.reflink)
58217     .replace('label', inline._label)
58218     .getRegex();
58219
58220   /**
58221    * Normal Inline Grammar
58222    */
58223
58224   inline.normal = merge({}, inline);
58225
58226   /**
58227    * Pedantic Inline Grammar
58228    */
58229
58230   inline.pedantic = merge({}, inline.normal, {
58231     strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
58232     em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
58233     link: edit(/^!?\[(label)\]\((.*?)\)/)
58234       .replace('label', inline._label)
58235       .getRegex(),
58236     reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
58237       .replace('label', inline._label)
58238       .getRegex()
58239   });
58240
58241   /**
58242    * GFM Inline Grammar
58243    */
58244
58245   inline.gfm = merge({}, inline.normal, {
58246     escape: edit(inline.escape).replace('])', '~|])').getRegex(),
58247     _extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
58248     url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
58249     _backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
58250     del: /^~+(?=\S)([\s\S]*?\S)~+/,
58251     text: edit(inline.text)
58252       .replace(']|', '~]|')
58253       .replace('|$', '|https?://|ftp://|www\\.|[a-zA-Z0-9.!#$%&\'*+/=?^_`{\\|}~-]+@|$')
58254       .getRegex()
58255   });
58256
58257   inline.gfm.url = edit(inline.gfm.url)
58258     .replace('email', inline.gfm._extended_email)
58259     .getRegex();
58260   /**
58261    * GFM + Line Breaks Inline Grammar
58262    */
58263
58264   inline.breaks = merge({}, inline.gfm, {
58265     br: edit(inline.br).replace('{2,}', '*').getRegex(),
58266     text: edit(inline.gfm.text).replace('{2,}', '*').getRegex()
58267   });
58268
58269   /**
58270    * Inline Lexer & Compiler
58271    */
58272
58273   function InlineLexer(links, options) {
58274     this.options = options || marked.defaults;
58275     this.links = links;
58276     this.rules = inline.normal;
58277     this.renderer = this.options.renderer || new Renderer();
58278     this.renderer.options = this.options;
58279
58280     if (!this.links) {
58281       throw new Error('Tokens array requires a `links` property.');
58282     }
58283
58284     if (this.options.pedantic) {
58285       this.rules = inline.pedantic;
58286     } else if (this.options.gfm) {
58287       if (this.options.breaks) {
58288         this.rules = inline.breaks;
58289       } else {
58290         this.rules = inline.gfm;
58291       }
58292     }
58293   }
58294
58295   /**
58296    * Expose Inline Rules
58297    */
58298
58299   InlineLexer.rules = inline;
58300
58301   /**
58302    * Static Lexing/Compiling Method
58303    */
58304
58305   InlineLexer.output = function(src, links, options) {
58306     var inline = new InlineLexer(links, options);
58307     return inline.output(src);
58308   };
58309
58310   /**
58311    * Lexing/Compiling
58312    */
58313
58314   InlineLexer.prototype.output = function(src) {
58315     var out = '',
58316         link,
58317         text,
58318         href,
58319         title,
58320         cap,
58321         prevCapZero;
58322
58323     while (src) {
58324       // escape
58325       if (cap = this.rules.escape.exec(src)) {
58326         src = src.substring(cap[0].length);
58327         out += cap[1];
58328         continue;
58329       }
58330
58331       // autolink
58332       if (cap = this.rules.autolink.exec(src)) {
58333         src = src.substring(cap[0].length);
58334         if (cap[2] === '@') {
58335           text = escape(this.mangle(cap[1]));
58336           href = 'mailto:' + text;
58337         } else {
58338           text = escape(cap[1]);
58339           href = text;
58340         }
58341         out += this.renderer.link(href, null, text);
58342         continue;
58343       }
58344
58345       // url (gfm)
58346       if (!this.inLink && (cap = this.rules.url.exec(src))) {
58347         if (cap[2] === '@') {
58348           text = escape(cap[0]);
58349           href = 'mailto:' + text;
58350         } else {
58351           // do extended autolink path validation
58352           do {
58353             prevCapZero = cap[0];
58354             cap[0] = this.rules._backpedal.exec(cap[0])[0];
58355           } while (prevCapZero !== cap[0]);
58356           text = escape(cap[0]);
58357           if (cap[1] === 'www.') {
58358             href = 'http://' + text;
58359           } else {
58360             href = text;
58361           }
58362         }
58363         src = src.substring(cap[0].length);
58364         out += this.renderer.link(href, null, text);
58365         continue;
58366       }
58367
58368       // tag
58369       if (cap = this.rules.tag.exec(src)) {
58370         if (!this.inLink && /^<a /i.test(cap[0])) {
58371           this.inLink = true;
58372         } else if (this.inLink && /^<\/a>/i.test(cap[0])) {
58373           this.inLink = false;
58374         }
58375         if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
58376           this.inRawBlock = true;
58377         } else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
58378           this.inRawBlock = false;
58379         }
58380
58381         src = src.substring(cap[0].length);
58382         out += this.options.sanitize
58383           ? this.options.sanitizer
58384             ? this.options.sanitizer(cap[0])
58385             : escape(cap[0])
58386           : cap[0];
58387         continue;
58388       }
58389
58390       // link
58391       if (cap = this.rules.link.exec(src)) {
58392         src = src.substring(cap[0].length);
58393         this.inLink = true;
58394         href = cap[2];
58395         if (this.options.pedantic) {
58396           link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
58397
58398           if (link) {
58399             href = link[1];
58400             title = link[3];
58401           } else {
58402             title = '';
58403           }
58404         } else {
58405           title = cap[3] ? cap[3].slice(1, -1) : '';
58406         }
58407         href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
58408         out += this.outputLink(cap, {
58409           href: InlineLexer.escapes(href),
58410           title: InlineLexer.escapes(title)
58411         });
58412         this.inLink = false;
58413         continue;
58414       }
58415
58416       // reflink, nolink
58417       if ((cap = this.rules.reflink.exec(src))
58418           || (cap = this.rules.nolink.exec(src))) {
58419         src = src.substring(cap[0].length);
58420         link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
58421         link = this.links[link.toLowerCase()];
58422         if (!link || !link.href) {
58423           out += cap[0].charAt(0);
58424           src = cap[0].substring(1) + src;
58425           continue;
58426         }
58427         this.inLink = true;
58428         out += this.outputLink(cap, link);
58429         this.inLink = false;
58430         continue;
58431       }
58432
58433       // strong
58434       if (cap = this.rules.strong.exec(src)) {
58435         src = src.substring(cap[0].length);
58436         out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
58437         continue;
58438       }
58439
58440       // em
58441       if (cap = this.rules.em.exec(src)) {
58442         src = src.substring(cap[0].length);
58443         out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
58444         continue;
58445       }
58446
58447       // code
58448       if (cap = this.rules.code.exec(src)) {
58449         src = src.substring(cap[0].length);
58450         out += this.renderer.codespan(escape(cap[2].trim(), true));
58451         continue;
58452       }
58453
58454       // br
58455       if (cap = this.rules.br.exec(src)) {
58456         src = src.substring(cap[0].length);
58457         out += this.renderer.br();
58458         continue;
58459       }
58460
58461       // del (gfm)
58462       if (cap = this.rules.del.exec(src)) {
58463         src = src.substring(cap[0].length);
58464         out += this.renderer.del(this.output(cap[1]));
58465         continue;
58466       }
58467
58468       // text
58469       if (cap = this.rules.text.exec(src)) {
58470         src = src.substring(cap[0].length);
58471         if (this.inRawBlock) {
58472           out += this.renderer.text(cap[0]);
58473         } else {
58474           out += this.renderer.text(escape(this.smartypants(cap[0])));
58475         }
58476         continue;
58477       }
58478
58479       if (src) {
58480         throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
58481       }
58482     }
58483
58484     return out;
58485   };
58486
58487   InlineLexer.escapes = function(text) {
58488     return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
58489   };
58490
58491   /**
58492    * Compile Link
58493    */
58494
58495   InlineLexer.prototype.outputLink = function(cap, link) {
58496     var href = link.href,
58497         title = link.title ? escape(link.title) : null;
58498
58499     return cap[0].charAt(0) !== '!'
58500       ? this.renderer.link(href, title, this.output(cap[1]))
58501       : this.renderer.image(href, title, escape(cap[1]));
58502   };
58503
58504   /**
58505    * Smartypants Transformations
58506    */
58507
58508   InlineLexer.prototype.smartypants = function(text) {
58509     if (!this.options.smartypants) return text;
58510     return text
58511       // em-dashes
58512       .replace(/---/g, '\u2014')
58513       // en-dashes
58514       .replace(/--/g, '\u2013')
58515       // opening singles
58516       .replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
58517       // closing singles & apostrophes
58518       .replace(/'/g, '\u2019')
58519       // opening doubles
58520       .replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
58521       // closing doubles
58522       .replace(/"/g, '\u201d')
58523       // ellipses
58524       .replace(/\.{3}/g, '\u2026');
58525   };
58526
58527   /**
58528    * Mangle Links
58529    */
58530
58531   InlineLexer.prototype.mangle = function(text) {
58532     if (!this.options.mangle) return text;
58533     var out = '',
58534         l = text.length,
58535         i = 0,
58536         ch;
58537
58538     for (; i < l; i++) {
58539       ch = text.charCodeAt(i);
58540       if (Math.random() > 0.5) {
58541         ch = 'x' + ch.toString(16);
58542       }
58543       out += '&#' + ch + ';';
58544     }
58545
58546     return out;
58547   };
58548
58549   /**
58550    * Renderer
58551    */
58552
58553   function Renderer(options) {
58554     this.options = options || marked.defaults;
58555   }
58556
58557   Renderer.prototype.code = function(code, lang, escaped) {
58558     if (this.options.highlight) {
58559       var out = this.options.highlight(code, lang);
58560       if (out != null && out !== code) {
58561         escaped = true;
58562         code = out;
58563       }
58564     }
58565
58566     if (!lang) {
58567       return '<pre><code>'
58568         + (escaped ? code : escape(code, true))
58569         + '</code></pre>';
58570     }
58571
58572     return '<pre><code class="'
58573       + this.options.langPrefix
58574       + escape(lang, true)
58575       + '">'
58576       + (escaped ? code : escape(code, true))
58577       + '</code></pre>\n';
58578   };
58579
58580   Renderer.prototype.blockquote = function(quote) {
58581     return '<blockquote>\n' + quote + '</blockquote>\n';
58582   };
58583
58584   Renderer.prototype.html = function(html) {
58585     return html;
58586   };
58587
58588   Renderer.prototype.heading = function(text, level, raw) {
58589     if (this.options.headerIds) {
58590       return '<h'
58591         + level
58592         + ' id="'
58593         + this.options.headerPrefix
58594         + raw.toLowerCase().replace(/[^\w]+/g, '-')
58595         + '">'
58596         + text
58597         + '</h'
58598         + level
58599         + '>\n';
58600     }
58601     // ignore IDs
58602     return '<h' + level + '>' + text + '</h' + level + '>\n';
58603   };
58604
58605   Renderer.prototype.hr = function() {
58606     return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
58607   };
58608
58609   Renderer.prototype.list = function(body, ordered, start) {
58610     var type = ordered ? 'ol' : 'ul',
58611         startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
58612     return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
58613   };
58614
58615   Renderer.prototype.listitem = function(text) {
58616     return '<li>' + text + '</li>\n';
58617   };
58618
58619   Renderer.prototype.checkbox = function(checked) {
58620     return '<input '
58621       + (checked ? 'checked="" ' : '')
58622       + 'disabled="" type="checkbox"'
58623       + (this.options.xhtml ? ' /' : '')
58624       + '> ';
58625   };
58626
58627   Renderer.prototype.paragraph = function(text) {
58628     return '<p>' + text + '</p>\n';
58629   };
58630
58631   Renderer.prototype.table = function(header, body) {
58632     if (body) body = '<tbody>' + body + '</tbody>';
58633
58634     return '<table>\n'
58635       + '<thead>\n'
58636       + header
58637       + '</thead>\n'
58638       + body
58639       + '</table>\n';
58640   };
58641
58642   Renderer.prototype.tablerow = function(content) {
58643     return '<tr>\n' + content + '</tr>\n';
58644   };
58645
58646   Renderer.prototype.tablecell = function(content, flags) {
58647     var type = flags.header ? 'th' : 'td';
58648     var tag = flags.align
58649       ? '<' + type + ' align="' + flags.align + '">'
58650       : '<' + type + '>';
58651     return tag + content + '</' + type + '>\n';
58652   };
58653
58654   // span level renderer
58655   Renderer.prototype.strong = function(text) {
58656     return '<strong>' + text + '</strong>';
58657   };
58658
58659   Renderer.prototype.em = function(text) {
58660     return '<em>' + text + '</em>';
58661   };
58662
58663   Renderer.prototype.codespan = function(text) {
58664     return '<code>' + text + '</code>';
58665   };
58666
58667   Renderer.prototype.br = function() {
58668     return this.options.xhtml ? '<br/>' : '<br>';
58669   };
58670
58671   Renderer.prototype.del = function(text) {
58672     return '<del>' + text + '</del>';
58673   };
58674
58675   Renderer.prototype.link = function(href, title, text) {
58676     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
58677     if (href === null) {
58678       return text;
58679     }
58680     var out = '<a href="' + escape(href) + '"';
58681     if (title) {
58682       out += ' title="' + title + '"';
58683     }
58684     out += '>' + text + '</a>';
58685     return out;
58686   };
58687
58688   Renderer.prototype.image = function(href, title, text) {
58689     href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
58690     if (href === null) {
58691       return text;
58692     }
58693
58694     var out = '<img src="' + href + '" alt="' + text + '"';
58695     if (title) {
58696       out += ' title="' + title + '"';
58697     }
58698     out += this.options.xhtml ? '/>' : '>';
58699     return out;
58700   };
58701
58702   Renderer.prototype.text = function(text) {
58703     return text;
58704   };
58705
58706   /**
58707    * TextRenderer
58708    * returns only the textual part of the token
58709    */
58710
58711   function TextRenderer() {}
58712
58713   // no need for block level renderers
58714
58715   TextRenderer.prototype.strong =
58716   TextRenderer.prototype.em =
58717   TextRenderer.prototype.codespan =
58718   TextRenderer.prototype.del =
58719   TextRenderer.prototype.text = function (text) {
58720     return text;
58721   };
58722
58723   TextRenderer.prototype.link =
58724   TextRenderer.prototype.image = function(href, title, text) {
58725     return '' + text;
58726   };
58727
58728   TextRenderer.prototype.br = function() {
58729     return '';
58730   };
58731
58732   /**
58733    * Parsing & Compiling
58734    */
58735
58736   function Parser(options) {
58737     this.tokens = [];
58738     this.token = null;
58739     this.options = options || marked.defaults;
58740     this.options.renderer = this.options.renderer || new Renderer();
58741     this.renderer = this.options.renderer;
58742     this.renderer.options = this.options;
58743   }
58744
58745   /**
58746    * Static Parse Method
58747    */
58748
58749   Parser.parse = function(src, options) {
58750     var parser = new Parser(options);
58751     return parser.parse(src);
58752   };
58753
58754   /**
58755    * Parse Loop
58756    */
58757
58758   Parser.prototype.parse = function(src) {
58759     this.inline = new InlineLexer(src.links, this.options);
58760     // use an InlineLexer with a TextRenderer to extract pure text
58761     this.inlineText = new InlineLexer(
58762       src.links,
58763       merge({}, this.options, {renderer: new TextRenderer()})
58764     );
58765     this.tokens = src.reverse();
58766
58767     var out = '';
58768     while (this.next()) {
58769       out += this.tok();
58770     }
58771
58772     return out;
58773   };
58774
58775   /**
58776    * Next Token
58777    */
58778
58779   Parser.prototype.next = function() {
58780     return this.token = this.tokens.pop();
58781   };
58782
58783   /**
58784    * Preview Next Token
58785    */
58786
58787   Parser.prototype.peek = function() {
58788     return this.tokens[this.tokens.length - 1] || 0;
58789   };
58790
58791   /**
58792    * Parse Text Tokens
58793    */
58794
58795   Parser.prototype.parseText = function() {
58796     var body = this.token.text;
58797
58798     while (this.peek().type === 'text') {
58799       body += '\n' + this.next().text;
58800     }
58801
58802     return this.inline.output(body);
58803   };
58804
58805   /**
58806    * Parse Current Token
58807    */
58808
58809   Parser.prototype.tok = function() {
58810     switch (this.token.type) {
58811       case 'space': {
58812         return '';
58813       }
58814       case 'hr': {
58815         return this.renderer.hr();
58816       }
58817       case 'heading': {
58818         return this.renderer.heading(
58819           this.inline.output(this.token.text),
58820           this.token.depth,
58821           unescape(this.inlineText.output(this.token.text)));
58822       }
58823       case 'code': {
58824         return this.renderer.code(this.token.text,
58825           this.token.lang,
58826           this.token.escaped);
58827       }
58828       case 'table': {
58829         var header = '',
58830             body = '',
58831             i,
58832             row,
58833             cell,
58834             j;
58835
58836         // header
58837         cell = '';
58838         for (i = 0; i < this.token.header.length; i++) {
58839           cell += this.renderer.tablecell(
58840             this.inline.output(this.token.header[i]),
58841             { header: true, align: this.token.align[i] }
58842           );
58843         }
58844         header += this.renderer.tablerow(cell);
58845
58846         for (i = 0; i < this.token.cells.length; i++) {
58847           row = this.token.cells[i];
58848
58849           cell = '';
58850           for (j = 0; j < row.length; j++) {
58851             cell += this.renderer.tablecell(
58852               this.inline.output(row[j]),
58853               { header: false, align: this.token.align[j] }
58854             );
58855           }
58856
58857           body += this.renderer.tablerow(cell);
58858         }
58859         return this.renderer.table(header, body);
58860       }
58861       case 'blockquote_start': {
58862         body = '';
58863
58864         while (this.next().type !== 'blockquote_end') {
58865           body += this.tok();
58866         }
58867
58868         return this.renderer.blockquote(body);
58869       }
58870       case 'list_start': {
58871         body = '';
58872         var ordered = this.token.ordered,
58873             start = this.token.start;
58874
58875         while (this.next().type !== 'list_end') {
58876           body += this.tok();
58877         }
58878
58879         return this.renderer.list(body, ordered, start);
58880       }
58881       case 'list_item_start': {
58882         body = '';
58883         var loose = this.token.loose;
58884
58885         if (this.token.task) {
58886           body += this.renderer.checkbox(this.token.checked);
58887         }
58888
58889         while (this.next().type !== 'list_item_end') {
58890           body += !loose && this.token.type === 'text'
58891             ? this.parseText()
58892             : this.tok();
58893         }
58894
58895         return this.renderer.listitem(body);
58896       }
58897       case 'html': {
58898         // TODO parse inline content if parameter markdown=1
58899         return this.renderer.html(this.token.text);
58900       }
58901       case 'paragraph': {
58902         return this.renderer.paragraph(this.inline.output(this.token.text));
58903       }
58904       case 'text': {
58905         return this.renderer.paragraph(this.parseText());
58906       }
58907     }
58908   };
58909
58910   /**
58911    * Helpers
58912    */
58913
58914   function escape(html, encode) {
58915     if (encode) {
58916       if (escape.escapeTest.test(html)) {
58917         return html.replace(escape.escapeReplace, function (ch) { return escape.replacements[ch]; });
58918       }
58919     } else {
58920       if (escape.escapeTestNoEncode.test(html)) {
58921         return html.replace(escape.escapeReplaceNoEncode, function (ch) { return escape.replacements[ch]; });
58922       }
58923     }
58924
58925     return html;
58926   }
58927
58928   escape.escapeTest = /[&<>"']/;
58929   escape.escapeReplace = /[&<>"']/g;
58930   escape.replacements = {
58931     '&': '&amp;',
58932     '<': '&lt;',
58933     '>': '&gt;',
58934     '"': '&quot;',
58935     "'": '&#39;'
58936   };
58937
58938   escape.escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
58939   escape.escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
58940
58941   function unescape(html) {
58942     // explicitly match decimal, hex, and named HTML entities
58943     return html.replace(/&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig, function(_, n) {
58944       n = n.toLowerCase();
58945       if (n === 'colon') return ':';
58946       if (n.charAt(0) === '#') {
58947         return n.charAt(1) === 'x'
58948           ? String.fromCharCode(parseInt(n.substring(2), 16))
58949           : String.fromCharCode(+n.substring(1));
58950       }
58951       return '';
58952     });
58953   }
58954
58955   function edit(regex, opt) {
58956     regex = regex.source || regex;
58957     opt = opt || '';
58958     return {
58959       replace: function(name, val) {
58960         val = val.source || val;
58961         val = val.replace(/(^|[^\[])\^/g, '$1');
58962         regex = regex.replace(name, val);
58963         return this;
58964       },
58965       getRegex: function() {
58966         return new RegExp(regex, opt);
58967       }
58968     };
58969   }
58970
58971   function cleanUrl(sanitize, base, href) {
58972     if (sanitize) {
58973       try {
58974         var prot = decodeURIComponent(unescape(href))
58975           .replace(/[^\w:]/g, '')
58976           .toLowerCase();
58977       } catch (e) {
58978         return null;
58979       }
58980       if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
58981         return null;
58982       }
58983     }
58984     if (base && !originIndependentUrl.test(href)) {
58985       href = resolveUrl(base, href);
58986     }
58987     try {
58988       href = encodeURI(href).replace(/%25/g, '%');
58989     } catch (e) {
58990       return null;
58991     }
58992     return href;
58993   }
58994
58995   function resolveUrl(base, href) {
58996     if (!baseUrls[' ' + base]) {
58997       // we can ignore everything in base after the last slash of its path component,
58998       // but we might need to add _that_
58999       // https://tools.ietf.org/html/rfc3986#section-3
59000       if (/^[^:]+:\/*[^/]*$/.test(base)) {
59001         baseUrls[' ' + base] = base + '/';
59002       } else {
59003         baseUrls[' ' + base] = rtrim(base, '/', true);
59004       }
59005     }
59006     base = baseUrls[' ' + base];
59007
59008     if (href.slice(0, 2) === '//') {
59009       return base.replace(/:[\s\S]*/, ':') + href;
59010     } else if (href.charAt(0) === '/') {
59011       return base.replace(/(:\/*[^/]*)[\s\S]*/, '$1') + href;
59012     } else {
59013       return base + href;
59014     }
59015   }
59016   var baseUrls = {};
59017   var originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
59018
59019   function noop() {}
59020   noop.exec = noop;
59021
59022   function merge(obj) {
59023     var i = 1,
59024         target,
59025         key;
59026
59027     for (; i < arguments.length; i++) {
59028       target = arguments[i];
59029       for (key in target) {
59030         if (Object.prototype.hasOwnProperty.call(target, key)) {
59031           obj[key] = target[key];
59032         }
59033       }
59034     }
59035
59036     return obj;
59037   }
59038
59039   function splitCells(tableRow, count) {
59040     // ensure that every cell-delimiting pipe has a space
59041     // before it to distinguish it from an escaped pipe
59042     var row = tableRow.replace(/\|/g, function (match, offset, str) {
59043           var escaped = false,
59044               curr = offset;
59045           while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
59046           if (escaped) {
59047             // odd number of slashes means | is escaped
59048             // so we leave it alone
59049             return '|';
59050           } else {
59051             // add space before unescaped |
59052             return ' |';
59053           }
59054         }),
59055         cells = row.split(/ \|/),
59056         i = 0;
59057
59058     if (cells.length > count) {
59059       cells.splice(count);
59060     } else {
59061       while (cells.length < count) cells.push('');
59062     }
59063
59064     for (; i < cells.length; i++) {
59065       // leading or trailing whitespace is ignored per the gfm spec
59066       cells[i] = cells[i].trim().replace(/\\\|/g, '|');
59067     }
59068     return cells;
59069   }
59070
59071   // Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
59072   // /c*$/ is vulnerable to REDOS.
59073   // invert: Remove suffix of non-c chars instead. Default falsey.
59074   function rtrim(str, c, invert) {
59075     if (str.length === 0) {
59076       return '';
59077     }
59078
59079     // Length of suffix matching the invert condition.
59080     var suffLen = 0;
59081
59082     // Step left until we fail to match the invert condition.
59083     while (suffLen < str.length) {
59084       var currChar = str.charAt(str.length - suffLen - 1);
59085       if (currChar === c && !invert) {
59086         suffLen++;
59087       } else if (currChar !== c && invert) {
59088         suffLen++;
59089       } else {
59090         break;
59091       }
59092     }
59093
59094     return str.substr(0, str.length - suffLen);
59095   }
59096
59097   /**
59098    * Marked
59099    */
59100
59101   function marked(src, opt, callback) {
59102     // throw error in case of non string input
59103     if (typeof src === 'undefined' || src === null) {
59104       throw new Error('marked(): input parameter is undefined or null');
59105     }
59106     if (typeof src !== 'string') {
59107       throw new Error('marked(): input parameter is of type '
59108         + Object.prototype.toString.call(src) + ', string expected');
59109     }
59110
59111     if (callback || typeof opt === 'function') {
59112       if (!callback) {
59113         callback = opt;
59114         opt = null;
59115       }
59116
59117       opt = merge({}, marked.defaults, opt || {});
59118
59119       var highlight = opt.highlight,
59120           tokens,
59121           pending,
59122           i = 0;
59123
59124       try {
59125         tokens = Lexer.lex(src, opt);
59126       } catch (e) {
59127         return callback(e);
59128       }
59129
59130       pending = tokens.length;
59131
59132       var done = function(err) {
59133         if (err) {
59134           opt.highlight = highlight;
59135           return callback(err);
59136         }
59137
59138         var out;
59139
59140         try {
59141           out = Parser.parse(tokens, opt);
59142         } catch (e) {
59143           err = e;
59144         }
59145
59146         opt.highlight = highlight;
59147
59148         return err
59149           ? callback(err)
59150           : callback(null, out);
59151       };
59152
59153       if (!highlight || highlight.length < 3) {
59154         return done();
59155       }
59156
59157       delete opt.highlight;
59158
59159       if (!pending) return done();
59160
59161       for (; i < tokens.length; i++) {
59162         (function(token) {
59163           if (token.type !== 'code') {
59164             return --pending || done();
59165           }
59166           return highlight(token.text, token.lang, function(err, code) {
59167             if (err) return done(err);
59168             if (code == null || code === token.text) {
59169               return --pending || done();
59170             }
59171             token.text = code;
59172             token.escaped = true;
59173             --pending || done();
59174           });
59175         })(tokens[i]);
59176       }
59177
59178       return;
59179     }
59180     try {
59181       if (opt) opt = merge({}, marked.defaults, opt);
59182       return Parser.parse(Lexer.lex(src, opt), opt);
59183     } catch (e) {
59184       e.message += '\nPlease report this to https://github.com/markedjs/marked.';
59185       if ((opt || marked.defaults).silent) {
59186         return '<p>An error occurred:</p><pre>'
59187           + escape(e.message + '', true)
59188           + '</pre>';
59189       }
59190       throw e;
59191     }
59192   }
59193
59194   /**
59195    * Options
59196    */
59197
59198   marked.options =
59199   marked.setOptions = function(opt) {
59200     merge(marked.defaults, opt);
59201     return marked;
59202   };
59203
59204   marked.getDefaults = function () {
59205     return {
59206       baseUrl: null,
59207       breaks: false,
59208       gfm: true,
59209       headerIds: true,
59210       headerPrefix: '',
59211       highlight: null,
59212       langPrefix: 'language-',
59213       mangle: true,
59214       pedantic: false,
59215       renderer: new Renderer(),
59216       sanitize: false,
59217       sanitizer: null,
59218       silent: false,
59219       smartLists: false,
59220       smartypants: false,
59221       tables: true,
59222       xhtml: false
59223     };
59224   };
59225
59226   marked.defaults = marked.getDefaults();
59227
59228   /**
59229    * Expose
59230    */
59231
59232   marked.Parser = Parser;
59233   marked.parser = Parser.parse;
59234
59235   marked.Renderer = Renderer;
59236   marked.TextRenderer = TextRenderer;
59237
59238   marked.Lexer = Lexer;
59239   marked.lexer = Lexer.lex;
59240
59241   marked.InlineLexer = InlineLexer;
59242   marked.inlineLexer = InlineLexer.output;
59243
59244   marked.parse = marked;
59245
59246   {
59247     module.exports = marked;
59248   }
59249   })(commonjsGlobal || (typeof window !== 'undefined' ? window : commonjsGlobal));
59250   });
59251
59252   function pointBox(loc, context) {
59253       var rect = context.surfaceRect();
59254       var point$$1 = context.curtainProjection(loc);
59255       return {
59256           left: point$$1[0] + rect.left - 40,
59257           top: point$$1[1] + rect.top - 60,
59258           width: 80,
59259           height: 90
59260       };
59261   }
59262
59263
59264   function pad$1(locOrBox, padding, context) {
59265       var box;
59266       if (locOrBox instanceof Array) {
59267           var rect = context.surfaceRect();
59268           var point$$1 = context.curtainProjection(locOrBox);
59269           box = {
59270               left: point$$1[0] + rect.left,
59271               top: point$$1[1] + rect.top
59272           };
59273       } else {
59274           box = locOrBox;
59275       }
59276
59277       return {
59278           left: box.left - padding,
59279           top: box.top - padding,
59280           width: (box.width || 0) + 2 * padding,
59281           height: (box.width || 0) + 2 * padding
59282       };
59283   }
59284
59285
59286   function icon(name, svgklass, useklass) {
59287       return '<svg class="icon ' + (svgklass || '') + '">' +
59288            '<use xlink:href="' + name + '"' +
59289            (useklass ? ' class="' + useklass + '"' : '') + '></use></svg>';
59290   }
59291
59292
59293   function slugify(text) {
59294       return text.toString().toLowerCase()
59295           .replace(/\s+/g, '-')           // Replace spaces with -
59296           .replace(/[^\w\-]+/g, '')       // Remove all non-word chars
59297           .replace(/\-\-+/g, '-')         // Replace multiple - with single -
59298           .replace(/^-+/, '')             // Trim - from start of text
59299           .replace(/-+$/, '');            // Trim - from end of text
59300   }
59301
59302
59303   // console warning for missing walkthrough names
59304   var missingStrings = {};
59305   function checkKey(key, text) {
59306       if (t(key, { default: undefined}) === undefined) {
59307           if (missingStrings.hasOwnProperty(key)) return;  // warn once
59308           missingStrings[key] = text;
59309           var missing = key + ': ' + text;
59310           if (typeof console !== 'undefined') console.log(missing); // eslint-disable-line
59311       }
59312   }
59313
59314
59315   function localize(obj) {
59316       var key;
59317
59318       // Assign name if entity has one..
59319       var name = obj.tags && obj.tags.name;
59320       if (name) {
59321           key = 'intro.graph.name.' + slugify(name);
59322           obj.tags.name = t(key, { default: name });
59323           checkKey(key, name);
59324       }
59325
59326       // Assign street name if entity has one..
59327       var street = obj.tags && obj.tags['addr:street'];
59328       if (street) {
59329           key = 'intro.graph.name.' + slugify(street);
59330           obj.tags['addr:street'] = t(key, { default: street });
59331           checkKey(key, street);
59332
59333           // Add address details common across walkthrough..
59334           var addrTags = [
59335               'block_number', 'city', 'county', 'district', 'hamlet', 'neighbourhood',
59336               'postcode', 'province', 'quarter', 'state', 'subdistrict', 'suburb'
59337           ];
59338           addrTags.forEach(function(k) {
59339               var key = 'intro.graph.' + k;
59340               var tag = 'addr:' + k;
59341               var val = obj.tags && obj.tags[tag];
59342               var str = t(key, { default: val });
59343
59344               if (str) {
59345                   if (str.match(/^<.*>$/) !== null) {
59346                       delete obj.tags[tag];
59347                   } else {
59348                       obj.tags[tag] = str;
59349                   }
59350               }
59351           });
59352       }
59353
59354       return obj;
59355   }
59356
59357
59358   // Used to detect squareness.. some duplicataion of code from actionOrthogonalize.
59359   function isMostlySquare(points) {
59360       // note: uses 15 here instead of the 12 from actionOrthogonalize because
59361       // actionOrthogonalize can actually straighten some larger angles as it iterates
59362       var threshold = 15; // degrees within right or straight
59363       var lowerBound = Math.cos((90 - threshold) * Math.PI / 180);  // near right
59364       var upperBound = Math.cos(threshold * Math.PI / 180);         // near straight
59365       var mag;
59366
59367       for (var i = 0; i < points.length; i++) {
59368           mag = Math.abs(normalizedDotProduct(i, points));
59369           if (mag > lowerBound && mag < upperBound) {
59370               return false;
59371           }
59372       }
59373
59374       return true;
59375
59376
59377       function normalizedDotProduct(i, points) {
59378           var a = points[(i - 1 + points.length) % points.length];
59379           var b = points[i];
59380           var c = points[(i + 1) % points.length];
59381           var p = subtractPoints(a, b);
59382           var q = subtractPoints(c, b);
59383
59384           p = normalizePoint(p);
59385           q = normalizePoint(q);
59386
59387           return p[0] * q[0] + p[1] * q[1];
59388
59389
59390           function subtractPoints(a, b) {
59391               return [a[0] - b[0], a[1] - b[1]];
59392           }
59393
59394           function normalizePoint(point$$1) {
59395               var vector = [0, 0];
59396               var length = Math.sqrt(point$$1[0] * point$$1[0] + point$$1[1] * point$$1[1]);
59397               if (length !== 0) {
59398                   vector[0] = point$$1[0] / length;
59399                   vector[1] = point$$1[1] / length;
59400               }
59401               return vector;
59402           }
59403       }
59404   }
59405
59406
59407   function selectMenuItem(operation) {
59408       var selector$$1 = '.edit-menu .edit-menu-item-' + operation +
59409           ', .radial-menu .radial-menu-item-' + operation;
59410       return select(selector$$1);
59411   }
59412
59413
59414   function transitionTime(point1, point2) {
59415       var distance = geoSphericalDistance(point1, point2);
59416       if (distance === 0)
59417           return 0;
59418       else if (distance < 80)
59419           return 500;
59420       else
59421           return 1000;
59422   }
59423
59424   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:"marked",highway:"crossing"}},n1027:{id:"n1027",loc:[-85.634767,41.946172]},n1028:{id:"n1028",loc:[-85.634622,41.946175],tags:{crossing:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",highway:"crossing"}},n4687:{id:"n4687",loc:[-85.635883,41.94006]},n4688:{id:"n4688",loc:[-85.635768,41.940051],tags:{crossing:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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",building:"yes"}},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:"marked",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:"marked",footway:"crossing",highway:"footway"}},w162:{id:"w162",nodes:["n727","n2411","n728"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w163:{id:"w163",nodes:["n729","n730","n731"],tags:{crossing:"marked",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:"marked",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:"marked",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",building:"yes",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",building:"yes",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",building:"yes",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",building:"yes",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",building:"yes",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",building:"yes",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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:"marked",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",building:"yes",shelter_type:"picnic_shelter"}},w815:{id:"w815",nodes:["n4678","n4679","n4680","n1889"],tags:{highway:"service"}},w816:{id:"w816",nodes:["n239","n4686","n4687"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w817:{id:"w817",nodes:["n4687","n4688","n4689"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w818:{id:"w818",nodes:["n4689","n4690","n307"],tags:{crossing:"marked",footway:"crossing",highway:"footway"}},w819:{id:"w819",nodes:["n2266","n4743"],tags:{highway:"path"}},w82:{id:"w82",nodes:["n724","n368","n369"],tags:{crossing:"marked",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]}};
59425
59426   // Tooltips and svg mask used to highlight certain features
59427   function uiCurtain() {
59428
59429       var surface = select(null),
59430           tooltip = select(null),
59431           darkness = select(null);
59432
59433       function curtain(selection$$1) {
59434           surface = selection$$1
59435               .append('svg')
59436               .attr('id', 'curtain')
59437               .style('z-index', 1000)
59438               .style('pointer-events', 'none')
59439               .style('position', 'absolute')
59440               .style('top', 0)
59441               .style('left', 0);
59442
59443           darkness = surface.append('path')
59444               .attr('x', 0)
59445               .attr('y', 0)
59446               .attr('class', 'curtain-darkness');
59447
59448           select(window).on('resize.curtain', resize);
59449
59450           tooltip = selection$$1.append('div')
59451               .attr('class', 'tooltip')
59452               .style('z-index', 1002);
59453
59454           tooltip
59455               .append('div')
59456               .attr('class', 'tooltip-arrow');
59457
59458           tooltip
59459               .append('div')
59460               .attr('class', 'tooltip-inner');
59461
59462           resize();
59463
59464
59465           function resize() {
59466               surface
59467                   .attr('width', window.innerWidth)
59468                   .attr('height', window.innerHeight);
59469               curtain.cut(darkness.datum());
59470           }
59471       }
59472
59473
59474       /**
59475        * Reveal cuts the curtain to highlight the given box,
59476        * and shows a tooltip with instructions next to the box.
59477        *
59478        * @param  {String|ClientRect} [box]   box used to cut the curtain
59479        * @param  {String}    [text]          text for a tooltip
59480        * @param  {Object}    [options]
59481        * @param  {string}    [options.tooltipClass]    optional class to add to the tooltip
59482        * @param  {integer}   [options.duration]        transition time in milliseconds
59483        * @param  {string}    [options.buttonText]      if set, create a button with this text label
59484        * @param  {function}  [options.buttonCallback]  if set, the callback for the button
59485        * @param  {String|ClientRect} [options.tooltipBox]  box for tooltip position, if different from box for the curtain
59486        */
59487       curtain.reveal = function(box, text, options) {
59488           if (typeof box === 'string') {
59489               box = select(box).node();
59490           }
59491           if (box && box.getBoundingClientRect) {
59492               box = copyBox(box.getBoundingClientRect());
59493           }
59494
59495           options = options || {};
59496
59497           var tooltipBox;
59498           if (options.tooltipBox) {
59499               tooltipBox = options.tooltipBox;
59500               if (typeof tooltipBox === 'string') {
59501                   tooltipBox = select(tooltipBox).node();
59502               }
59503               if (tooltipBox && tooltipBox.getBoundingClientRect) {
59504                   tooltipBox = copyBox(tooltipBox.getBoundingClientRect());
59505               }
59506           } else {
59507               tooltipBox = box;
59508           }
59509
59510           if (tooltipBox && text) {
59511               // pseudo markdown bold text for the instruction section..
59512               var parts = text.split('**');
59513               var html = parts[0] ? '<span>' + parts[0] + '</span>' : '';
59514               if (parts[1]) {
59515                   html += '<span class="instruction">' + parts[1] + '</span>';
59516               }
59517
59518               html = html.replace(/\*(.*?)\*/g, '<em>$1</em>');   // emphasis
59519               html = html.replace(/\{br\}/g, '<br/><br/>');       // linebreak
59520
59521               if (options.buttonText && options.buttonCallback) {
59522                   html += '<div class="button-section">' +
59523                       '<button href="#" class="button action col8">' + options.buttonText + '</button></div>';
59524               }
59525
59526               var classes = 'curtain-tooltip tooltip in ' + (options.tooltipClass || '');
59527               tooltip
59528                   .classed(classes, true)
59529                   .selectAll('.tooltip-inner')
59530                   .html(html);
59531
59532               if (options.buttonText && options.buttonCallback) {
59533                   var button = tooltip.selectAll('.button-section .button.action');
59534                   button
59535                       .on('click', function() {
59536                           event.preventDefault();
59537                           options.buttonCallback();
59538                       });
59539               }
59540
59541               var tip = copyBox(tooltip.node().getBoundingClientRect()),
59542                   w = window.innerWidth,
59543                   h = window.innerHeight,
59544                   tooltipWidth = 200,
59545                   tooltipArrow = 5,
59546                   side, pos;
59547
59548
59549               // hack: this will have bottom placement,
59550               // so need to reserve extra space for the tooltip illustration.
59551               if (options.tooltipClass === 'intro-mouse') {
59552                   tip.height += 80;
59553               }
59554
59555               // trim box dimensions to just the portion that fits in the window..
59556               if (tooltipBox.top + tooltipBox.height > h) {
59557                   tooltipBox.height -= (tooltipBox.top + tooltipBox.height - h);
59558               }
59559               if (tooltipBox.left + tooltipBox.width > w) {
59560                   tooltipBox.width -= (tooltipBox.left + tooltipBox.width - w);
59561               }
59562
59563               // determine tooltip placement..
59564
59565               if (tooltipBox.top + tooltipBox.height < 100) {
59566                   // tooltip below box..
59567                   side = 'bottom';
59568                   pos = [
59569                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
59570                       tooltipBox.top + tooltipBox.height
59571                   ];
59572
59573               } else if (tooltipBox.top > h - 140) {
59574                   // tooltip above box..
59575                   side = 'top';
59576                   pos = [
59577                       tooltipBox.left + tooltipBox.width / 2 - tip.width / 2,
59578                       tooltipBox.top - tip.height
59579                   ];
59580
59581               } else {
59582                   // tooltip to the side of the tooltipBox..
59583                   var tipY = tooltipBox.top + tooltipBox.height / 2 - tip.height / 2;
59584
59585                   if (textDirection === 'rtl') {
59586                       if (tooltipBox.left - tooltipWidth - tooltipArrow < 70) {
59587                           side = 'right';
59588                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
59589
59590                       } else {
59591                           side = 'left';
59592                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
59593                       }
59594
59595                   } else {
59596                       if (tooltipBox.left + tooltipBox.width + tooltipArrow + tooltipWidth > w - 70) {
59597                           side = 'left';
59598                           pos = [tooltipBox.left - tooltipWidth - tooltipArrow, tipY];
59599                       }
59600                       else {
59601                           side = 'right';
59602                           pos = [tooltipBox.left + tooltipBox.width + tooltipArrow, tipY];
59603                       }
59604                   }
59605               }
59606
59607               if (options.duration !== 0 || !tooltip.classed(side)) {
59608                   tooltip.call(uiToggle(true));
59609               }
59610
59611               tooltip
59612                   .style('top', pos[1] + 'px')
59613                   .style('left', pos[0] + 'px')
59614                   .attr('class', classes + ' ' + side);
59615
59616
59617               // shift tooltip-inner if it is very close to the top or bottom edge
59618               // (doesn't affect the placement of the tooltip-arrow)
59619               var shiftY = 0;
59620               if (side === 'left' || side === 'right') {
59621                   if (pos[1] < 60) {
59622                       shiftY = 60 - pos[1];
59623                   }
59624                   else if (pos[1] + tip.height > h - 100) {
59625                       shiftY = h - pos[1] - tip.height - 100;
59626                   }
59627               }
59628               tooltip.selectAll('.tooltip-inner')
59629                   .style('top', shiftY + 'px');
59630
59631           } else {
59632               tooltip
59633                   .classed('in', false)
59634                   .call(uiToggle(false));
59635           }
59636
59637           curtain.cut(box, options.duration);
59638
59639           return tooltip;
59640       };
59641
59642
59643       curtain.cut = function(datum, duration) {
59644           darkness.datum(datum)
59645               .interrupt();
59646
59647           var selection$$1;
59648           if (duration === 0) {
59649               selection$$1 = darkness;
59650           } else {
59651               selection$$1 = darkness
59652                   .transition()
59653                   .duration(duration || 600)
59654                   .ease(linear$1);
59655           }
59656
59657           selection$$1
59658               .attr('d', function(d) {
59659                   var string = 'M 0,0 L 0,' + window.innerHeight + ' L ' +
59660                       window.innerWidth + ',' + window.innerHeight + 'L' +
59661                       window.innerWidth + ',0 Z';
59662
59663                   if (!d) return string;
59664                   return string + 'M' +
59665                       d.left + ',' + d.top + 'L' +
59666                       d.left + ',' + (d.top + d.height) + 'L' +
59667                       (d.left + d.width) + ',' + (d.top + d.height) + 'L' +
59668                       (d.left + d.width) + ',' + (d.top) + 'Z';
59669
59670               });
59671       };
59672
59673
59674       curtain.remove = function() {
59675           surface.remove();
59676           tooltip.remove();
59677           select(window).on('resize.curtain', null);
59678       };
59679
59680
59681       // ClientRects are immutable, so copy them to an object,
59682       // in case we need to trim the height/width.
59683       function copyBox(src) {
59684           return {
59685               top: src.top,
59686               right: src.right,
59687               bottom: src.bottom,
59688               left: src.left,
59689               width: src.width,
59690               height: src.height
59691           };
59692       }
59693
59694
59695       return curtain;
59696   }
59697
59698   function uiIntroWelcome(context, reveal) {
59699       var dispatch$$1 = dispatch('done');
59700       var listener = clickListener();
59701
59702       var chapter = {
59703           title: 'intro.welcome.title'
59704       };
59705
59706
59707       function welcome() {
59708           context.map().centerZoom([-85.63591, 41.94285], 19);
59709           reveal('.intro-nav-wrap .chapter-welcome',
59710               t('intro.welcome.welcome'),
59711               { buttonText: t('intro.ok'), buttonCallback: practice }
59712           );
59713       }
59714
59715       function practice() {
59716           reveal('.intro-nav-wrap .chapter-welcome',
59717               t('intro.welcome.practice'),
59718               { buttonText: t('intro.ok'), buttonCallback: words }
59719           );
59720       }
59721
59722       function words() {
59723           reveal('.intro-nav-wrap .chapter-welcome',
59724               t('intro.welcome.words'),
59725               { buttonText: t('intro.ok'), buttonCallback: mouse$$1 }
59726           );
59727       }
59728
59729
59730       function mouse$$1() {
59731           reveal('.intro-nav-wrap .chapter-welcome',
59732               t('intro.welcome.mouse'),
59733               { buttonText: t('intro.ok'), buttonCallback: leftClick }
59734           );
59735       }
59736
59737
59738       function leftClick() {
59739           var counter = 0;
59740           var times = 5;
59741
59742           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
59743               t('intro.welcome.leftclick', { num: times }),
59744               { tooltipClass: 'intro-mouse' }
59745           );
59746
59747           tooltip.selectAll('.tooltip-inner')
59748               .insert('svg', 'span')
59749               .attr('class', 'tooltip-illustration')
59750               .append('use')
59751               .attr('xlink:href', '#iD-walkthrough-mouse');
59752
59753           tooltip
59754               .append('div')
59755               .attr('class', 'counter');
59756
59757           tooltip.call(listener);
59758
59759           listener.on('click', function(which) {
59760               if (which === 'left') {
59761                   select('.curtain-tooltip.intro-mouse .counter')
59762                       .text(String(++counter));
59763
59764                   if (counter === times) {
59765                       window.setTimeout(function() { continueTo(rightClick); }, 1000);
59766                   }
59767               }
59768           });
59769
59770           function continueTo(nextStep) {
59771               listener.on('click', null);
59772               tooltip.call(listener.off);
59773               tooltip.select('.counter').remove();
59774               nextStep();
59775           }
59776       }
59777
59778
59779       function rightClick() {
59780           var counter = 0;
59781           var times = 5;
59782
59783           var tooltip = reveal('.intro-nav-wrap .chapter-welcome',
59784               t('intro.welcome.rightclick', { num: times }),
59785               { tooltipClass: 'intro-mouse' }
59786           );
59787
59788           tooltip.selectAll('.tooltip-inner')
59789               .insert('svg', 'span')
59790               .attr('class', 'tooltip-illustration')
59791               .append('use')
59792               .attr('xlink:href', '#iD-walkthrough-mouse');
59793
59794           tooltip
59795               .append('div')
59796               .attr('class', 'counter');
59797
59798           tooltip.call(listener);
59799
59800           listener.on('click', function(which) {
59801               if (which === 'right') {
59802                   select('.curtain-tooltip.intro-mouse .counter')
59803                       .text(String(++counter));
59804
59805                   if (counter === times) {
59806                       window.setTimeout(function() { continueTo(chapters); }, 1000);
59807                   }
59808               }
59809           });
59810
59811           function continueTo(nextStep) {
59812               listener.on('click', null);
59813               tooltip.call(listener.off);
59814               tooltip.select('.counter').remove();
59815               nextStep();
59816           }
59817       }
59818
59819
59820       function chapters() {
59821           dispatch$$1.call('done');
59822           reveal('.intro-nav-wrap .chapter-navigation',
59823               t('intro.welcome.chapters', { next: t('intro.navigation.title') })
59824           );
59825       }
59826
59827
59828       chapter.enter = function() {
59829           welcome();
59830       };
59831
59832
59833       chapter.exit = function() {
59834           listener.off();
59835           select('.curtain-tooltip.intro-mouse')
59836               .selectAll('.counter')
59837               .remove();
59838       };
59839
59840
59841       chapter.restart = function() {
59842           chapter.exit();
59843           chapter.enter();
59844       };
59845
59846
59847       return utilRebind(chapter, dispatch$$1, 'on');
59848   }
59849
59850
59851
59852   function clickListener() {
59853       var dispatch$$1 = dispatch('click');
59854       var minTime = 120;
59855       var tooltip = select(null);
59856       var down = {};
59857
59858       // `down` keeps track of which buttons/keys are down.
59859       // Setting a property in `down` happens immediately.
59860       // Unsetting a property in `down` is delayed because
59861       //   on Windows a contextmenu event happens after keyup/mouseup
59862
59863       function keydown() {
59864           if (event.keyCode === 93)  {   // context menu
59865               event.preventDefault();
59866               event.stopPropagation();
59867               down.menu = event.timeStamp;
59868               tooltip.classed('rightclick', true);
59869           }
59870       }
59871
59872
59873       function keyup() {
59874           if (event.keyCode === 93)  {   // context menu
59875               event.preventDefault();
59876               event.stopPropagation();
59877               var endTime = event.timeStamp;
59878               var startTime = down.menu || endTime;
59879               var delay = (endTime - startTime < minTime) ? minTime : 0;
59880
59881               window.setTimeout(function() {
59882                   tooltip.classed('rightclick', false);
59883                   down.menu = undefined;  // delayed, for Windows
59884               }, delay);
59885
59886               dispatch$$1.call('click', this, 'right');
59887           }
59888       }
59889
59890
59891       function mousedown() {
59892           var button = event.button;
59893           if (button === 0 && !event.ctrlKey) {
59894               tooltip.classed('leftclick', true);
59895           } else if (button === 2) {
59896               tooltip.classed('rightclick', true);
59897           }
59898           down[button] = event.timeStamp;
59899       }
59900
59901
59902       function mouseup() {
59903           var button = event.button;
59904           var endTime = event.timeStamp;
59905           var startTime = down[button] || endTime;
59906           var delay = (endTime - startTime < minTime) ? minTime : 0;
59907
59908           if (button === 0 && !event.ctrlKey) {
59909               window.setTimeout(function() {
59910                   tooltip.classed('leftclick', false);
59911                   down[button] = undefined;  // delayed, for Windows
59912               }, delay);
59913
59914               dispatch$$1.call('click', this, 'left');
59915
59916           } else if (button === 2) {
59917               window.setTimeout(function() {
59918                   tooltip.classed('rightclick', false);
59919                   down[button] = undefined;  // delayed, for Windows
59920               }, delay);
59921
59922               dispatch$$1.call('click', this, 'right');
59923
59924           } else {
59925               window.setTimeout(function() {
59926                   down[button] = undefined;  // delayed, for Windows
59927               }, delay);
59928           }
59929       }
59930
59931
59932       function contextmenu() {
59933           event.preventDefault();
59934           event.stopPropagation();
59935           if (!down[2] && !down.menu) {
59936               tooltip.classed('rightclick', true);
59937               window.setTimeout(function() {
59938                   tooltip.classed('rightclick', false);
59939               }, minTime);
59940               dispatch$$1.call('click', this, 'right');
59941           }
59942       }
59943
59944
59945       var behavior = function(selection$$1) {
59946           tooltip = selection$$1;
59947           down = {};
59948
59949           select(window)
59950               .on('keydown.intro', keydown)
59951               .on('keyup.intro', keyup)
59952               .on('mousedown.intro', mousedown)
59953               .on('mouseup.intro', mouseup)
59954               .on('contextmenu.intro', contextmenu);
59955       };
59956
59957
59958       behavior.off = function() {
59959           select(window)
59960               .on('keydown.intro', null)
59961               .on('keyup.intro', null)
59962               .on('mousedown.intro', null)
59963               .on('mouseup.intro', null)
59964               .on('contextmenu.intro', null);
59965
59966           tooltip
59967               .classed('leftclick', false)
59968               .classed('rightclick', false);
59969       };
59970
59971       return utilRebind(behavior, dispatch$$1, 'on');
59972   }
59973
59974   function uiIntroNavigation(context, reveal) {
59975       var dispatch$$1 = dispatch('done');
59976       var timeouts = [];
59977       var hallId = 'n2061';
59978       var townHall = [-85.63591, 41.94285];
59979       var springStreetId = 'w397';
59980       var springStreetEndId = 'n1834';
59981       var springStreet = [-85.63582, 41.94255];
59982       var onewayField = context.presets().field('oneway');
59983       var maxspeedField = context.presets().field('maxspeed');
59984
59985
59986       var chapter = {
59987           title: 'intro.navigation.title'
59988       };
59989
59990
59991       function timeout(f, t$$1) {
59992           timeouts.push(window.setTimeout(f, t$$1));
59993       }
59994
59995
59996       function eventCancel() {
59997           event.stopPropagation();
59998           event.preventDefault();
59999       }
60000
60001
60002       function isTownHallSelected() {
60003           var ids = context.selectedIDs();
60004           return ids.length === 1 && ids[0] === hallId;
60005       }
60006
60007
60008       function dragMap() {
60009           context.enter(modeBrowse(context));
60010           context.history().reset('initial');
60011
60012           var msec = transitionTime(townHall, context.map().center());
60013           if (msec) { reveal(null, null, { duration: 0 }); }
60014           context.map().zoom(19).centerEase(townHall, msec);
60015
60016           timeout(function() {
60017               var centerStart = context.map().center();
60018
60019               reveal('#surface', t('intro.navigation.drag'));
60020               context.map().on('drawn.intro', function() {
60021                   reveal('#surface', t('intro.navigation.drag'), { duration: 0 });
60022               });
60023
60024               context.map().on('move.intro', function() {
60025                   var centerNow = context.map().center();
60026                   if (centerStart[0] !== centerNow[0] || centerStart[1] !== centerNow[1]) {
60027                       context.map().on('move.intro', null);
60028                       timeout(function() { continueTo(zoomMap); }, 3000);
60029                   }
60030               });
60031
60032           }, msec + 100);
60033
60034           function continueTo(nextStep) {
60035               context.map().on('move.intro drawn.intro', null);
60036               nextStep();
60037           }
60038       }
60039
60040
60041       function zoomMap() {
60042           var zoomStart = context.map().zoom();
60043
60044           reveal('#surface',
60045               t('intro.navigation.zoom', {
60046                   plus: icon('#iD-icon-plus', 'pre-text'),
60047                   minus: icon('#iD-icon-minus', 'pre-text')
60048               })
60049           );
60050
60051           context.map().on('drawn.intro', function() {
60052               reveal('#surface',
60053                   t('intro.navigation.zoom', {
60054                       plus: icon('#iD-icon-plus', 'pre-text'),
60055                       minus: icon('#iD-icon-minus', 'pre-text')
60056                   }), { duration: 0 }
60057               );
60058           });
60059
60060           context.map().on('move.intro', function() {
60061               if (context.map().zoom() !== zoomStart) {
60062                   context.map().on('move.intro', null);
60063                   timeout(function() { continueTo(features); }, 3000);
60064               }
60065           });
60066
60067           function continueTo(nextStep) {
60068               context.map().on('move.intro drawn.intro', null);
60069               nextStep();
60070           }
60071       }
60072
60073
60074       function features() {
60075           var onClick = function() { continueTo(pointsLinesAreas); };
60076
60077           reveal('#surface', t('intro.navigation.features'),
60078               { buttonText: t('intro.ok'), buttonCallback: onClick }
60079           );
60080
60081           context.map().on('drawn.intro', function() {
60082               reveal('#surface', t('intro.navigation.features'),
60083                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60084               );
60085           });
60086
60087           function continueTo(nextStep) {
60088               context.map().on('drawn.intro', null);
60089               nextStep();
60090           }
60091       }
60092
60093       function pointsLinesAreas() {
60094           var onClick = function() { continueTo(nodesWays); };
60095
60096           reveal('#surface', t('intro.navigation.points_lines_areas'),
60097               { buttonText: t('intro.ok'), buttonCallback: onClick }
60098           );
60099
60100           context.map().on('drawn.intro', function() {
60101               reveal('#surface', t('intro.navigation.points_lines_areas'),
60102                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60103               );
60104           });
60105
60106           function continueTo(nextStep) {
60107               context.map().on('drawn.intro', null);
60108               nextStep();
60109           }
60110       }
60111
60112       function nodesWays() {
60113           var onClick = function() { continueTo(clickTownHall); };
60114
60115           reveal('#surface', t('intro.navigation.nodes_ways'),
60116               { buttonText: t('intro.ok'), buttonCallback: onClick }
60117           );
60118
60119           context.map().on('drawn.intro', function() {
60120               reveal('#surface', t('intro.navigation.nodes_ways'),
60121                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60122               );
60123           });
60124
60125           function continueTo(nextStep) {
60126               context.map().on('drawn.intro', null);
60127               nextStep();
60128           }
60129       }
60130
60131       function clickTownHall() {
60132           context.enter(modeBrowse(context));
60133           context.history().reset('initial');
60134
60135           reveal(null, null, { duration: 0 });
60136           context.map().zoomEase(19, 500);
60137
60138           timeout(function() {
60139               var entity = context.hasEntity(hallId);
60140               if (!entity) return;
60141               context.map().centerEase(entity.loc, 500);
60142
60143               timeout(function() {
60144                   var entity = context.hasEntity(hallId);
60145                   if (!entity) return;
60146                   var box = pointBox(entity.loc, context);
60147                   reveal(box, t('intro.navigation.click_townhall'));
60148
60149                   context.map().on('move.intro drawn.intro', function() {
60150                       var entity = context.hasEntity(hallId);
60151                       if (!entity) return;
60152                       var box = pointBox(entity.loc, context);
60153                       reveal(box, t('intro.navigation.click_townhall'), { duration: 0 });
60154                   });
60155
60156                   context.on('enter.intro', function() {
60157                       if (isTownHallSelected()) continueTo(selectedTownHall);
60158                   });
60159
60160               }, 550);  // after centerEase
60161
60162           }, 550); // after zoomEase
60163
60164           context.history().on('change.intro', function() {
60165               if (!context.hasEntity(hallId)) {
60166                   continueTo(clickTownHall);
60167               }
60168           });
60169
60170           function continueTo(nextStep) {
60171               context.on('enter.intro', null);
60172               context.map().on('move.intro drawn.intro', null);
60173               context.history().on('change.intro', null);
60174               nextStep();
60175           }
60176       }
60177
60178
60179       function selectedTownHall() {
60180           if (!isTownHallSelected()) return clickTownHall();
60181
60182           var entity = context.hasEntity(hallId);
60183           if (!entity) return clickTownHall();
60184
60185           var box = pointBox(entity.loc, context);
60186           var onClick = function() { continueTo(editorTownHall); };
60187
60188           reveal(box, t('intro.navigation.selected_townhall'),
60189               { buttonText: t('intro.ok'), buttonCallback: onClick }
60190           );
60191
60192           context.map().on('move.intro drawn.intro', function() {
60193               var entity = context.hasEntity(hallId);
60194               if (!entity) return;
60195               var box = pointBox(entity.loc, context);
60196               reveal(box, t('intro.navigation.selected_townhall'),
60197                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60198               );
60199           });
60200
60201           context.history().on('change.intro', function() {
60202               if (!context.hasEntity(hallId)) {
60203                   continueTo(clickTownHall);
60204               }
60205           });
60206
60207           function continueTo(nextStep) {
60208               context.map().on('move.intro drawn.intro', null);
60209               context.history().on('change.intro', null);
60210               nextStep();
60211           }
60212       }
60213
60214
60215       function editorTownHall() {
60216           if (!isTownHallSelected()) return clickTownHall();
60217
60218           // disallow scrolling
60219           select('.inspector-wrap').on('wheel.intro', eventCancel);
60220
60221           var onClick = function() { continueTo(presetTownHall); };
60222
60223           reveal('.entity-editor-pane',
60224               t('intro.navigation.editor_townhall'),
60225               { buttonText: t('intro.ok'), buttonCallback: onClick }
60226           );
60227
60228           context.on('exit.intro', function() {
60229               continueTo(clickTownHall);
60230           });
60231
60232           context.history().on('change.intro', function() {
60233               if (!context.hasEntity(hallId)) {
60234                   continueTo(clickTownHall);
60235               }
60236           });
60237
60238           function continueTo(nextStep) {
60239               context.on('exit.intro', null);
60240               context.history().on('change.intro', null);
60241               select('.inspector-wrap').on('wheel.intro', null);
60242               nextStep();
60243           }
60244       }
60245
60246
60247       function presetTownHall() {
60248           if (!isTownHallSelected()) return clickTownHall();
60249
60250           // reset pane, in case user happened to change it..
60251           select('.inspector-wrap .panewrap').style('right', '0%');
60252           // disallow scrolling
60253           select('.inspector-wrap').on('wheel.intro', eventCancel);
60254
60255           // preset match, in case the user happened to change it.
60256           var entity = context.entity(context.selectedIDs()[0]);
60257           var preset = context.presets().match(entity, context.graph());
60258
60259           var onClick = function() { continueTo(fieldsTownHall); };
60260
60261           context.on('exit.intro', function() {
60262               continueTo(clickTownHall);
60263           });
60264
60265           context.history().on('change.intro', function() {
60266               if (!context.hasEntity(hallId)) {
60267                   continueTo(clickTownHall);
60268               }
60269           });
60270
60271           reveal('.inspector-body .preset-list-item.inspector-inner',
60272               t('intro.navigation.preset_townhall', { preset: preset.name() }),
60273               { buttonText: t('intro.ok'), buttonCallback: onClick }
60274           );
60275
60276           function continueTo(nextStep) {
60277               context.on('exit.intro', null);
60278               context.history().on('change.intro', null);
60279               select('.inspector-wrap').on('wheel.intro', null);
60280               nextStep();
60281           }
60282       }
60283
60284
60285       function fieldsTownHall() {
60286           if (!isTownHallSelected()) return clickTownHall();
60287
60288           // reset pane, in case user happened to change it..
60289           select('.inspector-wrap .panewrap').style('right', '0%');
60290           // disallow scrolling
60291           select('.inspector-wrap').on('wheel.intro', eventCancel);
60292
60293           var onClick = function() { continueTo(closeTownHall); };
60294
60295           reveal('.inspector-body .preset-editor',
60296               t('intro.navigation.fields_townhall'),
60297               { buttonText: t('intro.ok'), buttonCallback: onClick }
60298           );
60299
60300           context.on('exit.intro', function() {
60301               continueTo(clickTownHall);
60302           });
60303
60304           context.history().on('change.intro', function() {
60305               if (!context.hasEntity(hallId)) {
60306                   continueTo(clickTownHall);
60307               }
60308           });
60309
60310           function continueTo(nextStep) {
60311               context.on('exit.intro', null);
60312               context.history().on('change.intro', null);
60313               select('.inspector-wrap').on('wheel.intro', null);
60314               nextStep();
60315           }
60316       }
60317
60318
60319       function closeTownHall() {
60320           if (!isTownHallSelected()) return clickTownHall();
60321
60322           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60323           var href = select(selector$$1).attr('href') || '#iD-icon-close';
60324
60325           reveal('.entity-editor-pane',
60326               t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') })
60327           );
60328
60329           context.on('exit.intro', function() {
60330               continueTo(searchStreet);
60331           });
60332
60333           context.history().on('change.intro', function() {
60334               // update the close icon in the tooltip if the user edits something.
60335               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60336               var href = select(selector$$1).attr('href') || '#iD-icon-close';
60337
60338               reveal('.entity-editor-pane',
60339                   t('intro.navigation.close_townhall', { button: icon(href, 'pre-text') }),
60340                   { duration: 0 }
60341               );
60342           });
60343
60344           function continueTo(nextStep) {
60345               context.on('exit.intro', null);
60346               context.history().on('change.intro', null);
60347               nextStep();
60348           }
60349       }
60350
60351
60352       function searchStreet() {
60353           context.enter(modeBrowse(context));
60354           context.history().reset('initial');  // ensure spring street exists
60355
60356           var msec = transitionTime(springStreet, context.map().center());
60357           if (msec) { reveal(null, null, { duration: 0 }); }
60358           context.map().zoom(19).centerEase(springStreet, msec);  // ..and user can see it
60359
60360           timeout(function() {
60361               reveal('.search-header input',
60362                   t('intro.navigation.search_street', { name: t('intro.graph.name.spring-street') })
60363               );
60364
60365               select('.search-header input')
60366                   .on('keyup.intro', checkSearchResult);
60367           }, msec + 100);
60368       }
60369
60370
60371       function checkSearchResult() {
60372           var first = select('.feature-list-item:nth-child(0n+2)');  // skip "No Results" item
60373           var firstName = first.select('.entity-name');
60374           var name = t('intro.graph.name.spring-street');
60375
60376           if (!firstName.empty() && firstName.text() === name) {
60377               reveal(first.node(),
60378                   t('intro.navigation.choose_street', { name: name }),
60379                   { duration: 300 }
60380               );
60381
60382               context.on('exit.intro', function() {
60383                   continueTo(selectedStreet);
60384               });
60385
60386               select('.search-header input')
60387                   .on('keydown.intro', eventCancel, true)
60388                   .on('keyup.intro', null);
60389           }
60390
60391           function continueTo(nextStep) {
60392               context.on('exit.intro', null);
60393               select('.search-header input')
60394                   .on('keydown.intro', null)
60395                   .on('keyup.intro', null);
60396               nextStep();
60397           }
60398       }
60399
60400
60401       function selectedStreet() {
60402           if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
60403               return searchStreet();
60404           }
60405
60406           var onClick = function() { continueTo(editorStreet); };
60407           var entity = context.entity(springStreetEndId);
60408           var box = pointBox(entity.loc, context);
60409           box.height = 500;
60410
60411           reveal(box,
60412               t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
60413               { duration: 600, buttonText: t('intro.ok'), buttonCallback: onClick }
60414           );
60415
60416           timeout(function() {
60417               context.map().on('move.intro drawn.intro', function() {
60418                   var entity = context.hasEntity(springStreetEndId);
60419                   if (!entity) return;
60420                   var box = pointBox(entity.loc, context);
60421                   box.height = 500;
60422                   reveal(box,
60423                       t('intro.navigation.selected_street', { name: t('intro.graph.name.spring-street') }),
60424                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
60425                   );
60426               });
60427           }, 600);  // after reveal.
60428
60429           context.on('enter.intro', function(mode) {
60430               if (!context.hasEntity(springStreetId)) {
60431                   return continueTo(searchStreet);
60432               }
60433               var ids = context.selectedIDs();
60434               if (mode.id !== 'select' || !ids.length || ids[0] !== springStreetId) {
60435                   // keep Spring Street selected..
60436                   context.enter(modeSelect(context, [springStreetId]));
60437               }
60438           });
60439
60440           context.history().on('change.intro', function() {
60441               if (!context.hasEntity(springStreetEndId) || !context.hasEntity(springStreetId)) {
60442                   timeout(function() {
60443                       continueTo(searchStreet);
60444                   }, 300);  // after any transition (e.g. if user deleted intersection)
60445               }
60446           });
60447
60448           function continueTo(nextStep) {
60449               context.map().on('move.intro drawn.intro', null);
60450               context.on('enter.intro', null);
60451               context.history().on('change.intro', null);
60452               nextStep();
60453           }
60454       }
60455
60456
60457       function editorStreet() {
60458           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60459           var href = select(selector$$1).attr('href') || '#iD-icon-close';
60460
60461           reveal('.entity-editor-pane',
60462               t('intro.navigation.editor_street', {
60463                   button: icon(href, 'pre-text'),
60464                   field1: onewayField.label(),
60465                   field2: maxspeedField.label()
60466               })
60467           );
60468
60469           context.on('exit.intro', function() {
60470               continueTo(play);
60471           });
60472
60473           context.history().on('change.intro', function() {
60474               // update the close icon in the tooltip if the user edits something.
60475               var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60476               var href = select(selector$$1).attr('href') || '#iD-icon-close';
60477
60478               reveal('.entity-editor-pane',
60479                   t('intro.navigation.editor_street', {
60480                       button: icon(href, 'pre-text'),
60481                       field1: onewayField.label().toLowerCase(),
60482                       field2: maxspeedField.label().toLowerCase()
60483                   }), { duration: 0 }
60484               );
60485           });
60486
60487           function continueTo(nextStep) {
60488               context.on('exit.intro', null);
60489               context.history().on('change.intro', null);
60490               nextStep();
60491           }
60492       }
60493
60494
60495       function play() {
60496           dispatch$$1.call('done');
60497           reveal('#id-container',
60498               t('intro.navigation.play', { next: t('intro.points.title') }), {
60499                   tooltipBox: '.intro-nav-wrap .chapter-point',
60500                   buttonText: t('intro.ok'),
60501                   buttonCallback: function() { reveal('#id-container'); }
60502               }
60503           );
60504       }
60505
60506
60507       chapter.enter = function() {
60508           dragMap();
60509       };
60510
60511
60512       chapter.exit = function() {
60513           timeouts.forEach(window.clearTimeout);
60514           context.on('enter.intro exit.intro', null);
60515           context.map().on('move.intro drawn.intro', null);
60516           context.history().on('change.intro', null);
60517           select('.inspector-wrap').on('wheel.intro', null);
60518           select('.search-header input').on('keydown.intro keyup.intro', null);
60519       };
60520
60521
60522       chapter.restart = function() {
60523           chapter.exit();
60524           chapter.enter();
60525       };
60526
60527
60528       return utilRebind(chapter, dispatch$$1, 'on');
60529   }
60530
60531   function uiIntroPoint(context, reveal) {
60532       var dispatch$$1 = dispatch('done');
60533       var timeouts = [];
60534       var intersection = [-85.63279, 41.94394];
60535       var building = [-85.632422, 41.944045];
60536       var cafePreset = context.presets().item('amenity/cafe');
60537       var _pointID = null;
60538
60539
60540       var chapter = {
60541           title: 'intro.points.title'
60542       };
60543
60544
60545       function timeout(f, t$$1) {
60546           timeouts.push(window.setTimeout(f, t$$1));
60547       }
60548
60549
60550       function revealEditMenu(loc, text, options) {
60551           var rect = context.surfaceRect();
60552           var point$$1 = context.curtainProjection(loc);
60553           var pad = 40;
60554           var width = 250 + (2 * pad);
60555           var height = 250;
60556           var startX = rect.left + point$$1[0];
60557           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
60558           var box = {
60559               left: left,
60560               top: point$$1[1] + rect.top - 60,
60561               width: width,
60562               height: height
60563           };
60564           reveal(box, text, options);
60565       }
60566
60567
60568       function eventCancel() {
60569           event.stopPropagation();
60570           event.preventDefault();
60571       }
60572
60573
60574       function addPoint() {
60575           context.enter(modeBrowse(context));
60576           context.history().reset('initial');
60577
60578           var msec = transitionTime(intersection, context.map().center());
60579           if (msec) { reveal(null, null, { duration: 0 }); }
60580           context.map().zoom(19).centerEase(intersection, msec);
60581
60582           timeout(function() {
60583               var tooltip = reveal('button.add-point',
60584                   t('intro.points.add_point', { button: icon('#iD-icon-point', 'pre-text') }));
60585
60586               _pointID = null;
60587
60588               tooltip.selectAll('.tooltip-inner')
60589                   .insert('svg', 'span')
60590                   .attr('class', 'tooltip-illustration')
60591                   .append('use')
60592                   .attr('xlink:href', '#iD-graphic-points');
60593
60594               context.on('enter.intro', function(mode) {
60595                   if (mode.id !== 'add-point') return;
60596                   continueTo(placePoint);
60597               });
60598           }, msec + 100);
60599
60600           function continueTo(nextStep) {
60601               context.on('enter.intro', null);
60602               nextStep();
60603           }
60604       }
60605
60606
60607       function placePoint() {
60608           if (context.mode().id !== 'add-point') {
60609               return chapter.restart();
60610           }
60611
60612           var pointBox$$1 = pad$1(building, 150, context);
60613           reveal(pointBox$$1, t('intro.points.place_point'));
60614
60615           context.map().on('move.intro drawn.intro', function() {
60616               pointBox$$1 = pad$1(building, 150, context);
60617               reveal(pointBox$$1, t('intro.points.place_point'), { duration: 0 });
60618           });
60619
60620           context.on('enter.intro', function(mode) {
60621               if (mode.id !== 'select') return chapter.restart();
60622               _pointID = context.mode().selectedIDs()[0];
60623               continueTo(searchPreset);
60624           });
60625
60626           function continueTo(nextStep) {
60627               context.map().on('move.intro drawn.intro', null);
60628               context.on('enter.intro', null);
60629               nextStep();
60630           }
60631       }
60632
60633
60634       function searchPreset() {
60635           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
60636               return addPoint();
60637           }
60638
60639           // disallow scrolling
60640           select('.inspector-wrap').on('wheel.intro', eventCancel);
60641
60642           select('.preset-search-input')
60643               .on('keydown.intro', null)
60644               .on('keyup.intro', checkPresetSearch);
60645
60646           reveal('.preset-search-input',
60647               t('intro.points.search_cafe', { preset: cafePreset.name() })
60648           );
60649
60650           context.on('enter.intro', function(mode) {
60651               if (!_pointID || !context.hasEntity(_pointID)) {
60652                   return continueTo(addPoint);
60653               }
60654
60655               var ids = context.selectedIDs();
60656               if (mode.id !== 'select' || !ids.length || ids[0] !== _pointID) {
60657                   // keep the user's point selected..
60658                   context.enter(modeSelect(context, [_pointID]));
60659
60660                   // disallow scrolling
60661                   select('.inspector-wrap').on('wheel.intro', eventCancel);
60662
60663                   select('.preset-search-input')
60664                       .on('keydown.intro', null)
60665                       .on('keyup.intro', checkPresetSearch);
60666
60667                   reveal('.preset-search-input',
60668                       t('intro.points.search_cafe', { preset: cafePreset.name() })
60669                   );
60670
60671                   context.history().on('change.intro', null);
60672               }
60673           });
60674
60675
60676           function checkPresetSearch() {
60677               var first = select('.preset-list-item:first-child');
60678
60679               if (first.classed('preset-amenity-cafe')) {
60680                   select('.preset-search-input')
60681                       .on('keydown.intro', eventCancel, true)
60682                       .on('keyup.intro', null);
60683
60684                   reveal(first.select('.preset-list-button').node(),
60685                       t('intro.points.choose_cafe', { preset: cafePreset.name() }),
60686                       { duration: 300 }
60687                   );
60688
60689                   context.history().on('change.intro', function() {
60690                       continueTo(aboutFeatureEditor);
60691                   });
60692               }
60693           }
60694
60695           function continueTo(nextStep) {
60696               context.on('enter.intro', null);
60697               context.history().on('change.intro', null);
60698               select('.inspector-wrap').on('wheel.intro', null);
60699               select('.preset-search-input').on('keydown.intro keyup.intro', null);
60700               nextStep();
60701           }
60702       }
60703
60704
60705       function aboutFeatureEditor() {
60706           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
60707               return addPoint();
60708           }
60709
60710           timeout(function() {
60711               reveal('.entity-editor-pane', t('intro.points.feature_editor'), {
60712                   tooltipClass: 'intro-points-describe',
60713                   buttonText: t('intro.ok'),
60714                   buttonCallback: function() { continueTo(addName); }
60715               });
60716           }, 400);
60717
60718           context.on('exit.intro', function() {
60719               // if user leaves select mode here, just continue with the tutorial.
60720               continueTo(reselectPoint);
60721           });
60722
60723           function continueTo(nextStep) {
60724               context.on('exit.intro', null);
60725               nextStep();
60726           }
60727       }
60728
60729
60730       function addName() {
60731           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
60732               return addPoint();
60733           }
60734
60735           // reset pane, in case user happened to change it..
60736           select('.inspector-wrap .panewrap').style('right', '0%');
60737
60738           timeout(function() {
60739               // It's possible for the user to add a name in a previous step..
60740               // If so, don't tell them to add the name in this step.
60741               // Give them an OK button instead.
60742               var entity = context.entity(_pointID);
60743               if (entity.tags.name) {
60744                   var tooltip = reveal('.entity-editor-pane', t('intro.points.add_name'), {
60745                       tooltipClass: 'intro-points-describe',
60746                       buttonText: t('intro.ok'),
60747                       buttonCallback: function() { continueTo(addCloseEditor); }
60748                   });
60749                   tooltip.select('.instruction').style('display', 'none');
60750
60751               } else {
60752                   reveal('.entity-editor-pane', t('intro.points.add_name'),
60753                       { tooltipClass: 'intro-points-describe' }
60754                   );
60755               }
60756           }, 400);
60757
60758           context.history().on('change.intro', function() {
60759               continueTo(addCloseEditor);
60760           });
60761
60762           context.on('exit.intro', function() {
60763               // if user leaves select mode here, just continue with the tutorial.
60764               continueTo(reselectPoint);
60765           });
60766
60767           function continueTo(nextStep) {
60768               context.on('exit.intro', null);
60769               context.history().on('change.intro', null);
60770               nextStep();
60771           }
60772       }
60773
60774
60775       function addCloseEditor() {
60776           // reset pane, in case user happened to change it..
60777           select('.inspector-wrap .panewrap').style('right', '0%');
60778
60779           var selector$$1 = '.entity-editor-pane button.preset-close svg use';
60780           var href = select(selector$$1).attr('href') || '#iD-icon-close';
60781
60782           context.on('exit.intro', function() {
60783               continueTo(reselectPoint);
60784           });
60785
60786           reveal('.entity-editor-pane',
60787               t('intro.points.add_close', { button: icon(href, 'pre-text') })
60788           );
60789
60790           function continueTo(nextStep) {
60791               context.on('exit.intro', null);
60792               nextStep();
60793           }
60794       }
60795
60796
60797       function reselectPoint() {
60798           if (!_pointID) return chapter.restart();
60799           var entity = context.hasEntity(_pointID);
60800           if (!entity) return chapter.restart();
60801
60802           // make sure it's still a cafe, in case user somehow changed it..
60803           var oldPreset = context.presets().match(entity, context.graph());
60804           context.replace(actionChangePreset(_pointID, oldPreset, cafePreset));
60805
60806           context.enter(modeBrowse(context));
60807
60808           var msec = transitionTime(entity.loc, context.map().center());
60809           if (msec) { reveal(null, null, { duration: 0 }); }
60810           context.map().centerEase(entity.loc, msec);
60811
60812           timeout(function() {
60813               var box = pointBox(entity.loc, context);
60814               reveal(box, t('intro.points.reselect'), { duration: 600 });
60815
60816               timeout(function() {
60817                   context.map().on('move.intro drawn.intro', function() {
60818                       var entity = context.hasEntity(_pointID);
60819                       if (!entity) return chapter.restart();
60820                       var box = pointBox(entity.loc, context);
60821                       reveal(box, t('intro.points.reselect'), { duration: 0 });
60822                   });
60823               }, 600); // after reveal..
60824
60825               context.on('enter.intro', function(mode) {
60826                   if (mode.id !== 'select') return;
60827                   continueTo(updatePoint);
60828               });
60829
60830           }, msec + 100);
60831
60832           function continueTo(nextStep) {
60833               context.map().on('move.intro drawn.intro', null);
60834               context.on('enter.intro', null);
60835               nextStep();
60836           }
60837       }
60838
60839
60840       function updatePoint() {
60841           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
60842               return continueTo(reselectPoint);
60843           }
60844
60845           // reset pane, in case user happened to untag the point..
60846           select('.inspector-wrap .panewrap').style('right', '0%');
60847
60848           context.on('exit.intro', function() {
60849               continueTo(reselectPoint);
60850           });
60851
60852           context.history().on('change.intro', function() {
60853               continueTo(updateCloseEditor);
60854           });
60855
60856           timeout(function() {
60857               reveal('.entity-editor-pane', t('intro.points.update'),
60858                   { tooltipClass: 'intro-points-describe' }
60859               );
60860           }, 400);
60861
60862           function continueTo(nextStep) {
60863               context.on('exit.intro', null);
60864               context.history().on('change.intro', null);
60865               nextStep();
60866           }
60867       }
60868
60869
60870       function updateCloseEditor() {
60871           if (context.mode().id !== 'select' || !_pointID || !context.hasEntity(_pointID)) {
60872               return continueTo(reselectPoint);
60873           }
60874
60875           // reset pane, in case user happened to change it..
60876           select('.inspector-wrap .panewrap').style('right', '0%');
60877
60878           context.on('exit.intro', function() {
60879               continueTo(rightClickPoint);
60880           });
60881
60882           timeout(function() {
60883               reveal('.entity-editor-pane',
60884                   t('intro.points.update_close', { button: icon('#iD-icon-apply', 'pre-text') })
60885               );
60886           }, 500);
60887
60888           function continueTo(nextStep) {
60889               context.on('exit.intro', null);
60890               nextStep();
60891           }
60892       }
60893
60894
60895       function rightClickPoint() {
60896           if (!_pointID) return chapter.restart();
60897           var entity = context.hasEntity(_pointID);
60898           if (!entity) return chapter.restart();
60899
60900           context.enter(modeBrowse(context));
60901
60902           var box = pointBox(entity.loc, context);
60903           reveal(box, t('intro.points.rightclick'), { duration: 600 });
60904
60905           timeout(function() {
60906               context.map().on('move.intro drawn.intro', function() {
60907                   var entity = context.hasEntity(_pointID);
60908                   if (!entity) return chapter.restart();
60909                   var box = pointBox(entity.loc, context);
60910                   reveal(box, t('intro.points.rightclick'), { duration: 0 });
60911               });
60912           }, 600); // after reveal
60913
60914           context.on('enter.intro', function(mode) {
60915               if (mode.id !== 'select') return;
60916               var ids = context.selectedIDs();
60917               if (ids.length !== 1 || ids[0] !== _pointID) return;
60918
60919               timeout(function() {
60920                   var node = selectMenuItem('delete').node();
60921                   if (!node) return;
60922                   continueTo(enterDelete);
60923               }, 300);  // after menu visible
60924           });
60925
60926           function continueTo(nextStep) {
60927               context.on('enter.intro', null);
60928               context.map().on('move.intro drawn.intro', null);
60929               nextStep();
60930           }
60931       }
60932
60933
60934       function enterDelete() {
60935           if (!_pointID) return chapter.restart();
60936           var entity = context.hasEntity(_pointID);
60937           if (!entity) return chapter.restart();
60938
60939           var node = selectMenuItem('delete').node();
60940           if (!node) { return continueTo(rightClickPoint); }
60941
60942           revealEditMenu(entity.loc,
60943               t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') })
60944           );
60945
60946           timeout(function() {
60947               context.map().on('move.intro drawn.intro', function() {
60948                   revealEditMenu(entity.loc,
60949                       t('intro.points.delete', { button: icon('#iD-operation-delete', 'pre-text') }),
60950                       { duration: 0}
60951                   );
60952               });
60953           }, 300); // after menu visible
60954
60955           context.on('exit.intro', function() {
60956               if (!_pointID) return chapter.restart();
60957               var entity = context.hasEntity(_pointID);
60958               if (entity) return continueTo(rightClickPoint);  // point still exists
60959           });
60960
60961           context.history().on('change.intro', function(changed) {
60962               if (changed.deleted().length) {
60963                   continueTo(undo);
60964               }
60965           });
60966
60967           function continueTo(nextStep) {
60968               context.map().on('move.intro drawn.intro', null);
60969               context.history().on('change.intro', null);
60970               context.on('exit.intro', null);
60971               nextStep();
60972           }
60973       }
60974
60975
60976       function undo() {
60977           context.history().on('change.intro', function() {
60978               continueTo(play);
60979           });
60980
60981           var iconName = '#iD-icon-' + (textDirection === 'rtl' ? 'redo' : 'undo');
60982           reveal('#bar button.undo-button',
60983               t('intro.points.undo', { button: icon(iconName, 'pre-text') })
60984           );
60985
60986           function continueTo(nextStep) {
60987               context.history().on('change.intro', null);
60988               nextStep();
60989           }
60990       }
60991
60992
60993       function play() {
60994           dispatch$$1.call('done');
60995           reveal('#id-container',
60996               t('intro.points.play', { next: t('intro.areas.title') }), {
60997                   tooltipBox: '.intro-nav-wrap .chapter-area',
60998                   buttonText: t('intro.ok'),
60999                   buttonCallback: function() { reveal('#id-container'); }
61000               }
61001           );
61002       }
61003
61004
61005       chapter.enter = function() {
61006           addPoint();
61007       };
61008
61009
61010       chapter.exit = function() {
61011           timeouts.forEach(window.clearTimeout);
61012           context.on('enter.intro exit.intro', null);
61013           context.map().on('move.intro drawn.intro', null);
61014           context.history().on('change.intro', null);
61015           select('.inspector-wrap').on('wheel.intro', eventCancel);
61016           select('.preset-search-input').on('keydown.intro keyup.intro', null);
61017       };
61018
61019
61020       chapter.restart = function() {
61021           chapter.exit();
61022           chapter.enter();
61023       };
61024
61025
61026       return utilRebind(chapter, dispatch$$1, 'on');
61027   }
61028
61029   function uiIntroArea(context, reveal) {
61030       var dispatch$$1 = dispatch('done');
61031       var playground = [-85.63552, 41.94159];
61032       var playgroundPreset = context.presets().item('leisure/playground');
61033       var descriptionField = context.presets().field('description');
61034       var timeouts = [];
61035       var _areaID;
61036
61037
61038       var chapter = {
61039           title: 'intro.areas.title'
61040       };
61041
61042
61043       function timeout(f, t$$1) {
61044           timeouts.push(window.setTimeout(f, t$$1));
61045       }
61046
61047
61048       function eventCancel() {
61049           event.stopPropagation();
61050           event.preventDefault();
61051       }
61052
61053
61054       function revealPlayground(center, text, options) {
61055           var padding = 180 * Math.pow(2, context.map().zoom() - 19.5);
61056           var box = pad$1(center, padding, context);
61057           reveal(box, text, options);
61058       }
61059
61060
61061       function addArea() {
61062           context.enter(modeBrowse(context));
61063           context.history().reset('initial');
61064           _areaID = null;
61065
61066           var msec = transitionTime(playground, context.map().center());
61067           if (msec) { reveal(null, null, { duration: 0 }); }
61068           context.map().zoom(19).centerEase(playground, msec);
61069
61070           timeout(function() {
61071               var tooltip = reveal('button.add-area',
61072                   t('intro.areas.add_playground', { button: icon('#iD-icon-area', 'pre-text') }));
61073
61074               tooltip.selectAll('.tooltip-inner')
61075                   .insert('svg', 'span')
61076                   .attr('class', 'tooltip-illustration')
61077                   .append('use')
61078                   .attr('xlink:href', '#iD-graphic-areas');
61079
61080               context.on('enter.intro', function(mode) {
61081                   if (mode.id !== 'add-area') return;
61082                   continueTo(startPlayground);
61083               });
61084           }, msec + 100);
61085
61086           function continueTo(nextStep) {
61087               context.on('enter.intro', null);
61088               nextStep();
61089           }
61090       }
61091
61092
61093       function startPlayground() {
61094           if (context.mode().id !== 'add-area') {
61095               return chapter.restart();
61096           }
61097
61098           _areaID = null;
61099           context.map().zoomEase(19.5, 500);
61100
61101           timeout(function() {
61102               revealPlayground(playground,
61103                   t('intro.areas.start_playground'), { duration: 250 }
61104               );
61105
61106               timeout(function() {
61107                   context.map().on('move.intro drawn.intro', function() {
61108                       revealPlayground(playground,
61109                           t('intro.areas.start_playground'), { duration: 0 }
61110                       );
61111                   });
61112                   context.on('enter.intro', function(mode) {
61113                       if (mode.id !== 'draw-area') return chapter.restart();
61114                       continueTo(continuePlayground);
61115                   });
61116               }, 250);  // after reveal
61117
61118           }, 550);  // after easing
61119
61120           function continueTo(nextStep) {
61121               context.map().on('move.intro drawn.intro', null);
61122               context.on('enter.intro', null);
61123               nextStep();
61124           }
61125       }
61126
61127
61128       function continuePlayground() {
61129           if (context.mode().id !== 'draw-area') {
61130               return chapter.restart();
61131           }
61132
61133           _areaID = null;
61134           revealPlayground(playground,
61135               t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
61136               { duration: 250 }
61137           );
61138
61139           timeout(function() {
61140               context.map().on('move.intro drawn.intro', function() {
61141                   revealPlayground(playground,
61142                       t('intro.areas.continue_playground', { alt: uiCmd.display('⌥') }),
61143                       { duration: 0 }
61144                   );
61145               });
61146           }, 250);  // after reveal
61147
61148           context.on('enter.intro', function(mode) {
61149               if (mode.id === 'draw-area') {
61150                   var entity = context.hasEntity(context.selectedIDs()[0]);
61151                   if (entity && entity.nodes.length >= 6) {
61152                       return continueTo(finishPlayground);
61153                   } else {
61154                       return;
61155                   }
61156               } else if (mode.id === 'select') {
61157                   _areaID = context.selectedIDs()[0];
61158                   return continueTo(searchPresets);
61159               } else {
61160                   return chapter.restart();
61161               }
61162           });
61163
61164           function continueTo(nextStep) {
61165               context.map().on('move.intro drawn.intro', null);
61166               context.on('enter.intro', null);
61167               nextStep();
61168           }
61169       }
61170
61171
61172       function finishPlayground() {
61173           if (context.mode().id !== 'draw-area') {
61174               return chapter.restart();
61175           }
61176
61177           _areaID = null;
61178           revealPlayground(playground,
61179               t('intro.areas.finish_playground'), { duration: 250 }
61180           );
61181
61182           timeout(function() {
61183               context.map().on('move.intro drawn.intro', function() {
61184                   revealPlayground(playground,
61185                       t('intro.areas.finish_playground'), { duration: 0 }
61186                   );
61187               });
61188           }, 250);  // after reveal
61189
61190           context.on('enter.intro', function(mode) {
61191               if (mode.id === 'draw-area') {
61192                   return;
61193               } else if (mode.id === 'select') {
61194                   _areaID = context.selectedIDs()[0];
61195                   return continueTo(searchPresets);
61196               } else {
61197                   return chapter.restart();
61198               }
61199           });
61200
61201           function continueTo(nextStep) {
61202               context.map().on('move.intro drawn.intro', null);
61203               context.on('enter.intro', null);
61204               nextStep();
61205           }
61206       }
61207
61208
61209       function searchPresets() {
61210           if (!_areaID || !context.hasEntity(_areaID)) {
61211               return addArea();
61212           }
61213           var ids = context.selectedIDs();
61214           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
61215               context.enter(modeSelect(context, [_areaID]));
61216           }
61217
61218           // disallow scrolling
61219           select('.inspector-wrap').on('wheel.intro', eventCancel);
61220
61221           timeout(function() {
61222               // reset pane, in case user somehow happened to change it..
61223               select('.inspector-wrap .panewrap').style('right', '-100%');
61224
61225               select('.preset-search-input')
61226                   .on('keydown.intro', null)
61227                   .on('keyup.intro', checkPresetSearch);
61228
61229               reveal('.preset-search-input',
61230                   t('intro.areas.search_playground', { preset: playgroundPreset.name() })
61231               );
61232           }, 400);  // after preset list pane visible..
61233
61234           context.on('enter.intro', function(mode) {
61235               if (!_areaID || !context.hasEntity(_areaID)) {
61236                   return continueTo(addArea);
61237               }
61238
61239               var ids = context.selectedIDs();
61240               if (mode.id !== 'select' || !ids.length || ids[0] !== _areaID) {
61241                   // keep the user's area selected..
61242                   context.enter(modeSelect(context, [_areaID]));
61243
61244                   // reset pane, in case user somehow happened to change it..
61245                   select('.inspector-wrap .panewrap').style('right', '-100%');
61246                   // disallow scrolling
61247                   select('.inspector-wrap').on('wheel.intro', eventCancel);
61248
61249                   select('.preset-search-input')
61250                       .on('keydown.intro', null)
61251                       .on('keyup.intro', checkPresetSearch);
61252
61253                   reveal('.preset-search-input',
61254                       t('intro.areas.search_playground', { preset: playgroundPreset.name() })
61255                   );
61256
61257                   context.history().on('change.intro', null);
61258               }
61259           });
61260
61261           function checkPresetSearch() {
61262               var first = select('.preset-list-item:first-child');
61263
61264               if (first.classed('preset-leisure-playground')) {
61265                   reveal(first.select('.preset-list-button').node(),
61266                       t('intro.areas.choose_playground', { preset: playgroundPreset.name() }),
61267                       { duration: 300 }
61268                   );
61269
61270                   select('.preset-search-input')
61271                       .on('keydown.intro', eventCancel, true)
61272                       .on('keyup.intro', null);
61273
61274                   context.history().on('change.intro', function() {
61275                       continueTo(clickAddField);
61276                   });
61277               }
61278           }
61279
61280           function continueTo(nextStep) {
61281               select('.inspector-wrap').on('wheel.intro', null);
61282               context.on('enter.intro', null);
61283               context.history().on('change.intro', null);
61284               select('.preset-search-input').on('keydown.intro keyup.intro', null);
61285               nextStep();
61286           }
61287       }
61288
61289
61290       function clickAddField() {
61291           if (!_areaID || !context.hasEntity(_areaID)) {
61292               return addArea();
61293           }
61294           var ids = context.selectedIDs();
61295           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
61296               return searchPresets();
61297           }
61298
61299           if (!select('.form-field-description').empty()) {
61300               return continueTo(describePlayground);
61301           }
61302
61303           // disallow scrolling
61304           select('.inspector-wrap').on('wheel.intro', eventCancel);
61305
61306           timeout(function() {
61307               // reset pane, in case user somehow happened to change it..
61308               select('.inspector-wrap .panewrap').style('right', '0%');
61309
61310               // It's possible for the user to add a description in a previous step..
61311               // If they did this already, just continue to next step.
61312               var entity = context.entity(_areaID);
61313               if (entity.tags.description) {
61314                   return continueTo(play);
61315               }
61316
61317               // scroll "Add field" into view
61318               var box = select('.more-fields').node().getBoundingClientRect();
61319               if (box.top > 300) {
61320                   var pane = select('.entity-editor-pane .inspector-body');
61321                   var start = pane.node().scrollTop;
61322                   var end = start + (box.top - 300);
61323
61324                   pane
61325                       .transition()
61326                       .duration(250)
61327                       .tween('scroll.inspector', function() {
61328                           var node = this;
61329                           var i = interpolateNumber(start, end);
61330                           return function(t$$1) {
61331                               node.scrollTop = i(t$$1);
61332                           };
61333                       });
61334               }
61335
61336               timeout(function() {
61337                   reveal('.more-fields .combobox-input',
61338                       t('intro.areas.add_field'),
61339                       { duration: 300 }
61340                   );
61341
61342                   select('.more-fields .combobox-input')
61343                       .on('click.intro', function() {
61344                           continueTo(chooseDescriptionField);
61345                       });
61346               }, 300);  // after "Add Field" visible
61347
61348           }, 400);  // after editor pane visible
61349
61350           context.on('exit.intro', function() {
61351               return continueTo(searchPresets);
61352           });
61353
61354           function continueTo(nextStep) {
61355               select('.inspector-wrap').on('wheel.intro', null);
61356               select('.more-fields .combobox-input').on('click.intro', null);
61357               context.on('exit.intro', null);
61358               nextStep();
61359           }
61360       }
61361
61362
61363       function chooseDescriptionField() {
61364           if (!_areaID || !context.hasEntity(_areaID)) {
61365               return addArea();
61366           }
61367           var ids = context.selectedIDs();
61368           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
61369               return searchPresets();
61370           }
61371
61372           if (!select('.form-field-description').empty()) {
61373               return continueTo(describePlayground);
61374           }
61375
61376           // Make sure combobox is ready..
61377           if (select('div.combobox').empty()) {
61378               return continueTo(clickAddField);
61379           }
61380           // Watch for the combobox to go away..
61381           var watcher;
61382           watcher = window.setInterval(function() {
61383               if (select('div.combobox').empty()) {
61384                   window.clearInterval(watcher);
61385                   timeout(function() {
61386                       if (select('.form-field-description').empty()) {
61387                           continueTo(retryChooseDescription);
61388                       } else {
61389                           continueTo(describePlayground);
61390                       }
61391                   }, 300);  // after description field added.
61392               }
61393           }, 300);
61394
61395           reveal('div.combobox',
61396               t('intro.areas.choose_field', { field: descriptionField.label() }),
61397               { duration: 300 }
61398           );
61399
61400           context.on('exit.intro', function() {
61401               return continueTo(searchPresets);
61402           });
61403
61404           function continueTo(nextStep) {
61405               if (watcher) window.clearInterval(watcher);
61406               context.on('exit.intro', null);
61407               nextStep();
61408           }
61409       }
61410
61411
61412       function describePlayground() {
61413           if (!_areaID || !context.hasEntity(_areaID)) {
61414               return addArea();
61415           }
61416           var ids = context.selectedIDs();
61417           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
61418               return searchPresets();
61419           }
61420
61421           // reset pane, in case user happened to change it..
61422           select('.inspector-wrap .panewrap').style('right', '0%');
61423
61424           if (select('.form-field-description').empty()) {
61425               return continueTo(retryChooseDescription);
61426           }
61427
61428           context.on('exit.intro', function() {
61429               continueTo(play);
61430           });
61431
61432           reveal('.entity-editor-pane',
61433               t('intro.areas.describe_playground', { button: icon('#iD-icon-apply', 'pre-text') }),
61434               { duration: 300 }
61435           );
61436
61437           function continueTo(nextStep) {
61438               context.on('exit.intro', null);
61439               nextStep();
61440           }
61441       }
61442
61443
61444       function retryChooseDescription() {
61445           if (!_areaID || !context.hasEntity(_areaID)) {
61446               return addArea();
61447           }
61448           var ids = context.selectedIDs();
61449           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _areaID) {
61450               return searchPresets();
61451           }
61452
61453           // reset pane, in case user happened to change it..
61454           select('.inspector-wrap .panewrap').style('right', '0%');
61455
61456           reveal('.entity-editor-pane',
61457               t('intro.areas.retry_add_field', { field: descriptionField.label() }), {
61458               buttonText: t('intro.ok'),
61459               buttonCallback: function() { continueTo(clickAddField); }
61460           });
61461
61462           context.on('exit.intro', function() {
61463               return continueTo(searchPresets);
61464           });
61465
61466           function continueTo(nextStep) {
61467               context.on('exit.intro', null);
61468               nextStep();
61469           }
61470       }
61471
61472
61473       function play() {
61474           dispatch$$1.call('done');
61475           reveal('#id-container',
61476               t('intro.areas.play', { next: t('intro.lines.title') }), {
61477                   tooltipBox: '.intro-nav-wrap .chapter-line',
61478                   buttonText: t('intro.ok'),
61479                   buttonCallback: function() { reveal('#id-container'); }
61480               }
61481           );
61482       }
61483
61484
61485       chapter.enter = function() {
61486           addArea();
61487       };
61488
61489
61490       chapter.exit = function() {
61491           timeouts.forEach(window.clearTimeout);
61492           context.on('enter.intro exit.intro', null);
61493           context.map().on('move.intro drawn.intro', null);
61494           context.history().on('change.intro', null);
61495           select('.inspector-wrap').on('wheel.intro', null);
61496           select('.preset-search-input').on('keydown.intro keyup.intro', null);
61497           select('.more-fields .combobox-input').on('click.intro', null);
61498       };
61499
61500
61501       chapter.restart = function() {
61502           chapter.exit();
61503           chapter.enter();
61504       };
61505
61506
61507       return utilRebind(chapter, dispatch$$1, 'on');
61508   }
61509
61510   function uiIntroLine(context, reveal) {
61511       var dispatch$$1 = dispatch('done');
61512       var timeouts = [];
61513       var _tulipRoadID = null;
61514       var flowerRoadID = 'w646';
61515       var tulipRoadStart = [-85.6297754121684, 41.95805253325314];
61516       var tulipRoadMidpoint = [-85.62975395449628, 41.95787501510204];
61517       var tulipRoadIntersection = [-85.62974496187628, 41.95742515554585];
61518       var roadCategory = context.presets().item('category-road');
61519       var residentialPreset = context.presets().item('highway/residential');
61520       var woodRoadID = 'w525';
61521       var woodRoadEndID = 'n2862';
61522       var woodRoadAddNode = [-85.62390110349587, 41.95397111462291];
61523       var woodRoadDragEndpoint = [-85.623867390213, 41.95466987786487];
61524       var woodRoadDragMidpoint = [-85.62386254803509, 41.95430395953872];
61525       var washingtonStreetID = 'w522';
61526       var twelfthAvenueID = 'w1';
61527       var eleventhAvenueEndID = 'n3550';
61528       var twelfthAvenueEndID = 'n5';
61529       var _washingtonSegmentID = null;
61530       var eleventhAvenueEnd = context.entity(eleventhAvenueEndID).loc;
61531       var twelfthAvenueEnd = context.entity(twelfthAvenueEndID).loc;
61532       var deleteLinesLoc = [-85.6219395542764, 41.95228033922477];
61533       var twelfthAvenue = [-85.62219310052491, 41.952505413152956];
61534
61535
61536       var chapter = {
61537           title: 'intro.lines.title'
61538       };
61539
61540
61541       function timeout(f, t$$1) {
61542           timeouts.push(window.setTimeout(f, t$$1));
61543       }
61544
61545
61546       function eventCancel() {
61547           event.stopPropagation();
61548           event.preventDefault();
61549       }
61550
61551
61552       function revealEditMenu(loc, text, options) {
61553           var rect = context.surfaceRect();
61554           var point$$1 = context.curtainProjection(loc);
61555           var pad = 40;
61556           var width = 250 + (2 * pad);
61557           var height = 350;
61558           var startX = rect.left + point$$1[0];
61559           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
61560           var box = {
61561               left: left,
61562               top: point$$1[1] + rect.top - 60,
61563               width: width,
61564               height: height
61565           };
61566           reveal(box, text, options);
61567       }
61568
61569
61570       function addLine() {
61571           context.enter(modeBrowse(context));
61572           context.history().reset('initial');
61573
61574           var msec = transitionTime(tulipRoadStart, context.map().center());
61575           if (msec) { reveal(null, null, { duration: 0 }); }
61576           context.map().zoom(18.5).centerEase(tulipRoadStart, msec);
61577
61578           timeout(function() {
61579               var tooltip = reveal('button.add-line',
61580                   t('intro.lines.add_line', { button: icon('#iD-icon-line', 'pre-text') }));
61581
61582               tooltip.selectAll('.tooltip-inner')
61583                   .insert('svg', 'span')
61584                   .attr('class', 'tooltip-illustration')
61585                   .append('use')
61586                   .attr('xlink:href', '#iD-graphic-lines');
61587
61588               context.on('enter.intro', function(mode) {
61589                   if (mode.id !== 'add-line') return;
61590                   continueTo(startLine);
61591               });
61592           }, msec + 100);
61593
61594           function continueTo(nextStep) {
61595               context.on('enter.intro', null);
61596               nextStep();
61597           }
61598       }
61599
61600
61601       function startLine() {
61602           if (context.mode().id !== 'add-line') return chapter.restart();
61603
61604           _tulipRoadID = null;
61605
61606           var padding = 70 * Math.pow(2, context.map().zoom() - 18);
61607           var box = pad$1(tulipRoadStart, padding, context);
61608           box.height = box.height + 100;
61609           reveal(box, t('intro.lines.start_line'));
61610
61611           context.map().on('move.intro drawn.intro', function() {
61612               padding = 70 * Math.pow(2, context.map().zoom() - 18);
61613               box = pad$1(tulipRoadStart, padding, context);
61614               box.height = box.height + 100;
61615               reveal(box, t('intro.lines.start_line'), { duration: 0 });
61616           });
61617
61618           context.on('enter.intro', function(mode) {
61619               if (mode.id !== 'draw-line') return chapter.restart();
61620               continueTo(drawLine);
61621           });
61622
61623           function continueTo(nextStep) {
61624               context.map().on('move.intro drawn.intro', null);
61625               context.on('enter.intro', null);
61626               nextStep();
61627           }
61628       }
61629
61630
61631       function drawLine() {
61632           if (context.mode().id !== 'draw-line') return chapter.restart();
61633
61634           _tulipRoadID = context.mode().selectedIDs()[0];
61635           context.map().centerEase(tulipRoadMidpoint, 500);
61636
61637           timeout(function() {
61638               var padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
61639               var box = pad$1(tulipRoadMidpoint, padding, context);
61640               box.height = box.height * 2;
61641               reveal(box,
61642                   t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') })
61643               );
61644
61645               context.map().on('move.intro drawn.intro', function() {
61646                   padding = 200 * Math.pow(2, context.map().zoom() - 18.5);
61647                   box = pad$1(tulipRoadMidpoint, padding, context);
61648                   box.height = box.height * 2;
61649                   reveal(box,
61650                       t('intro.lines.intersect', { name: t('intro.graph.name.flower-street') }),
61651                       { duration: 0 }
61652                   );
61653               });
61654           }, 550);  // after easing..
61655
61656           context.history().on('change.intro', function() {
61657               if (isLineConnected()) {
61658                   continueTo(continueLine);
61659               }
61660           });
61661
61662           context.on('enter.intro', function(mode) {
61663               if (mode.id === 'draw-line') {
61664                   return;
61665               } else if (mode.id === 'select') {
61666                   continueTo(retryIntersect);
61667                   return;
61668               } else {
61669                   return chapter.restart();
61670               }
61671           });
61672
61673           function continueTo(nextStep) {
61674               context.map().on('move.intro drawn.intro', null);
61675               context.history().on('change.intro', null);
61676               context.on('enter.intro', null);
61677               nextStep();
61678           }
61679       }
61680
61681
61682       function isLineConnected() {
61683           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
61684           if (!entity) return false;
61685
61686           var drawNodes = context.graph().childNodes(entity);
61687           return some(drawNodes, function(node) {
61688               return some(context.graph().parentWays(node), function(parent) {
61689                   return parent.id === flowerRoadID;
61690               });
61691           });
61692       }
61693
61694
61695       function retryIntersect() {
61696           select(window).on('mousedown.intro', eventCancel, true);
61697
61698           var box = pad$1(tulipRoadIntersection, 80, context);
61699           reveal(box,
61700               t('intro.lines.retry_intersect', { name: t('intro.graph.name.flower-street') })
61701           );
61702
61703           timeout(chapter.restart, 3000);
61704       }
61705
61706
61707       function continueLine() {
61708           if (context.mode().id !== 'draw-line') return chapter.restart();
61709           var entity = _tulipRoadID && context.hasEntity(_tulipRoadID);
61710           if (!entity) return chapter.restart();
61711
61712           context.map().centerEase(tulipRoadIntersection, 500);
61713
61714           reveal('#surface', t('intro.lines.continue_line'));
61715
61716           context.on('enter.intro', function(mode) {
61717               if (mode.id === 'draw-line')
61718                   return;
61719               else if (mode.id === 'select')
61720                   return continueTo(chooseCategoryRoad);
61721               else
61722                   return chapter.restart();
61723           });
61724
61725           function continueTo(nextStep) {
61726               context.on('enter.intro', null);
61727               nextStep();
61728           }
61729       }
61730
61731
61732       function chooseCategoryRoad() {
61733           if (context.mode().id !== 'select') return chapter.restart();
61734
61735           context.on('exit.intro', function() {
61736               return chapter.restart();
61737           });
61738
61739           var button = select('.preset-category-road .preset-list-button');
61740           if (button.empty()) return chapter.restart();
61741
61742           // disallow scrolling
61743           select('.inspector-wrap').on('wheel.intro', eventCancel);
61744
61745           timeout(function() {
61746               // reset pane, in case user somehow happened to change it..
61747               select('.inspector-wrap .panewrap').style('right', '-100%');
61748
61749               reveal(button.node(),
61750                   t('intro.lines.choose_category_road', { category: roadCategory.name() })
61751               );
61752
61753               button.on('click.intro', function() {
61754                   continueTo(choosePresetResidential);
61755               });
61756
61757           }, 400);  // after editor pane visible
61758
61759           function continueTo(nextStep) {
61760               select('.inspector-wrap').on('wheel.intro', null);
61761               select('.preset-list-button').on('click.intro', null);
61762               context.on('exit.intro', null);
61763               nextStep();
61764           }
61765       }
61766
61767
61768       function choosePresetResidential() {
61769           if (context.mode().id !== 'select') return chapter.restart();
61770
61771           context.on('exit.intro', function() {
61772               return chapter.restart();
61773           });
61774
61775           var subgrid = select('.preset-category-road .subgrid');
61776           if (subgrid.empty()) return chapter.restart();
61777
61778           subgrid.selectAll(':not(.preset-highway-residential) .preset-list-button')
61779               .on('click.intro', function() {
61780                   continueTo(retryPresetResidential);
61781               });
61782
61783           subgrid.selectAll('.preset-highway-residential .preset-list-button')
61784               .on('click.intro', function() {
61785                   continueTo(nameRoad);
61786               });
61787
61788           timeout(function() {
61789               reveal(subgrid.node(),
61790                   t('intro.lines.choose_preset_residential', { preset: residentialPreset.name() }),
61791                   { tooltipBox: '.preset-highway-residential .preset-list-button', duration: 300 }
61792               );
61793           }, 300);
61794
61795           function continueTo(nextStep) {
61796               select('.preset-list-button').on('click.intro', null);
61797               context.on('exit.intro', null);
61798               nextStep();
61799           }
61800       }
61801
61802
61803       // selected wrong road type
61804       function retryPresetResidential() {
61805           if (context.mode().id !== 'select') return chapter.restart();
61806
61807           context.on('exit.intro', function() {
61808               return chapter.restart();
61809           });
61810
61811           // disallow scrolling
61812           select('.inspector-wrap').on('wheel.intro', eventCancel);
61813
61814           timeout(function() {
61815               var button = select('.entity-editor-pane .preset-list-button');
61816
61817               reveal(button.node(),
61818                   t('intro.lines.retry_preset_residential', { preset: residentialPreset.name() })
61819               );
61820
61821               button.on('click.intro', function() {
61822                   continueTo(chooseCategoryRoad);
61823               });
61824
61825           }, 500);
61826
61827           function continueTo(nextStep) {
61828               select('.inspector-wrap').on('wheel.intro', null);
61829               select('.preset-list-button').on('click.intro', null);
61830               context.on('exit.intro', null);
61831               nextStep();
61832           }
61833       }
61834
61835
61836       function nameRoad() {
61837           context.on('exit.intro', function() {
61838               continueTo(didNameRoad);
61839           });
61840
61841           timeout(function() {
61842               reveal('.entity-editor-pane',
61843                   t('intro.lines.name_road', { button: icon('#iD-icon-apply', 'pre-text') }),
61844                   { tooltipClass: 'intro-lines-name_road' }
61845               );
61846           }, 500);
61847
61848           function continueTo(nextStep) {
61849               context.on('exit.intro', null);
61850               nextStep();
61851           }
61852       }
61853
61854
61855       function didNameRoad() {
61856           context.history().checkpoint('doneAddLine');
61857
61858           timeout(function() {
61859               reveal('#surface', t('intro.lines.did_name_road'), {
61860                   buttonText: t('intro.ok'),
61861                   buttonCallback: function() { continueTo(updateLine); }
61862               });
61863           }, 500);
61864
61865           function continueTo(nextStep) {
61866               nextStep();
61867           }
61868       }
61869
61870
61871       function updateLine() {
61872           context.history().reset('doneAddLine');
61873           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61874               return chapter.restart();
61875           }
61876
61877           var msec = transitionTime(woodRoadDragMidpoint, context.map().center());
61878           if (msec) { reveal(null, null, { duration: 0 }); }
61879           context.map().zoom(19).centerEase(woodRoadDragMidpoint, msec);
61880
61881           timeout(function() {
61882               var padding = 250 * Math.pow(2, context.map().zoom() - 19);
61883               var box = pad$1(woodRoadDragMidpoint, padding, context);
61884               var advance = function() { continueTo(addNode); };
61885
61886               reveal(box, t('intro.lines.update_line'),
61887                   { buttonText: t('intro.ok'), buttonCallback: advance }
61888               );
61889
61890               context.map().on('move.intro drawn.intro', function() {
61891                   var padding = 250 * Math.pow(2, context.map().zoom() - 19);
61892                   var box = pad$1(woodRoadDragMidpoint, padding, context);
61893                   reveal(box, t('intro.lines.update_line'),
61894                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
61895                   );
61896               });
61897           }, msec + 100);
61898
61899           function continueTo(nextStep) {
61900               context.map().on('move.intro drawn.intro', null);
61901               nextStep();
61902           }
61903       }
61904
61905
61906       function addNode() {
61907           context.history().reset('doneAddLine');
61908           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61909               return chapter.restart();
61910           }
61911
61912           var padding = 40 * Math.pow(2, context.map().zoom() - 19);
61913           var box = pad$1(woodRoadAddNode, padding, context);
61914           reveal(box, t('intro.lines.add_node'));
61915
61916           context.map().on('move.intro drawn.intro', function() {
61917               var padding = 40 * Math.pow(2, context.map().zoom() - 19);
61918               var box = pad$1(woodRoadAddNode, padding, context);
61919               reveal(box, t('intro.lines.add_node'), { duration: 0 });
61920           });
61921
61922           context.history().on('change.intro', function(changed) {
61923               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61924                   return continueTo(updateLine);
61925               }
61926               if (changed.created().length === 1) {
61927                   timeout(function() { continueTo(startDragEndpoint); }, 500);
61928               }
61929           });
61930
61931           context.on('enter.intro', function(mode) {
61932               if (mode.id !== 'select') {
61933                   continueTo(updateLine);
61934               }
61935           });
61936
61937           function continueTo(nextStep) {
61938               context.map().on('move.intro drawn.intro', null);
61939               context.history().on('change.intro', null);
61940               context.on('enter.intro', null);
61941               nextStep();
61942           }
61943       }
61944
61945
61946       function startDragEndpoint() {
61947           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61948               return continueTo(updateLine);
61949           }
61950           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61951           var box = pad$1(woodRoadDragEndpoint, padding, context);
61952           reveal(box, t('intro.lines.start_drag_endpoint'));
61953
61954           context.map().on('move.intro drawn.intro', function() {
61955               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61956                   return continueTo(updateLine);
61957               }
61958               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61959               var box = pad$1(woodRoadDragEndpoint, padding, context);
61960               reveal(box, t('intro.lines.start_drag_endpoint'), { duration: 0 });
61961
61962               var entity = context.entity(woodRoadEndID);
61963               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) <= 4) {
61964                   continueTo(finishDragEndpoint);
61965               }
61966           });
61967
61968           function continueTo(nextStep) {
61969               context.map().on('move.intro drawn.intro', null);
61970               nextStep();
61971           }
61972       }
61973
61974
61975       function finishDragEndpoint() {
61976           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61977               return continueTo(updateLine);
61978           }
61979
61980           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61981           var box = pad$1(woodRoadDragEndpoint, padding, context);
61982           reveal(box, t('intro.lines.finish_drag_endpoint'));
61983
61984           context.map().on('move.intro drawn.intro', function() {
61985               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
61986                   return continueTo(updateLine);
61987               }
61988               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
61989               var box = pad$1(woodRoadDragEndpoint, padding, context);
61990               reveal(box, t('intro.lines.finish_drag_endpoint'), { duration: 0 });
61991
61992               var entity = context.entity(woodRoadEndID);
61993               if (geoSphericalDistance(entity.loc, woodRoadDragEndpoint) > 4) {
61994                   continueTo(startDragEndpoint);
61995               }
61996           });
61997
61998           context.on('enter.intro', function() {
61999               continueTo(startDragMidpoint);
62000           });
62001
62002           function continueTo(nextStep) {
62003               context.map().on('move.intro drawn.intro', null);
62004               context.on('enter.intro', null);
62005               nextStep();
62006           }
62007       }
62008
62009
62010       function startDragMidpoint() {
62011           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
62012               return continueTo(updateLine);
62013           }
62014           if (context.selectedIDs().indexOf(woodRoadID) === -1) {
62015               context.enter(modeSelect(context, [woodRoadID]));
62016           }
62017
62018           var padding = 80 * Math.pow(2, context.map().zoom() - 19);
62019           var box = pad$1(woodRoadDragMidpoint, padding, context);
62020           reveal(box, t('intro.lines.start_drag_midpoint'));
62021
62022           context.map().on('move.intro drawn.intro', function() {
62023               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
62024                   return continueTo(updateLine);
62025               }
62026               var padding = 80 * Math.pow(2, context.map().zoom() - 19);
62027               var box = pad$1(woodRoadDragMidpoint, padding, context);
62028               reveal(box, t('intro.lines.start_drag_midpoint'), { duration: 0 });
62029           });
62030
62031           context.history().on('change.intro', function(changed) {
62032               if (changed.created().length === 1) {
62033                   continueTo(continueDragMidpoint);
62034               }
62035           });
62036
62037           context.on('enter.intro', function(mode) {
62038               if (mode.id !== 'select') {
62039                   // keep Wood Road selected so midpoint triangles are drawn..
62040                   context.enter(modeSelect(context, [woodRoadID]));
62041               }
62042           });
62043
62044           function continueTo(nextStep) {
62045               context.map().on('move.intro drawn.intro', null);
62046               context.history().on('change.intro', null);
62047               context.on('enter.intro', null);
62048               nextStep();
62049           }
62050       }
62051
62052
62053       function continueDragMidpoint() {
62054           if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
62055               return continueTo(updateLine);
62056           }
62057
62058           var padding = 100 * Math.pow(2, context.map().zoom() - 19);
62059           var box = pad$1(woodRoadDragEndpoint, padding, context);
62060           box.height += 400;
62061
62062           var advance = function() {
62063               context.history().checkpoint('doneUpdateLine');
62064               continueTo(deleteLines);
62065           };
62066
62067           reveal(box, t('intro.lines.continue_drag_midpoint'),
62068               { buttonText: t('intro.ok'), buttonCallback: advance }
62069           );
62070
62071           context.map().on('move.intro drawn.intro', function() {
62072               if (!context.hasEntity(woodRoadID) || !context.hasEntity(woodRoadEndID)) {
62073                   return continueTo(updateLine);
62074               }
62075               var padding = 100 * Math.pow(2, context.map().zoom() - 19);
62076               var box = pad$1(woodRoadDragEndpoint, padding, context);
62077               box.height += 400;
62078               reveal(box, t('intro.lines.continue_drag_midpoint'),
62079                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
62080               );
62081           });
62082
62083           function continueTo(nextStep) {
62084               context.map().on('move.intro drawn.intro', null);
62085               nextStep();
62086           }
62087       }
62088
62089
62090       function deleteLines() {
62091           context.history().reset('doneUpdateLine');
62092           context.enter(modeBrowse(context));
62093
62094           if (!context.hasEntity(washingtonStreetID) ||
62095               !context.hasEntity(twelfthAvenueID) ||
62096               !context.hasEntity(eleventhAvenueEndID)) {
62097               return chapter.restart();
62098           }
62099
62100           var msec = transitionTime(deleteLinesLoc, context.map().center());
62101           if (msec) { reveal(null, null, { duration: 0 }); }
62102           context.map().zoom(18).centerEase(deleteLinesLoc, msec);
62103
62104           timeout(function() {
62105               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62106               var box = pad$1(deleteLinesLoc, padding, context);
62107               box.top -= 200;
62108               box.height += 400;
62109               var advance = function() { continueTo(rightClickIntersection); };
62110
62111               reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
62112                   { buttonText: t('intro.ok'), buttonCallback: advance }
62113               );
62114
62115               context.map().on('move.intro drawn.intro', function() {
62116                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62117                   var box = pad$1(deleteLinesLoc, padding, context);
62118                   box.top -= 200;
62119                   box.height += 400;
62120                   reveal(box, t('intro.lines.delete_lines', { street: t('intro.graph.name.12th-avenue') }),
62121                       { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
62122                   );
62123               });
62124
62125               context.history().on('change.intro', function() {
62126                   timeout(function() {
62127                       continueTo(deleteLines);
62128                   }, 500);  // after any transition (e.g. if user deleted intersection)
62129               });
62130
62131           }, msec + 100);
62132
62133           function continueTo(nextStep) {
62134               context.map().on('move.intro drawn.intro', null);
62135               context.history().on('change.intro', null);
62136               nextStep();
62137           }
62138       }
62139
62140
62141       function rightClickIntersection() {
62142           context.history().reset('doneUpdateLine');
62143           context.enter(modeBrowse(context));
62144
62145           context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
62146
62147           timeout(function() {
62148               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62149               var box = pad$1(eleventhAvenueEnd, padding, context);
62150               reveal(box, t('intro.lines.rightclick_intersection',
62151                   { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') })
62152               );
62153
62154               context.map().on('move.intro drawn.intro', function() {
62155                   var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62156                   var box = pad$1(eleventhAvenueEnd, padding, context);
62157                   reveal(box, t('intro.lines.rightclick_intersection',
62158                       { street1: t('intro.graph.name.11th-avenue'), street2: t('intro.graph.name.washington-street') }),
62159                       { duration: 0 }
62160                   );
62161               });
62162
62163               context.on('enter.intro', function(mode) {
62164                   if (mode.id !== 'select') return;
62165                   var ids = context.selectedIDs();
62166                   if (ids.length !== 1 || ids[0] !== eleventhAvenueEndID) return;
62167
62168                   timeout(function() {
62169                       var node = selectMenuItem('split').node();
62170                       if (!node) return;
62171                       continueTo(splitIntersection);
62172                   }, 300);  // after menu visible
62173               });
62174
62175               context.history().on('change.intro', function() {
62176                   timeout(function() {
62177                       continueTo(deleteLines);
62178                   }, 300);  // after any transition (e.g. if user deleted intersection)
62179               });
62180
62181           }, 600);
62182
62183           function continueTo(nextStep) {
62184               context.map().on('move.intro drawn.intro', null);
62185               context.on('enter.intro', null);
62186               context.history().on('change.intro', null);
62187               nextStep();
62188           }
62189       }
62190
62191
62192       function splitIntersection() {
62193           if (!context.hasEntity(washingtonStreetID) ||
62194               !context.hasEntity(twelfthAvenueID) ||
62195               !context.hasEntity(eleventhAvenueEndID)) {
62196               return continueTo(deleteLines);
62197           }
62198
62199           var node = selectMenuItem('split').node();
62200           if (!node) { return continueTo(rightClickIntersection); }
62201
62202           var wasChanged = false;
62203           var menuCoords = context.map().mouseCoordinates();
62204           _washingtonSegmentID = null;
62205
62206           revealEditMenu(menuCoords, t('intro.lines.split_intersection',
62207               { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') })
62208           );
62209
62210           context.map().on('move.intro drawn.intro', function() {
62211               var node = selectMenuItem('split').node();
62212               if (!wasChanged && !node) { return continueTo(rightClickIntersection); }
62213
62214               revealEditMenu(menuCoords, t('intro.lines.split_intersection',
62215                   { button: icon('#iD-operation-split', 'pre-text'), street: t('intro.graph.name.washington-street') }),
62216                   { duration: 0 }
62217               );
62218           });
62219
62220           context.history().on('change.intro', function(changed) {
62221               wasChanged = true;
62222               timeout(function() {
62223                   if (context.history().undoAnnotation() === t('operations.split.annotation.line')) {
62224                       _washingtonSegmentID = changed.created()[0].id;
62225                       continueTo(didSplit);
62226                   } else {
62227                       _washingtonSegmentID = null;
62228                       continueTo(retrySplit);
62229                   }
62230               }, 300);  // after any transition (e.g. if user deleted intersection)
62231           });
62232
62233           function continueTo(nextStep) {
62234               context.map().on('move.intro drawn.intro', null);
62235               context.history().on('change.intro', null);
62236               nextStep();
62237           }
62238       }
62239
62240
62241       function retrySplit() {
62242           context.enter(modeBrowse(context));
62243           context.map().zoom(18).centerEase(eleventhAvenueEnd, 500);
62244           var advance = function() { continueTo(rightClickIntersection); };
62245
62246           var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62247           var box = pad$1(eleventhAvenueEnd, padding, context);
62248           reveal(box, t('intro.lines.retry_split'),
62249               { buttonText: t('intro.ok'), buttonCallback: advance }
62250           );
62251
62252           context.map().on('move.intro drawn.intro', function() {
62253               var padding = 60 * Math.pow(2, context.map().zoom() - 18);
62254               var box = pad$1(eleventhAvenueEnd, padding, context);
62255               reveal(box, t('intro.lines.retry_split'),
62256                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: advance }
62257               );
62258           });
62259
62260           function continueTo(nextStep) {
62261               context.map().on('move.intro drawn.intro', null);
62262               nextStep();
62263           }
62264       }
62265
62266
62267       function didSplit() {
62268           if (!_washingtonSegmentID ||
62269               !context.hasEntity(_washingtonSegmentID) ||
62270               !context.hasEntity(washingtonStreetID) ||
62271               !context.hasEntity(twelfthAvenueID) ||
62272               !context.hasEntity(eleventhAvenueEndID)) {
62273               return continueTo(rightClickIntersection);
62274           }
62275
62276           var ids = context.selectedIDs();
62277           var string = 'intro.lines.did_split_' + (ids.length > 1 ? 'multi' : 'single');
62278           var street = t('intro.graph.name.washington-street');
62279
62280           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62281           var box = pad$1(twelfthAvenue, padding, context);
62282           box.width = box.width / 2;
62283           reveal(box, t(string, { street1: street, street2: street }),
62284               { duration: 500 }
62285           );
62286
62287           timeout(function() {
62288               context.map().zoom(18).centerEase(twelfthAvenue, 500);
62289
62290               context.map().on('move.intro drawn.intro', function() {
62291                   var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62292                   var box = pad$1(twelfthAvenue, padding, context);
62293                   box.width = box.width / 2;
62294                   reveal(box, t(string, { street1: street, street2: street }),
62295                       { duration: 0 }
62296                   );
62297               });
62298           }, 600);  // after initial reveal and curtain cut
62299
62300           context.on('enter.intro', function() {
62301               var ids = context.selectedIDs();
62302               if (ids.length === 1 && ids[0] === _washingtonSegmentID) {
62303                   continueTo(multiSelect);
62304               }
62305           });
62306
62307           context.history().on('change.intro', function() {
62308               if (!_washingtonSegmentID ||
62309                   !context.hasEntity(_washingtonSegmentID) ||
62310                   !context.hasEntity(washingtonStreetID) ||
62311                   !context.hasEntity(twelfthAvenueID) ||
62312                   !context.hasEntity(eleventhAvenueEndID)) {
62313                   return continueTo(rightClickIntersection);
62314               }
62315           });
62316
62317           function continueTo(nextStep) {
62318               context.map().on('move.intro drawn.intro', null);
62319               context.on('enter.intro', null);
62320               context.history().on('change.intro', null);
62321               nextStep();
62322           }
62323       }
62324
62325
62326       function multiSelect() {
62327           if (!_washingtonSegmentID ||
62328               !context.hasEntity(_washingtonSegmentID) ||
62329               !context.hasEntity(washingtonStreetID) ||
62330               !context.hasEntity(twelfthAvenueID) ||
62331               !context.hasEntity(eleventhAvenueEndID)) {
62332               return continueTo(rightClickIntersection);
62333           }
62334
62335           var ids = context.selectedIDs();
62336           var hasWashington = ids.indexOf(_washingtonSegmentID) !== -1;
62337           var hasTwelfth = ids.indexOf(twelfthAvenueID) !== -1;
62338
62339           if (hasWashington && hasTwelfth) {
62340               return continueTo(multiRightClick);
62341           } else if (!hasWashington && !hasTwelfth) {
62342               return continueTo(didSplit);
62343           }
62344
62345           context.map().zoom(18).centerEase(twelfthAvenue, 500);
62346
62347           timeout(function() {
62348               var selected, other, padding, box;
62349               if (hasWashington) {
62350                   selected = t('intro.graph.name.washington-street');
62351                   other = t('intro.graph.name.12th-avenue');
62352                   padding = 60 * Math.pow(2, context.map().zoom() - 18);
62353                   box = pad$1(twelfthAvenueEnd, padding, context);
62354                   box.width *= 3;
62355               } else {
62356                   selected = t('intro.graph.name.12th-avenue');
62357                   other = t('intro.graph.name.washington-street');
62358                   padding = 200 * Math.pow(2, context.map().zoom() - 18);
62359                   box = pad$1(twelfthAvenue, padding, context);
62360                   box.width /= 2;
62361               }
62362
62363               reveal(box,
62364                   t('intro.lines.multi_select', { selected: selected, other1: other, other2: other })
62365               );
62366
62367               context.map().on('move.intro drawn.intro', function() {
62368                   if (hasWashington) {
62369                       selected = t('intro.graph.name.washington-street');
62370                       other = t('intro.graph.name.12th-avenue');
62371                       padding = 60 * Math.pow(2, context.map().zoom() - 18);
62372                       box = pad$1(twelfthAvenueEnd, padding, context);
62373                       box.width *= 3;
62374                   } else {
62375                       selected = t('intro.graph.name.12th-avenue');
62376                       other = t('intro.graph.name.washington-street');
62377                       padding = 200 * Math.pow(2, context.map().zoom() - 18);
62378                       box = pad$1(twelfthAvenue, padding, context);
62379                       box.width /= 2;
62380                   }
62381
62382                   reveal(box,
62383                       t('intro.lines.multi_select', { selected: selected, other1: other, other2: other }),
62384                       { duration: 0 }
62385                   );
62386               });
62387
62388               context.on('enter.intro', function() {
62389                   continueTo(multiSelect);
62390               });
62391
62392               context.history().on('change.intro', function() {
62393                   if (!_washingtonSegmentID ||
62394                       !context.hasEntity(_washingtonSegmentID) ||
62395                       !context.hasEntity(washingtonStreetID) ||
62396                       !context.hasEntity(twelfthAvenueID) ||
62397                       !context.hasEntity(eleventhAvenueEndID)) {
62398                       return continueTo(rightClickIntersection);
62399                   }
62400               });
62401           }, 600);
62402
62403           function continueTo(nextStep) {
62404               context.map().on('move.intro drawn.intro', null);
62405               context.on('enter.intro', null);
62406               context.history().on('change.intro', null);
62407               nextStep();
62408           }
62409       }
62410
62411
62412       function multiRightClick() {
62413           if (!_washingtonSegmentID ||
62414               !context.hasEntity(_washingtonSegmentID) ||
62415               !context.hasEntity(washingtonStreetID) ||
62416               !context.hasEntity(twelfthAvenueID) ||
62417               !context.hasEntity(eleventhAvenueEndID)) {
62418               return continueTo(rightClickIntersection);
62419           }
62420
62421           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62422           var box = pad$1(twelfthAvenue, padding, context);
62423           reveal(box, t('intro.lines.multi_rightclick'));
62424
62425           context.map().on('move.intro drawn.intro', function() {
62426               var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62427               var box = pad$1(twelfthAvenue, padding, context);
62428               reveal(box, t('intro.lines.multi_rightclick'), { duration: 0 });
62429           });
62430
62431           select(window).on('click.intro contextmenu.intro', function() {
62432               timeout(function() {
62433                   var ids = context.selectedIDs();
62434                   if (ids.length === 2 &&
62435                       ids.indexOf(twelfthAvenueID) !== -1 &&
62436                       ids.indexOf(_washingtonSegmentID) !== -1) {
62437                           var node = selectMenuItem('delete').node();
62438                           if (!node) return;
62439                           continueTo(multiDelete);
62440                   } else if (ids.length === 1 &&
62441                       ids.indexOf(_washingtonSegmentID) !== -1) {
62442                       return continueTo(multiSelect);
62443                   } else {
62444                       return continueTo(didSplit);
62445                   }
62446               }, 300);  // after edit menu visible
62447           }, true);
62448
62449           context.history().on('change.intro', function() {
62450               if (!_washingtonSegmentID ||
62451                   !context.hasEntity(_washingtonSegmentID) ||
62452                   !context.hasEntity(washingtonStreetID) ||
62453                   !context.hasEntity(twelfthAvenueID) ||
62454                   !context.hasEntity(eleventhAvenueEndID)) {
62455                   return continueTo(rightClickIntersection);
62456               }
62457           });
62458
62459           function continueTo(nextStep) {
62460               context.map().on('move.intro drawn.intro', null);
62461               select(window).on('click.intro contextmenu.intro', null, true);
62462               context.history().on('change.intro', null);
62463               nextStep();
62464           }
62465       }
62466
62467
62468       function multiDelete() {
62469           if (!_washingtonSegmentID ||
62470               !context.hasEntity(_washingtonSegmentID) ||
62471               !context.hasEntity(washingtonStreetID) ||
62472               !context.hasEntity(twelfthAvenueID) ||
62473               !context.hasEntity(eleventhAvenueEndID)) {
62474               return continueTo(rightClickIntersection);
62475           }
62476
62477           var node = selectMenuItem('delete').node();
62478           if (!node) return continueTo(multiRightClick);
62479
62480           var menuCoords = context.map().mouseCoordinates();
62481           revealEditMenu(menuCoords,
62482               t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') })
62483           );
62484
62485           context.map().on('move.intro drawn.intro', function() {
62486               revealEditMenu(menuCoords,
62487                   t('intro.lines.multi_delete', { button: icon('#iD-operation-delete', 'pre-text') }),
62488                   { duration: 0 }
62489               );
62490           });
62491
62492           context.on('exit.intro', function() {
62493               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
62494                   return continueTo(multiSelect);  // left select mode but roads still exist
62495               }
62496           });
62497
62498           context.history().on('change.intro', function() {
62499               if (context.hasEntity(_washingtonSegmentID) || context.hasEntity(twelfthAvenueID)) {
62500                   continueTo(retryDelete);         // changed something but roads still exist
62501               } else {
62502                   continueTo(play);
62503               }
62504           });
62505
62506           function continueTo(nextStep) {
62507               context.map().on('move.intro drawn.intro', null);
62508               context.on('exit.intro', null);
62509               context.history().on('change.intro', null);
62510               nextStep();
62511           }
62512       }
62513
62514
62515       function retryDelete() {
62516           context.enter(modeBrowse(context));
62517
62518           var padding = 200 * Math.pow(2, context.map().zoom() - 18);
62519           var box = pad$1(twelfthAvenue, padding, context);
62520           reveal(box, t('intro.lines.retry_delete'), {
62521               buttonText: t('intro.ok'),
62522               buttonCallback: function() { continueTo(multiSelect); }
62523           });
62524
62525           function continueTo(nextStep) {
62526               nextStep();
62527           }
62528       }
62529
62530
62531       function play() {
62532           dispatch$$1.call('done');
62533           reveal('#id-container',
62534               t('intro.lines.play', { next: t('intro.buildings.title') }), {
62535                   tooltipBox: '.intro-nav-wrap .chapter-building',
62536                   buttonText: t('intro.ok'),
62537                   buttonCallback: function() { reveal('#id-container'); }
62538               }
62539           );
62540      }
62541
62542
62543       chapter.enter = function() {
62544           addLine();
62545       };
62546
62547
62548       chapter.exit = function() {
62549           timeouts.forEach(window.clearTimeout);
62550           select(window).on('mousedown.intro', null, true);
62551           context.on('enter.intro exit.intro', null);
62552           context.map().on('move.intro drawn.intro', null);
62553           context.history().on('change.intro', null);
62554           select('.inspector-wrap').on('wheel.intro', null);
62555           select('.preset-list-button').on('click.intro', null);
62556       };
62557
62558
62559       chapter.restart = function() {
62560           chapter.exit();
62561           chapter.enter();
62562       };
62563
62564
62565       return utilRebind(chapter, dispatch$$1, 'on');
62566   }
62567
62568   function uiIntroBuilding(context, reveal) {
62569       var dispatch$$1 = dispatch('done');
62570       var house = [-85.62815, 41.95638];
62571       var tank = [-85.62732, 41.95347];
62572       var buildingCatetory = context.presets().item('category-building');
62573       var housePreset = context.presets().item('building/house');
62574       var tankPreset = context.presets().item('man_made/storage_tank');
62575       var timeouts = [];
62576       var _houseID = null;
62577       var _tankID = null;
62578
62579
62580       var chapter = {
62581           title: 'intro.buildings.title'
62582       };
62583
62584
62585       function timeout(f, t$$1) {
62586           timeouts.push(window.setTimeout(f, t$$1));
62587       }
62588
62589
62590       function eventCancel() {
62591           event.stopPropagation();
62592           event.preventDefault();
62593       }
62594
62595
62596       function revealHouse(center, text, options) {
62597           var padding = 160 * Math.pow(2, context.map().zoom() - 20);
62598           var box = pad$1(center, padding, context);
62599           reveal(box, text, options);
62600       }
62601
62602
62603       function revealTank(center, text, options) {
62604           var padding = 190 * Math.pow(2, context.map().zoom() - 19.5);
62605           var box = pad$1(center, padding, context);
62606           reveal(box, text, options);
62607       }
62608
62609
62610       function revealEditMenu(loc, text, options) {
62611           var rect = context.surfaceRect();
62612           var point$$1 = context.curtainProjection(loc);
62613           var pad = 40;
62614           var width = 250 + (2 * pad);
62615           var height = 350;
62616           var startX = rect.left + point$$1[0];
62617           var left = (textDirection === 'rtl') ? (startX - width + pad) : (startX - pad);
62618           var box = {
62619               left: left,
62620               top: point$$1[1] + rect.top - 60,
62621               width: width,
62622               height: height
62623           };
62624           reveal(box, text, options);
62625       }
62626
62627
62628       function addHouse() {
62629           context.enter(modeBrowse(context));
62630           context.history().reset('initial');
62631           _houseID = null;
62632
62633           var msec = transitionTime(house, context.map().center());
62634           if (msec) { reveal(null, null, { duration: 0 }); }
62635           context.map().zoom(19).centerEase(house, msec);
62636
62637           timeout(function() {
62638               var tooltip = reveal('button.add-area',
62639                   t('intro.buildings.add_building', { button: icon('#iD-icon-area', 'pre-text') }));
62640
62641               tooltip.selectAll('.tooltip-inner')
62642                   .insert('svg', 'span')
62643                   .attr('class', 'tooltip-illustration')
62644                   .append('use')
62645                   .attr('xlink:href', '#iD-graphic-buildings');
62646
62647               context.on('enter.intro', function(mode) {
62648                   if (mode.id !== 'add-area') return;
62649                   continueTo(startHouse);
62650               });
62651           }, msec + 100);
62652
62653           function continueTo(nextStep) {
62654               context.on('enter.intro', null);
62655               nextStep();
62656           }
62657       }
62658
62659
62660       function startHouse() {
62661           if (context.mode().id !== 'add-area') {
62662               return continueTo(addHouse);
62663           }
62664
62665           _houseID = null;
62666           context.map().zoomEase(20, 500);
62667
62668           timeout(function() {
62669               revealHouse(house, t('intro.buildings.start_building'));
62670
62671               context.map().on('move.intro drawn.intro', function() {
62672                   revealHouse(house, t('intro.buildings.start_building'), { duration: 0 });
62673               });
62674
62675               context.on('enter.intro', function(mode) {
62676                   if (mode.id !== 'draw-area') return chapter.restart();
62677                   continueTo(continueHouse);
62678               });
62679
62680           }, 550);  // after easing
62681
62682           function continueTo(nextStep) {
62683               context.map().on('move.intro drawn.intro', null);
62684               context.on('enter.intro', null);
62685               nextStep();
62686           }
62687       }
62688
62689
62690       function continueHouse() {
62691           if (context.mode().id !== 'draw-area') {
62692               return continueTo(addHouse);
62693           }
62694
62695           _houseID = null;
62696
62697           revealHouse(house, t('intro.buildings.continue_building'));
62698
62699           context.map().on('move.intro drawn.intro', function() {
62700               revealHouse(house, t('intro.buildings.continue_building'), { duration: 0 });
62701           });
62702
62703           context.on('enter.intro', function(mode) {
62704               if (mode.id === 'draw-area') {
62705                   return;
62706               } else if (mode.id === 'select') {
62707                   var graph = context.graph();
62708                   var way = context.entity(context.selectedIDs()[0]);
62709                   var nodes = graph.childNodes(way);
62710                   var points = uniq(nodes).map(function(n) { return context.projection(n.loc); });
62711
62712                   if (isMostlySquare(points)) {
62713                       _houseID = way.id;
62714                       return continueTo(chooseCategoryBuilding);
62715                   } else {
62716                       return continueTo(retryHouse);
62717                   }
62718
62719               } else {
62720                   return chapter.restart();
62721               }
62722           });
62723
62724           function continueTo(nextStep) {
62725               context.map().on('move.intro drawn.intro', null);
62726               context.on('enter.intro', null);
62727               nextStep();
62728           }
62729       }
62730
62731
62732       function retryHouse() {
62733           var onClick = function() { continueTo(addHouse); };
62734
62735           revealHouse(house, t('intro.buildings.retry_building'),
62736               { buttonText: t('intro.ok'), buttonCallback: onClick }
62737           );
62738
62739           context.map().on('move.intro drawn.intro', function() {
62740               revealHouse(house, t('intro.buildings.retry_building'),
62741                   { duration: 0, buttonText: t('intro.ok'), buttonCallback: onClick }
62742               );
62743           });
62744
62745           function continueTo(nextStep) {
62746               context.map().on('move.intro drawn.intro', null);
62747               nextStep();
62748           }
62749       }
62750
62751
62752       function chooseCategoryBuilding() {
62753           if (!_houseID || !context.hasEntity(_houseID)) {
62754               return addHouse();
62755           }
62756           var ids = context.selectedIDs();
62757           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
62758               context.enter(modeSelect(context, [_houseID]));
62759           }
62760
62761           // disallow scrolling
62762           select('.inspector-wrap').on('wheel.intro', eventCancel);
62763
62764           timeout(function() {
62765               // reset pane, in case user somehow happened to change it..
62766               select('.inspector-wrap .panewrap').style('right', '-100%');
62767
62768               var button = select('.preset-category-building .preset-list-button');
62769
62770               reveal(button.node(),
62771                   t('intro.buildings.choose_category_building', { category: buildingCatetory.name() })
62772               );
62773
62774               button.on('click.intro', function() {
62775                   button.on('click.intro', null);
62776                   continueTo(choosePresetHouse);
62777               });
62778
62779           }, 400);  // after preset list pane visible..
62780
62781
62782           context.on('enter.intro', function(mode) {
62783               if (!_houseID || !context.hasEntity(_houseID)) {
62784                   return continueTo(addHouse);
62785               }
62786               var ids = context.selectedIDs();
62787               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
62788                   return continueTo(chooseCategoryBuilding);
62789               }
62790           });
62791
62792           function continueTo(nextStep) {
62793               select('.inspector-wrap').on('wheel.intro', null);
62794               select('.preset-list-button').on('click.intro', null);
62795               context.on('enter.intro', null);
62796               nextStep();
62797           }
62798       }
62799
62800
62801       function choosePresetHouse() {
62802           if (!_houseID || !context.hasEntity(_houseID)) {
62803               return addHouse();
62804           }
62805           var ids = context.selectedIDs();
62806           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
62807               context.enter(modeSelect(context, [_houseID]));
62808           }
62809
62810           // disallow scrolling
62811           select('.inspector-wrap').on('wheel.intro', eventCancel);
62812
62813           timeout(function() {
62814               // reset pane, in case user somehow happened to change it..
62815               select('.inspector-wrap .panewrap').style('right', '-100%');
62816
62817               var button = select('.preset-building-house .preset-list-button');
62818
62819               reveal(button.node(),
62820                   t('intro.buildings.choose_preset_house', { preset: housePreset.name() }),
62821                   { duration: 300 }
62822               );
62823
62824               button.on('click.intro', function() {
62825                   button.on('click.intro', null);
62826                   continueTo(closeEditorHouse);
62827               });
62828
62829           }, 400);  // after preset list pane visible..
62830
62831           context.on('enter.intro', function(mode) {
62832               if (!_houseID || !context.hasEntity(_houseID)) {
62833                   return continueTo(addHouse);
62834               }
62835               var ids = context.selectedIDs();
62836               if (mode.id !== 'select' || !ids.length || ids[0] !== _houseID) {
62837                   return continueTo(chooseCategoryBuilding);
62838               }
62839           });
62840
62841           function continueTo(nextStep) {
62842               select('.inspector-wrap').on('wheel.intro', null);
62843               select('.preset-list-button').on('click.intro', null);
62844               context.on('enter.intro', null);
62845               nextStep();
62846           }
62847       }
62848
62849
62850       function closeEditorHouse() {
62851           if (!_houseID || !context.hasEntity(_houseID)) {
62852               return addHouse();
62853           }
62854           var ids = context.selectedIDs();
62855           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _houseID) {
62856               context.enter(modeSelect(context, [_houseID]));
62857           }
62858
62859           context.history().checkpoint('hasHouse');
62860
62861           context.on('exit.intro', function() {
62862               continueTo(rightClickHouse);
62863           });
62864
62865           timeout(function() {
62866               reveal('.entity-editor-pane',
62867                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
62868               );
62869           }, 500);
62870
62871           function continueTo(nextStep) {
62872               context.on('exit.intro', null);
62873               nextStep();
62874           }
62875       }
62876
62877
62878       function rightClickHouse() {
62879           if (!_houseID) return chapter.restart();
62880
62881           context.enter(modeBrowse(context));
62882           context.history().reset('hasHouse');
62883           context.map().centerEase(house, 500);
62884
62885           timeout(function() {
62886               if (context.map().zoom() < 20) {
62887                   context.map().zoomEase(20, 500);
62888               }
62889           }, 520);
62890
62891           context.on('enter.intro', function(mode) {
62892               if (mode.id !== 'select') return;
62893               var ids = context.selectedIDs();
62894               if (ids.length !== 1 || ids[0] !== _houseID) return;
62895
62896               timeout(function() {
62897                   var node = selectMenuItem('orthogonalize').node();
62898                   if (!node) return;
62899                   continueTo(clickSquare);
62900               }, 300);  // after menu visible
62901           });
62902
62903           context.map().on('move.intro drawn.intro', function() {
62904               revealHouse(house, t('intro.buildings.rightclick_building'), { duration: 0 });
62905           });
62906
62907           context.history().on('change.intro', function() {
62908               continueTo(rightClickHouse);
62909           });
62910
62911           function continueTo(nextStep) {
62912               context.on('enter.intro', null);
62913               context.map().on('move.intro drawn.intro', null);
62914               context.history().on('change.intro', null);
62915               nextStep();
62916           }
62917       }
62918
62919
62920       function clickSquare() {
62921           if (!_houseID) return chapter.restart();
62922           var entity = context.hasEntity(_houseID);
62923           if (!entity) return continueTo(rightClickHouse);
62924
62925           var node = selectMenuItem('orthogonalize').node();
62926           if (!node) { return continueTo(rightClickHouse); }
62927
62928           var wasChanged = false;
62929           var menuCoords = context.map().mouseCoordinates();
62930
62931           revealEditMenu(menuCoords,
62932               t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') })
62933           );
62934
62935           context.on('enter.intro', function(mode) {
62936               if (mode.id === 'browse') {
62937                   continueTo(rightClickHouse);
62938               } else if (mode.id === 'move' || mode.id === 'rotate') {
62939                   continueTo(retryClickSquare);
62940               }
62941           });
62942
62943           context.map().on('move.intro drawn.intro', function() {
62944               var node = selectMenuItem('orthogonalize').node();
62945               if (!wasChanged && !node) { return continueTo(rightClickHouse); }
62946
62947               revealEditMenu(menuCoords,
62948                   t('intro.buildings.square_building', { button: icon('#iD-operation-orthogonalize', 'pre-text') }),
62949                   { duration: 0 }
62950               );
62951           });
62952
62953           context.history().on('change.intro', function() {
62954               wasChanged = true;
62955               context.history().on('change.intro', null);
62956
62957               // Something changed.  Wait for transition to complete and check undo annotation.
62958               timeout(function() {
62959                   if (context.history().undoAnnotation() === t('operations.orthogonalize.annotation.area')) {
62960                       continueTo(doneSquare);
62961                   } else {
62962                       continueTo(retryClickSquare);
62963                   }
62964               }, 500);  // after transitioned actions
62965           });
62966
62967           function continueTo(nextStep) {
62968               context.on('enter.intro', null);
62969               context.map().on('move.intro drawn.intro', null);
62970               context.history().on('change.intro', null);
62971               nextStep();
62972           }
62973       }
62974
62975
62976       function retryClickSquare() {
62977           context.enter(modeBrowse(context));
62978
62979           revealHouse(house, t('intro.buildings.retry_square'), {
62980               buttonText: t('intro.ok'),
62981               buttonCallback: function() { continueTo(rightClickHouse); }
62982           });
62983
62984           function continueTo(nextStep) {
62985               nextStep();
62986           }
62987       }
62988
62989
62990       function doneSquare() {
62991           context.history().checkpoint('doneSquare');
62992
62993           revealHouse(house, t('intro.buildings.done_square'), {
62994               buttonText: t('intro.ok'),
62995               buttonCallback: function() { continueTo(addTank); }
62996           });
62997
62998           function continueTo(nextStep) {
62999               nextStep();
63000           }
63001       }
63002
63003
63004       function addTank() {
63005           context.enter(modeBrowse(context));
63006           context.history().reset('doneSquare');
63007           _tankID = null;
63008
63009           var msec = transitionTime(tank, context.map().center());
63010           if (msec) { reveal(null, null, { duration: 0 }); }
63011           context.map().zoom(19.5).centerEase(tank, msec);
63012
63013           timeout(function() {
63014               reveal('button.add-area',
63015                   t('intro.buildings.add_tank', { button: icon('#iD-icon-area', 'pre-text') })
63016               );
63017
63018               context.on('enter.intro', function(mode) {
63019                   if (mode.id !== 'add-area') return;
63020                   continueTo(startTank);
63021               });
63022           }, msec + 100);
63023
63024           function continueTo(nextStep) {
63025               context.on('enter.intro', null);
63026               nextStep();
63027           }
63028       }
63029
63030
63031       function startTank() {
63032           if (context.mode().id !== 'add-area') {
63033               return continueTo(addTank);
63034           }
63035
63036           _tankID = null;
63037
63038           timeout(function() {
63039               revealTank(tank, t('intro.buildings.start_tank'));
63040
63041               context.map().on('move.intro drawn.intro', function() {
63042                   revealTank(tank, t('intro.buildings.start_tank'), { duration: 0 });
63043               });
63044
63045               context.on('enter.intro', function(mode) {
63046                   if (mode.id !== 'draw-area') return chapter.restart();
63047                   continueTo(continueTank);
63048               });
63049
63050           }, 550);  // after easing
63051
63052           function continueTo(nextStep) {
63053               context.map().on('move.intro drawn.intro', null);
63054               context.on('enter.intro', null);
63055               nextStep();
63056           }
63057       }
63058
63059
63060       function continueTank() {
63061           if (context.mode().id !== 'draw-area') {
63062               return continueTo(addTank);
63063           }
63064
63065           _tankID = null;
63066
63067           revealTank(tank, t('intro.buildings.continue_tank'));
63068
63069           context.map().on('move.intro drawn.intro', function() {
63070               revealTank(tank, t('intro.buildings.continue_tank'), { duration: 0 });
63071           });
63072
63073           context.on('enter.intro', function(mode) {
63074               if (mode.id === 'draw-area') {
63075                   return;
63076               } else if (mode.id === 'select') {
63077                   _tankID = context.selectedIDs()[0];
63078                   return continueTo(searchPresetTank);
63079               } else {
63080                   return continueTo(addTank);
63081               }
63082           });
63083
63084           function continueTo(nextStep) {
63085               context.map().on('move.intro drawn.intro', null);
63086               context.on('enter.intro', null);
63087               nextStep();
63088           }
63089       }
63090
63091
63092       function searchPresetTank() {
63093           if (!_tankID || !context.hasEntity(_tankID)) {
63094               return addTank();
63095           }
63096           var ids = context.selectedIDs();
63097           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
63098               context.enter(modeSelect(context, [_tankID]));
63099           }
63100
63101           // disallow scrolling
63102           select('.inspector-wrap').on('wheel.intro', eventCancel);
63103
63104           timeout(function() {
63105               // reset pane, in case user somehow happened to change it..
63106               select('.inspector-wrap .panewrap').style('right', '-100%');
63107
63108               select('.preset-search-input')
63109                   .on('keydown.intro', null)
63110                   .on('keyup.intro', checkPresetSearch);
63111
63112               reveal('.preset-search-input',
63113                   t('intro.buildings.search_tank', { preset: tankPreset.name() })
63114               );
63115           }, 400);  // after preset list pane visible..
63116
63117           context.on('enter.intro', function(mode) {
63118               if (!_tankID || !context.hasEntity(_tankID)) {
63119                   return continueTo(addTank);
63120               }
63121
63122               var ids = context.selectedIDs();
63123               if (mode.id !== 'select' || !ids.length || ids[0] !== _tankID) {
63124                   // keep the user's area selected..
63125                   context.enter(modeSelect(context, [_tankID]));
63126
63127                   // reset pane, in case user somehow happened to change it..
63128                   select('.inspector-wrap .panewrap').style('right', '-100%');
63129                   // disallow scrolling
63130                   select('.inspector-wrap').on('wheel.intro', eventCancel);
63131
63132                   select('.preset-search-input')
63133                       .on('keydown.intro', null)
63134                       .on('keyup.intro', checkPresetSearch);
63135
63136                   reveal('.preset-search-input',
63137                       t('intro.buildings.search_tank', { preset: tankPreset.name() })
63138                   );
63139
63140                   context.history().on('change.intro', null);
63141               }
63142           });
63143
63144           function checkPresetSearch() {
63145               var first = select('.preset-list-item:first-child');
63146
63147               if (first.classed('preset-man_made-storage_tank')) {
63148                   reveal(first.select('.preset-list-button').node(),
63149                       t('intro.buildings.choose_tank', { preset: tankPreset.name() }),
63150                       { duration: 300 }
63151                   );
63152
63153                   select('.preset-search-input')
63154                       .on('keydown.intro', eventCancel, true)
63155                       .on('keyup.intro', null);
63156
63157                   context.history().on('change.intro', function() {
63158                       continueTo(closeEditorTank);
63159                   });
63160               }
63161           }
63162
63163           function continueTo(nextStep) {
63164               select('.inspector-wrap').on('wheel.intro', null);
63165               context.on('enter.intro', null);
63166               context.history().on('change.intro', null);
63167               select('.preset-search-input').on('keydown.intro keyup.intro', null);
63168               nextStep();
63169           }
63170       }
63171
63172
63173       function closeEditorTank() {
63174           if (!_tankID || !context.hasEntity(_tankID)) {
63175               return addTank();
63176           }
63177           var ids = context.selectedIDs();
63178           if (context.mode().id !== 'select' || !ids.length || ids[0] !== _tankID) {
63179               context.enter(modeSelect(context, [_tankID]));
63180           }
63181
63182           context.history().checkpoint('hasTank');
63183
63184           context.on('exit.intro', function() {
63185               continueTo(rightClickTank);
63186           });
63187
63188           timeout(function() {
63189               reveal('.entity-editor-pane',
63190                   t('intro.buildings.close', { button: icon('#iD-icon-apply', 'pre-text') })
63191               );
63192           }, 500);
63193
63194           function continueTo(nextStep) {
63195               context.on('exit.intro', null);
63196               nextStep();
63197           }
63198       }
63199
63200
63201       function rightClickTank() {
63202           if (!_tankID) return continueTo(addTank);
63203
63204           context.enter(modeBrowse(context));
63205           context.history().reset('hasTank');
63206           context.map().centerEase(tank, 500);
63207
63208           timeout(function() {
63209               context.on('enter.intro', function(mode) {
63210                   if (mode.id !== 'select') return;
63211                   var ids = context.selectedIDs();
63212                   if (ids.length !== 1 || ids[0] !== _tankID) return;
63213
63214                   timeout(function() {
63215                       var node = selectMenuItem('circularize').node();
63216                       if (!node) return;
63217                       continueTo(clickCircle);
63218                   }, 300);  // after menu visible
63219               });
63220
63221               revealTank(tank, t('intro.buildings.rightclick_tank'));
63222
63223               context.map().on('move.intro drawn.intro', function() {
63224                   revealTank(tank, t('intro.buildings.rightclick_tank'), { duration: 0 });
63225               });
63226
63227               context.history().on('change.intro', function() {
63228                   continueTo(rightClickTank);
63229               });
63230
63231           }, 600);
63232
63233           function continueTo(nextStep) {
63234               context.on('enter.intro', null);
63235               context.map().on('move.intro drawn.intro', null);
63236               context.history().on('change.intro', null);
63237               nextStep();
63238           }
63239       }
63240
63241
63242       function clickCircle() {
63243           if (!_tankID) return chapter.restart();
63244           var entity = context.hasEntity(_tankID);
63245           if (!entity) return continueTo(rightClickTank);
63246
63247           var node = selectMenuItem('circularize').node();
63248           if (!node) { return continueTo(rightClickTank); }
63249
63250           var wasChanged = false;
63251           var menuCoords = context.map().mouseCoordinates();
63252
63253           revealEditMenu(menuCoords,
63254               t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') })
63255           );
63256
63257           context.on('enter.intro', function(mode) {
63258               if (mode.id === 'browse') {
63259                   continueTo(rightClickTank);
63260               } else if (mode.id === 'move' || mode.id === 'rotate') {
63261                   continueTo(retryClickCircle);
63262               }
63263           });
63264
63265           context.map().on('move.intro drawn.intro', function() {
63266               var node = selectMenuItem('circularize').node();
63267               if (!wasChanged && !node) { return continueTo(rightClickTank); }
63268
63269               revealEditMenu(menuCoords,
63270                   t('intro.buildings.circle_tank', { button: icon('#iD-operation-circularize', 'pre-text') }),
63271                   { duration: 0 }
63272               );
63273           });
63274
63275           context.history().on('change.intro', function() {
63276               wasChanged = true;
63277               context.history().on('change.intro', null);
63278
63279               // Something changed.  Wait for transition to complete and check undo annotation.
63280               timeout(function() {
63281                   if (context.history().undoAnnotation() === t('operations.circularize.annotation.area')) {
63282                       continueTo(play);
63283                   } else {
63284                       continueTo(retryClickCircle);
63285                   }
63286               }, 500);  // after transitioned actions
63287           });
63288
63289           function continueTo(nextStep) {
63290               context.on('enter.intro', null);
63291               context.map().on('move.intro drawn.intro', null);
63292               context.history().on('change.intro', null);
63293               nextStep();
63294           }
63295       }
63296
63297
63298       function retryClickCircle() {
63299           context.enter(modeBrowse(context));
63300
63301           revealTank(tank, t('intro.buildings.retry_circle'), {
63302               buttonText: t('intro.ok'),
63303               buttonCallback: function() { continueTo(rightClickTank); }
63304           });
63305
63306           function continueTo(nextStep) {
63307               nextStep();
63308           }
63309       }
63310
63311
63312       function play() {
63313           dispatch$$1.call('done');
63314           reveal('#id-container',
63315               t('intro.buildings.play', { next: t('intro.startediting.title') }), {
63316                   tooltipBox: '.intro-nav-wrap .chapter-startEditing',
63317                   buttonText: t('intro.ok'),
63318                   buttonCallback: function() { reveal('#id-container'); }
63319               }
63320           );
63321       }
63322
63323
63324       chapter.enter = function() {
63325           addHouse();
63326       };
63327
63328
63329       chapter.exit = function() {
63330           timeouts.forEach(window.clearTimeout);
63331           context.on('enter.intro exit.intro', null);
63332           context.map().on('move.intro drawn.intro', null);
63333           context.history().on('change.intro', null);
63334           select('.inspector-wrap').on('wheel.intro', null);
63335           select('.preset-search-input').on('keydown.intro keyup.intro', null);
63336           select('.more-fields .combobox-input').on('click.intro', null);
63337       };
63338
63339
63340       chapter.restart = function() {
63341           chapter.exit();
63342           chapter.enter();
63343       };
63344
63345
63346       return utilRebind(chapter, dispatch$$1, 'on');
63347   }
63348
63349   function uiModal(selection$$1, blocking) {
63350       var keybinding = utilKeybinding('modal');
63351       var previous = selection$$1.select('div.modal');
63352       var animate = previous.empty();
63353
63354       previous.transition()
63355           .duration(200)
63356           .style('opacity', 0)
63357           .remove();
63358
63359       var shaded = selection$$1
63360           .append('div')
63361           .attr('class', 'shaded')
63362           .style('opacity', 0);
63363
63364       shaded.close = function() {
63365           shaded
63366               .transition()
63367               .duration(200)
63368               .style('opacity',0)
63369               .remove();
63370
63371           modal
63372               .transition()
63373               .duration(200)
63374               .style('top','0px');
63375
63376           select(document)
63377               .call(keybinding.unbind);
63378       };
63379
63380
63381       var modal = shaded
63382           .append('div')
63383           .attr('class', 'modal fillL col6');
63384
63385       if (!blocking) {
63386           shaded.on('click.remove-modal', function() {
63387               if (event.target === this) {
63388                   shaded.close();
63389               }
63390           });
63391
63392           modal.append('button')
63393               .attr('class', 'close')
63394               .on('click', shaded.close)
63395               .call(svgIcon('#iD-icon-close'));
63396
63397           keybinding
63398               .on('⌫', shaded.close)
63399               .on('⎋', shaded.close);
63400
63401           select(document)
63402               .call(keybinding);
63403       }
63404
63405       modal
63406           .append('div')
63407           .attr('class', 'content');
63408
63409       if (animate) {
63410           shaded.transition().style('opacity', 1);
63411       } else {
63412           shaded.style('opacity', 1);
63413       }
63414
63415
63416       return shaded;
63417   }
63418
63419   function uiIntroStartEditing(context, reveal) {
63420       var dispatch$$1 = dispatch('done', 'startEditing');
63421       var modalSelection = select(null);
63422
63423
63424       var chapter = {
63425           title: 'intro.startediting.title'
63426       };
63427
63428       function showHelp() {
63429           reveal('.map-control.help-control',
63430               t('intro.startediting.help', { button: icon('#iD-icon-help', 'pre-text'), key: t('help.key') }), {
63431                   buttonText: t('intro.ok'),
63432                   buttonCallback: function() { shortcuts(); }
63433               }
63434           );
63435       }
63436
63437       function shortcuts() {
63438           reveal('.map-control.help-control',
63439               t('intro.startediting.shortcuts', { key: t('shortcuts.toggle.key') }), {
63440                   buttonText: t('intro.ok'),
63441                   buttonCallback: function() { showSave(); }
63442               }
63443           );
63444       }
63445
63446       function showSave() {
63447           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
63448           reveal('#bar button.save',
63449               t('intro.startediting.save'), {
63450                   buttonText: t('intro.ok'),
63451                   buttonCallback: function() { showStart(); }
63452               }
63453           );
63454       }
63455
63456       function showStart() {
63457           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
63458
63459           modalSelection = uiModal(context.container());
63460
63461           modalSelection.select('.modal')
63462               .attr('class', 'modal-splash modal col6');
63463
63464           modalSelection.selectAll('.close').remove();
63465
63466           var startbutton = modalSelection.select('.content')
63467               .attr('class', 'fillL')
63468               .append('button')
63469                   .attr('class', 'modal-section huge-modal-button')
63470                   .on('click', function() {
63471                       modalSelection.remove();
63472                   });
63473
63474               startbutton
63475                   .append('svg')
63476                   .attr('class', 'illustration')
63477                   .append('use')
63478                   .attr('xlink:href', '#iD-logo-walkthrough');
63479
63480               startbutton
63481                   .append('h2')
63482                   .text(t('intro.startediting.start'));
63483
63484           dispatch$$1.call('startEditing');
63485       }
63486
63487
63488       chapter.enter = function() {
63489           showHelp();
63490       };
63491
63492
63493       chapter.exit = function() {
63494           modalSelection.remove();
63495           d3_selectAll('.shaded').remove();  // in case user opened keyboard shortcuts
63496       };
63497
63498
63499       return utilRebind(chapter, dispatch$$1, 'on');
63500   }
63501
63502   var chapterUi = {
63503       welcome: uiIntroWelcome,
63504       navigation: uiIntroNavigation,
63505       point: uiIntroPoint,
63506       area: uiIntroArea,
63507       line: uiIntroLine,
63508       building: uiIntroBuilding,
63509       startEditing: uiIntroStartEditing
63510   };
63511
63512   var chapterFlow = [
63513       'welcome',
63514       'navigation',
63515       'point',
63516       'area',
63517       'line',
63518       'building',
63519       'startEditing'
63520   ];
63521
63522
63523   function uiIntro(context) {
63524       var INTRO_IMAGERY = 'EsriWorldImageryClarity';
63525       var introGraph = {};
63526       var _currChapter;
63527
63528       // create entities for intro graph and localize names
63529       for (var id in dataIntroGraph) {
63530           introGraph[id] = osmEntity$$1(localize(dataIntroGraph[id]));
63531       }
63532
63533
63534       function intro(selection$$1) {
63535           context.enter(modeBrowse(context));
63536
63537           // Save current map state
63538           var osm = context.connection();
63539           var history = context.history().toJSON();
63540           var hash = window.location.hash;
63541           var center = context.map().center();
63542           var zoom = context.map().zoom();
63543           var background = context.background().baseLayerSource();
63544           var overlays = context.background().overlayLayerSources();
63545           var opacity = d3_selectAll('#map .layer-background').style('opacity');
63546           var caches = osm && osm.caches();
63547           var baseEntities = context.history().graph().base().entities;
63548           var countryCode = services.geocoder.countryCode;
63549
63550           // Block saving
63551           context.inIntro(true);
63552
63553           // Load semi-real data used in intro
63554           if (osm) { osm.toggle(false).reset(); }
63555           context.history().reset();
63556           context.history().merge(values$1(coreGraph$$1().load(introGraph).entities));
63557           context.history().checkpoint('initial');
63558
63559           // Setup imagery
63560           var imagery = context.background().findSource(INTRO_IMAGERY);
63561           if (imagery) {
63562               context.background().baseLayerSource(imagery);
63563           } else {
63564               context.background().bing();
63565           }
63566           overlays.forEach(function(d) {
63567               context.background().toggleOverlayLayer(d);
63568           });
63569
63570           // Setup data layers (only OSM)
63571           var layers = context.layers();
63572           layers.all().forEach(function(item) {
63573               // if the layer has the function `enabled`
63574               if (typeof item.layer.enabled === 'function') {
63575                   item.layer.enabled(item.id === 'osm');
63576               }
63577           });
63578
63579           // Mock geocoder
63580           services.geocoder.countryCode = function(location, callback) {
63581               callback(null, t('intro.graph.countrycode'));
63582           };
63583
63584           // Disable the sidebar resizing button
63585           d3_selectAll('button.sidebar-toggle').classed('disabled', true);
63586
63587           d3_selectAll('#map .layer-background').style('opacity', 1);
63588
63589           var curtain = uiCurtain();
63590           selection$$1.call(curtain);
63591
63592           // Store that the user started the walkthrough..
63593           context.storage('walkthrough_started', 'yes');
63594
63595           // Restore previous walkthrough progress..
63596           var storedProgress = context.storage('walkthrough_progress') || '';
63597           var progress = storedProgress.split(';').filter(Boolean);
63598
63599           var chapters = chapterFlow.map(function(chapter, i) {
63600               var s = chapterUi[chapter](context, curtain.reveal)
63601                   .on('done', function() {
63602                       context.presets().init();  // clear away "recent" presets
63603
63604                       buttons.filter(function(d) {
63605                           return d.title === s.title;
63606                       }).classed('finished', true);
63607
63608                       if (i < chapterFlow.length - 1) {
63609                           var next = chapterFlow[i + 1];
63610                           select('button.chapter-' + next)
63611                               .classed('next', true);
63612                       }
63613
63614                       // Store walkthrough progress..
63615                       progress.push(chapter);
63616                       context.storage('walkthrough_progress', uniq(progress).join(';'));
63617                   });
63618               return s;
63619           });
63620
63621           chapters[chapters.length - 1].on('startEditing', function() {
63622               // Store walkthrough progress..
63623               progress.push('startEditing');
63624               context.storage('walkthrough_progress', uniq(progress).join(';'));
63625
63626               // Store if walkthrough is completed..
63627               var incomplete = difference(chapterFlow, progress);
63628               if (!incomplete.length) {
63629                   context.storage('walkthrough_completed', 'yes');
63630               }
63631
63632               curtain.remove();
63633               navwrap.remove();
63634               d3_selectAll('#map .layer-background').style('opacity', opacity);
63635               d3_selectAll('button.sidebar-toggle').classed('disabled', false);
63636               if (osm) { osm.toggle(true).reset().caches(caches); }
63637               context.history().reset().merge(values$1(baseEntities));
63638               context.background().baseLayerSource(background);
63639               overlays.forEach(function(d) { context.background().toggleOverlayLayer(d); });
63640               if (history) { context.history().fromJSON(history, false); }
63641               context.map().centerZoom(center, zoom);
63642               window.location.replace(hash);
63643               services.geocoder.countryCode = countryCode;
63644               context.inIntro(false);
63645           });
63646
63647           var navwrap = selection$$1
63648               .append('div')
63649               .attr('class', 'intro-nav-wrap fillD');
63650
63651           navwrap
63652               .append('svg')
63653               .attr('class', 'intro-nav-wrap-logo')
63654               .append('use')
63655               .attr('xlink:href', '#iD-logo-walkthrough');
63656
63657           var buttonwrap = navwrap
63658               .append('div')
63659               .attr('class', 'joined')
63660               .selectAll('button.chapter');
63661
63662           var buttons = buttonwrap
63663               .data(chapters)
63664               .enter()
63665               .append('button')
63666               .attr('class', function(d, i) { return 'chapter chapter-' + chapterFlow[i]; })
63667               .on('click', enterChapter);
63668
63669           buttons
63670               .append('span')
63671               .text(function(d) { return t(d.title); });
63672
63673           buttons
63674               .append('span')
63675               .attr('class', 'status')
63676               .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
63677
63678           enterChapter(chapters[0]);
63679
63680
63681           function enterChapter(newChapter) {
63682               if (_currChapter) { _currChapter.exit(); }
63683               context.enter(modeBrowse(context));
63684
63685               _currChapter = newChapter;
63686               _currChapter.enter();
63687
63688               buttons
63689                   .classed('next', false)
63690                   .classed('active', function(d) {
63691                       return d.title === _currChapter.title;
63692                   });
63693           }
63694       }
63695
63696
63697       return intro;
63698   }
63699
63700   function uiConfirm(selection) {
63701       var modalSelection = uiModal(selection);
63702
63703       modalSelection.select('.modal')
63704           .classed('modal-alert', true);
63705
63706       var section = modalSelection.select('.content');
63707
63708       section.append('div')
63709           .attr('class', 'modal-section header');
63710
63711       section.append('div')
63712           .attr('class', 'modal-section message-text');
63713
63714       var buttons = section.append('div')
63715           .attr('class', 'modal-section buttons cf');
63716
63717
63718       modalSelection.okButton = function() {
63719           buttons
63720               .append('button')
63721               .attr('class', 'button ok-button action')
63722               .on('click.confirm', function() {
63723                   modalSelection.remove();
63724               })
63725               .text(t('confirm.okay'))
63726               .node()
63727               .focus();
63728
63729           return modalSelection;
63730       };
63731
63732
63733       return modalSelection;
63734   }
63735
63736   function uiSettingsCustomData(context) {
63737       var dispatch$$1 = dispatch('change');
63738
63739       function render(selection$$1) {
63740           var dataLayer = context.layers().layer('data');
63741           var _origSettings = {
63742               fileList: (dataLayer && dataLayer.fileList()) || null,
63743               url: context.storage('settings-custom-data-url')
63744           };
63745           var _currSettings = cloneDeep(_origSettings);
63746
63747           // var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
63748           var modal = uiConfirm(selection$$1).okButton();
63749
63750           modal
63751               .classed('settings-modal settings-custom-data', true);
63752
63753           modal.select('.modal-section.header')
63754               .append('h3')
63755               .text(t('settings.custom_data.header'));
63756
63757
63758           var textSection = modal.select('.modal-section.message-text');
63759
63760           textSection
63761               .append('pre')
63762               .attr('class', 'instructions-file')
63763               .text(t('settings.custom_data.file.instructions'));
63764
63765           textSection
63766               .append('input')
63767               .attr('class', 'field-file')
63768               .attr('type', 'file')
63769               .property('files', _currSettings.fileList)  // works for all except IE11
63770               .on('change', function() {
63771                   var files = event.target.files;
63772                   if (files && files.length) {
63773                       _currSettings.url = '';
63774                       textSection.select('.field-url').property('value', '');
63775                       _currSettings.fileList = files;
63776                   } else {
63777                       _currSettings.fileList = null;
63778                   }
63779               });
63780
63781           textSection
63782               .append('h4')
63783               .text(t('settings.custom_data.or'));
63784
63785           textSection
63786               .append('pre')
63787               .attr('class', 'instructions-url')
63788               .text(t('settings.custom_data.url.instructions'));
63789
63790           textSection
63791               .append('textarea')
63792               .attr('class', 'field-url')
63793               .attr('placeholder', t('settings.custom_data.url.placeholder'))
63794               .call(utilNoAuto)
63795               .property('value', _currSettings.url);
63796
63797
63798           // insert a cancel button
63799           var buttonSection = modal.select('.modal-section.buttons');
63800
63801           buttonSection
63802               .insert('button', '.ok-button')
63803               .attr('class', 'button cancel-button secondary-action')
63804               .text(t('confirm.cancel'));
63805
63806
63807           buttonSection.select('.cancel-button')
63808               .on('click.cancel', clickCancel);
63809
63810           buttonSection.select('.ok-button')
63811               .attr('disabled', isSaveDisabled)
63812               .on('click.save', clickSave);
63813
63814
63815           function isSaveDisabled() {
63816               return null;
63817           }
63818
63819
63820           // restore the original url
63821           function clickCancel() {
63822               textSection.select('.field-url').property('value', _origSettings.url);
63823               context.storage('settings-custom-data-url', _origSettings.url);
63824               this.blur();
63825               modal.close();
63826           }
63827
63828           // accept the current url
63829           function clickSave() {
63830               _currSettings.url = textSection.select('.field-url').property('value').trim();
63831
63832               // one or the other but not both
63833               if (_currSettings.url) { _currSettings.fileList = null; }
63834               if (_currSettings.fileList) { _currSettings.url = ''; }
63835
63836               context.storage('settings-custom-data-url', _currSettings.url);
63837               this.blur();
63838               modal.close();
63839               dispatch$$1.call('change', this, _currSettings);
63840           }
63841       }
63842
63843       return utilRebind(render, dispatch$$1, 'on');
63844   }
63845
63846   function uiTooltipHtml(text, key, heading) {
63847       var s = '';
63848
63849       if (heading) {
63850           s += '<div class="tooltip-heading"><span>' + heading + '</span></div>';
63851       }
63852       if (text) {
63853           s += '<div class="tooltip-text"><span>' + text + '</span></div>';
63854       }
63855       if (key) {
63856           s += '<div class="keyhint-wrap"><span>' + t('tooltip_keyhint') + '</span>' +
63857               '<span class="keyhint">' + key + '</span></div>';
63858       }
63859
63860       return s;
63861   }
63862
63863   function uiMapData(context) {
63864       var key = t('map_data.key');
63865       var features = context.features().keys();
63866       var layers = context.layers();
63867       var fills = ['wireframe', 'partial', 'full'];
63868
63869       var settingsCustomData = uiSettingsCustomData(context)
63870           .on('change', customChanged);
63871
63872       var _fillSelected = context.storage('area-fill') || 'partial';
63873       var _shown = false;
63874       var _dataLayerContainer = select(null);
63875       var _fillList = select(null);
63876       var _featureList = select(null);
63877
63878
63879       function showsFeature(d) {
63880           return context.features().enabled(d);
63881       }
63882
63883
63884       function autoHiddenFeature(d) {
63885           return context.features().autoHidden(d);
63886       }
63887
63888
63889       function clickFeature(d) {
63890           context.features().toggle(d);
63891           update();
63892       }
63893
63894
63895       function showsFill(d) {
63896           return _fillSelected === d;
63897       }
63898
63899
63900       function setFill(d) {
63901           fills.forEach(function(opt) {
63902               context.surface().classed('fill-' + opt, Boolean(opt === d));
63903           });
63904
63905           _fillSelected = d;
63906           context.storage('area-fill', d);
63907           if (d !== 'wireframe') {
63908               context.storage('area-fill-toggle', d);
63909           }
63910           update();
63911       }
63912
63913
63914       function showsLayer(which) {
63915           var layer = layers.layer(which);
63916           if (layer) {
63917               return layer.enabled();
63918           }
63919           return false;
63920       }
63921
63922
63923       function setLayer(which, enabled) {
63924           var layer = layers.layer(which);
63925           if (layer) {
63926               layer.enabled(enabled);
63927
63928               if (!enabled && (which === 'osm' || which === 'notes')) {
63929                   context.enter(modeBrowse(context));
63930               }
63931
63932               update();
63933           }
63934       }
63935
63936
63937       function toggleLayer(which) {
63938           setLayer(which, !showsLayer(which));
63939       }
63940
63941
63942       function drawPhotoItems(selection$$1) {
63943           var photoKeys = ['streetside', 'mapillary-images', 'mapillary-signs', 'openstreetcam-images'];
63944           var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; });
63945           var data = photoLayers.filter(function(obj) { return obj.layer.supported(); });
63946
63947           function layerSupported(d) {
63948               return d.layer && d.layer.supported();
63949           }
63950           function layerEnabled(d) {
63951               return layerSupported(d) && d.layer.enabled();
63952           }
63953
63954           var ul = selection$$1
63955               .selectAll('.layer-list-photos')
63956               .data([0]);
63957
63958           ul = ul.enter()
63959               .append('ul')
63960               .attr('class', 'layer-list layer-list-photos')
63961               .merge(ul);
63962
63963           var li = ul.selectAll('.list-item-photos')
63964               .data(data);
63965
63966           li.exit()
63967               .remove();
63968
63969           var liEnter = li.enter()
63970               .append('li')
63971               .attr('class', function(d) { return 'list-item-photos list-item-' + d.id; });
63972
63973           var labelEnter = liEnter
63974               .append('label')
63975               .each(function(d) {
63976                   select(this)
63977                       .call(tooltip()
63978                           .title(t(d.id.replace('-', '_') + '.tooltip'))
63979                           .placement('top')
63980                       );
63981               });
63982
63983           labelEnter
63984               .append('input')
63985               .attr('type', 'checkbox')
63986               .on('change', function(d) { toggleLayer(d.id); });
63987
63988           labelEnter
63989               .append('span')
63990               .text(function(d) { return t(d.id.replace('-', '_') + '.title'); });
63991
63992
63993           // Update
63994           li
63995               .merge(liEnter)
63996               .classed('active', layerEnabled)
63997               .selectAll('input')
63998               .property('checked', layerEnabled);
63999       }
64000
64001
64002       function drawOsmItems(selection$$1) {
64003           var osmKeys = ['osm', 'notes'];
64004           var osmLayers = layers.all().filter(function(obj) { return osmKeys.indexOf(obj.id) !== -1; });
64005
64006           var ul = selection$$1
64007               .selectAll('.layer-list-osm')
64008               .data([0]);
64009
64010           ul = ul.enter()
64011               .append('ul')
64012               .attr('class', 'layer-list layer-list-osm')
64013               .merge(ul);
64014
64015           var li = ul.selectAll('.list-item')
64016               .data(osmLayers);
64017
64018           li.exit()
64019               .remove();
64020
64021           var liEnter = li.enter()
64022               .append('li')
64023               .attr('class', function(d) { return 'list-item list-item-' + d.id; });
64024
64025           var labelEnter = liEnter
64026               .append('label')
64027               .each(function(d) {
64028                   select(this)
64029                       .call(tooltip()
64030                           .title(t('map_data.layers.' + d.id + '.tooltip'))
64031                           .placement('bottom')
64032                       );
64033               });
64034
64035           labelEnter
64036               .append('input')
64037               .attr('type', 'checkbox')
64038               .on('change', function(d) { toggleLayer(d.id); });
64039
64040           labelEnter
64041               .append('span')
64042               .text(function(d) { return t('map_data.layers.' + d.id + '.title'); });
64043
64044
64045           // Update
64046           li
64047               .merge(liEnter)
64048               .classed('active', function (d) { return d.layer.enabled(); })
64049               .selectAll('input')
64050               .property('checked', function (d) { return d.layer.enabled(); });
64051       }
64052
64053
64054       // Beta feature - sample vector layers to support Detroit Mapping Challenge
64055       // https://github.com/osmus/detroit-mapping-challenge
64056       function drawVectorItems(selection$$1) {
64057           var dataLayer = layers.layer('data');
64058           var vtData = [
64059               {
64060                   name: 'Detroit Neighborhoods/Parks',
64061                   src: 'neighborhoods-parks',
64062                   tooltip: 'Neighborhood boundaries and parks as compiled by City of Detroit in concert with community groups.',
64063                   template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmur6x34562qp9iv1u3ksf-54hev,jonahadkins.cjksmqxdx33jj2wp90xd9x2md-4e5y2/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
64064               }, {
64065                   name: 'Detroit Composite POIs',
64066                   src: 'composite-poi',
64067                   tooltip: 'Fire Inspections, Business Licenses, and other public location data collated from the City of Detroit.',
64068                   template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmm6a02sli31myxhsr7zf3-2sw8h/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
64069               }, {
64070                   name: 'Detroit All-The-Places POIs',
64071                   src: 'alltheplaces-poi',
64072                   tooltip: 'Public domain business location data created by web scrapers.',
64073                   template: 'https://{switch:a,b,c,d}.tiles.mapbox.com/v4/jonahadkins.cjksmswgk340g2vo06p1w9w0j-8fjjc/{z}/{x}/{y}.vector.pbf?access_token=pk.eyJ1Ijoiam9uYWhhZGtpbnMiLCJhIjoiRlVVVkx3VSJ9.9sdVEK_B_VkEXPjssU5MqA'
64074               }
64075           ];
64076
64077           // Only show this if the map is around Detroit..
64078           var detroit = geoExtent$$1([-83.5, 42.1], [-82.8, 42.5]);
64079           var showVectorItems = (context.map().zoom() > 9 && detroit.contains(context.map().center()));
64080
64081           var container = selection$$1.selectAll('.vectortile-container')
64082               .data(showVectorItems ? [0] : []);
64083
64084           container.exit()
64085               .remove();
64086
64087           var containerEnter = container.enter()
64088               .append('div')
64089               .attr('class', 'vectortile-container');
64090
64091           containerEnter
64092               .append('h4')
64093               .attr('class', 'vectortile-header')
64094               .text('Detroit Vector Tiles (Beta)');
64095
64096           containerEnter
64097               .append('ul')
64098               .attr('class', 'layer-list layer-list-vectortile');
64099
64100           containerEnter
64101               .append('div')
64102               .attr('class', 'vectortile-footer')
64103               .append('a')
64104               .attr('target', '_blank')
64105               .attr('tabindex', -1)
64106               .call(svgIcon('#iD-icon-out-link', 'inline'))
64107               .attr('href', 'https://github.com/osmus/detroit-mapping-challenge')
64108               .append('span')
64109               .text('About these layers');
64110
64111           container = container
64112               .merge(containerEnter);
64113
64114
64115           var ul = container.selectAll('.layer-list-vectortile');
64116
64117           var li = ul.selectAll('.list-item')
64118               .data(vtData);
64119
64120           li.exit()
64121               .remove();
64122
64123           var liEnter = li.enter()
64124               .append('li')
64125               .attr('class', function(d) { return 'list-item list-item-' + d.src; });
64126
64127           var labelEnter = liEnter
64128               .append('label')
64129               .each(function(d) {
64130                   select(this).call(
64131                       tooltip().title(d.tooltip).placement('top')
64132                   );
64133               });
64134
64135           labelEnter
64136               .append('input')
64137               .attr('type', 'radio')
64138               .attr('name', 'vectortile')
64139               .on('change', selectVTLayer);
64140
64141           labelEnter
64142               .append('span')
64143               .text(function(d) { return d.name; });
64144
64145           // Update
64146           li
64147               .merge(liEnter)
64148               .classed('active', isVTLayerSelected)
64149               .selectAll('input')
64150               .property('checked', isVTLayerSelected);
64151
64152
64153           function isVTLayerSelected(d) {
64154               return dataLayer && dataLayer.template() === d.template;
64155           }
64156
64157           function selectVTLayer(d) {
64158               context.storage('settings-custom-data-url', d.template);
64159               if (dataLayer) {
64160                   dataLayer.template(d.template, d.src);
64161                   dataLayer.enabled(true);
64162               }
64163           }
64164       }
64165
64166
64167       function drawCustomDataItems(selection$$1) {
64168           var dataLayer = layers.layer('data');
64169           var hasData = dataLayer && dataLayer.hasData();
64170           var showsData = hasData && dataLayer.enabled();
64171
64172           var ul = selection$$1
64173               .selectAll('.layer-list-data')
64174               .data(dataLayer ? [0] : []);
64175
64176           // Exit
64177           ul.exit()
64178               .remove();
64179
64180           // Enter
64181           var ulEnter = ul.enter()
64182               .append('ul')
64183               .attr('class', 'layer-list layer-list-data');
64184
64185           var liEnter = ulEnter
64186               .append('li')
64187               .attr('class', 'list-item-data');
64188
64189           liEnter
64190               .append('button')
64191               .call(tooltip()
64192                   .title(t('settings.custom_data.tooltip'))
64193                   .placement((textDirection === 'rtl') ? 'right' : 'left')
64194               )
64195               .on('click', editCustom)
64196               .call(svgIcon('#iD-icon-more'));
64197
64198           liEnter
64199               .append('button')
64200               .call(tooltip()
64201                   .title(t('map_data.layers.custom.zoom'))
64202                   .placement((textDirection === 'rtl') ? 'right' : 'left')
64203               )
64204               .on('click', function() {
64205                   event.preventDefault();
64206                   event.stopPropagation();
64207                   dataLayer.fitZoom();
64208               })
64209               .call(svgIcon('#iD-icon-search'));
64210
64211           var labelEnter = liEnter
64212               .append('label')
64213               .call(tooltip()
64214                   .title(t('map_data.layers.custom.tooltip'))
64215                   .placement('top')
64216               );
64217
64218           labelEnter
64219               .append('input')
64220               .attr('type', 'checkbox')
64221               .on('change', function() { toggleLayer('data'); });
64222
64223           labelEnter
64224               .append('span')
64225               .text(t('map_data.layers.custom.title'));
64226
64227           // Update
64228           ul = ul
64229               .merge(ulEnter);
64230
64231           ul.selectAll('.list-item-data')
64232               .classed('active', showsData)
64233               .selectAll('label')
64234               .classed('deemphasize', !hasData)
64235               .selectAll('input')
64236               .property('disabled', !hasData)
64237               .property('checked', showsData);
64238       }
64239
64240
64241       function editCustom() {
64242           event.preventDefault();
64243           context.container()
64244               .call(settingsCustomData);
64245       }
64246
64247
64248       function customChanged(d) {
64249           var dataLayer = layers.layer('data');
64250
64251           if (d && d.url) {
64252               dataLayer.url(d.url);
64253           } else if (d && d.fileList) {
64254               dataLayer.fileList(d.fileList);
64255           }
64256       }
64257
64258
64259       function drawListItems(selection$$1, data, type, name, change, active) {
64260           var items = selection$$1.selectAll('li')
64261               .data(data);
64262
64263           // Exit
64264           items.exit()
64265               .remove();
64266
64267           // Enter
64268           var enter = items.enter()
64269               .append('li')
64270               .attr('class', 'layer')
64271               .call(tooltip()
64272                   .html(true)
64273                   .title(function(d) {
64274                       var tip = t(name + '.' + d + '.tooltip'),
64275                           key = (d === 'wireframe' ? t('area_fill.wireframe.key') : null);
64276
64277                       if (name === 'feature' && autoHiddenFeature(d)) {
64278                           var msg = showsLayer('osm') ? t('map_data.autohidden') : t('map_data.osmhidden');
64279                           tip += '<div>' + msg + '</div>';
64280                       }
64281                       return uiTooltipHtml(tip, key);
64282                   })
64283                   .placement('top')
64284               );
64285
64286           var label = enter
64287               .append('label');
64288
64289           label
64290               .append('input')
64291               .attr('type', type)
64292               .attr('name', name)
64293               .on('change', change);
64294
64295           label
64296               .append('span')
64297               .text(function(d) { return t(name + '.' + d + '.description'); });
64298
64299           // Update
64300           items = items
64301               .merge(enter);
64302
64303           items
64304               .classed('active', active)
64305               .selectAll('input')
64306               .property('checked', active)
64307               .property('indeterminate', function(d) {
64308                   return (name === 'feature' && autoHiddenFeature(d));
64309               });
64310       }
64311
64312
64313       function renderDataLayers(selection$$1) {
64314           var container = selection$$1.selectAll('data-layer-container')
64315               .data([0]);
64316
64317           _dataLayerContainer = container.enter()
64318               .append('div')
64319               .attr('class', 'data-layer-container')
64320               .merge(container);
64321       }
64322
64323
64324       function renderFillList(selection$$1) {
64325           var container = selection$$1.selectAll('layer-fill-list')
64326               .data([0]);
64327
64328           _fillList = container.enter()
64329               .append('ul')
64330               .attr('class', 'layer-list layer-fill-list')
64331               .merge(container);
64332       }
64333
64334
64335       function renderFeatureList(selection$$1) {
64336           var container = selection$$1.selectAll('layer-feature-list')
64337               .data([0]);
64338
64339           _featureList = container.enter()
64340               .append('ul')
64341               .attr('class', 'layer-list layer-feature-list')
64342               .merge(container);
64343       }
64344
64345
64346       function update() {
64347           _dataLayerContainer
64348               .call(drawOsmItems)
64349               .call(drawPhotoItems)
64350               .call(drawCustomDataItems)
64351               .call(drawVectorItems);      // Beta - Detroit mapping challenge
64352
64353           _fillList
64354               .call(drawListItems, fills, 'radio', 'area_fill', setFill, showsFill);
64355
64356           _featureList
64357               .call(drawListItems, features, 'checkbox', 'feature', clickFeature, showsFeature);
64358       }
64359
64360
64361       function toggleWireframe() {
64362           if (event) {
64363               event.preventDefault();
64364               event.stopPropagation();
64365           }
64366
64367           if (_fillSelected === 'wireframe') {
64368               _fillSelected = context.storage('area-fill-toggle') || 'partial';
64369           } else {
64370               _fillSelected = 'wireframe';
64371           }
64372
64373           setFill(_fillSelected);
64374           context.map().pan([0,0]);  // trigger a redraw
64375       }
64376
64377
64378       function mapData(selection$$1) {
64379
64380           function hidePane() {
64381               setVisible(false);
64382           }
64383
64384           function togglePane() {
64385               if (event) event.preventDefault();
64386               paneTooltip.hide(button);
64387               setVisible(!button.classed('active'));
64388           }
64389
64390           function setVisible(show) {
64391               if (show !== _shown) {
64392                   button.classed('active', show);
64393                   _shown = show;
64394
64395                   if (show) {
64396                       uiBackground.hidePane();
64397                       uiHelp.hidePane();
64398                       update();
64399
64400                       pane
64401                           .style('display', 'block')
64402                           .style('right', '-300px')
64403                           .transition()
64404                           .duration(200)
64405                           .style('right', '0px');
64406
64407                   } else {
64408                       pane
64409                           .style('display', 'block')
64410                           .style('right', '0px')
64411                           .transition()
64412                           .duration(200)
64413                           .style('right', '-300px')
64414                           .on('end', function() {
64415                               select(this).style('display', 'none');
64416                           });
64417                   }
64418               }
64419           }
64420
64421
64422           var pane = selection$$1
64423               .append('div')
64424               .attr('class', 'fillL map-pane hide');
64425
64426           var paneTooltip = tooltip()
64427               .placement((textDirection === 'rtl') ? 'right' : 'left')
64428               .html(true)
64429               .title(uiTooltipHtml(t('map_data.description'), key));
64430
64431           var button = selection$$1
64432               .append('button')
64433               .attr('tabindex', -1)
64434               .on('click', togglePane)
64435               .call(svgIcon('#iD-icon-data', 'light'))
64436               .call(paneTooltip);
64437
64438
64439           var heading = pane
64440               .append('div')
64441               .attr('class', 'pane-heading');
64442
64443           heading
64444               .append('h2')
64445               .text(t('map_data.title'));
64446
64447           heading
64448               .append('button')
64449               .on('click', function() { uiMapData.hidePane(); })
64450               .call(svgIcon('#iD-icon-close'));
64451
64452
64453           var content = pane
64454               .append('div')
64455               .attr('class', 'pane-content');
64456
64457           // data layers
64458           content
64459               .append('div')
64460               .attr('class', 'map-data-data-layers')
64461               .call(uiDisclosure(context, 'data_layers', true)
64462                   .title(t('map_data.data_layers'))
64463                   .content(renderDataLayers)
64464               );
64465
64466           // area fills
64467           content
64468               .append('div')
64469               .attr('class', 'map-data-area-fills')
64470               .call(uiDisclosure(context, 'fill_area', false)
64471                   .title(t('map_data.fill_area'))
64472                   .content(renderFillList)
64473               );
64474
64475           // feature filters
64476           content
64477               .append('div')
64478               .attr('class', 'map-data-feature-filters')
64479               .call(uiDisclosure(context, 'map_features', false)
64480                   .title(t('map_data.map_features'))
64481                   .content(renderFeatureList)
64482               );
64483
64484
64485           // add listeners
64486           context.features()
64487               .on('change.map_data-update', update);
64488
64489           update();
64490           setFill(_fillSelected);
64491
64492           context.keybinding()
64493               .on(key, togglePane)
64494               .on(t('area_fill.wireframe.key'), toggleWireframe);
64495
64496           uiMapData.hidePane = hidePane;
64497           uiMapData.togglePane = togglePane;
64498           uiMapData.setVisible = setVisible;
64499       }
64500
64501       return mapData;
64502   }
64503
64504   function uiShortcuts(context) {
64505       var detected = utilDetect();
64506       var _activeTab = 0;
64507       var _modalSelection;
64508       var _selection = select(null);
64509
64510
64511       context.keybinding()
64512           .on(t('shortcuts.toggle.key'), function () {
64513               if (d3_selectAll('.modal-shortcuts').size()) {  // already showing
64514                   if (_modalSelection) {
64515                       _modalSelection.close();
64516                       _modalSelection = null;
64517                   }
64518               } else {
64519                   _modalSelection = uiModal(_selection);
64520                   shortcutsModal(_modalSelection);
64521               }
64522           });
64523
64524
64525       function shortcutsModal(_modalSelection) {
64526           _modalSelection.select('.modal')
64527               .classed('modal-shortcuts', true);
64528
64529           var shortcutsModal = _modalSelection.select('.content');
64530
64531           shortcutsModal
64532               .append('div')
64533               .attr('class', 'modal-section')
64534               .append('h3')
64535               .text(t('shortcuts.title'));
64536
64537           shortcutsModal
64538               .call(render);
64539       }
64540
64541
64542       function render(selection$$1) {
64543           var wrapper = selection$$1
64544               .selectAll('.wrapper')
64545               .data([0]);
64546
64547           var wrapperEnter = wrapper
64548               .enter()
64549               .append('div')
64550               .attr('class', 'wrapper modal-section');
64551
64552           var tabsBar = wrapperEnter
64553               .append('div')
64554               .attr('class', 'tabs-bar');
64555
64556           var shortcutsList = wrapperEnter
64557               .append('div')
64558               .attr('class', 'shortcuts-list');
64559
64560           wrapper = wrapper.merge(wrapperEnter);
64561
64562           var tabs = tabsBar
64563               .selectAll('.tab')
64564               .data(dataShortcuts);
64565
64566           var tabsEnter = tabs
64567               .enter()
64568               .append('div')
64569               .attr('class', 'tab')
64570               .on('click', function (d, i) {
64571                   _activeTab = i;
64572                   render(selection$$1);
64573               });
64574
64575           tabsEnter
64576               .append('span')
64577               .text(function (d) { return t(d.text); });
64578
64579           tabs = tabs
64580               .merge(tabsEnter);
64581
64582           // Update
64583           wrapper.selectAll('.tab')
64584               .classed('active', function (d, i) {
64585                   return i === _activeTab;
64586               });
64587
64588
64589           var shortcuts = shortcutsList
64590               .selectAll('.shortcut-tab')
64591               .data(dataShortcuts);
64592
64593           var shortcutsEnter = shortcuts
64594               .enter()
64595               .append('div')
64596               .attr('class', function(d) { return 'shortcut-tab shortcut-tab-' + d.tab; });
64597
64598           var columnsEnter = shortcutsEnter
64599               .selectAll('.shortcut-column')
64600               .data(function (d) { return d.columns; })
64601               .enter()
64602               .append('table')
64603               .attr('class', 'shortcut-column');
64604
64605           var rowsEnter = columnsEnter
64606               .selectAll('.shortcut-row')
64607               .data(function (d) { return d.rows; })
64608               .enter()
64609               .append('tr')
64610               .attr('class', 'shortcut-row');
64611
64612
64613           var sectionRows = rowsEnter
64614               .filter(function (d) { return !d.shortcuts; });
64615
64616           sectionRows
64617               .append('td');
64618
64619           sectionRows
64620               .append('td')
64621               .attr('class', 'shortcut-section')
64622               .append('h3')
64623               .text(function (d) { return t(d.text); });
64624
64625
64626           var shortcutRows = rowsEnter
64627               .filter(function (d) { return d.shortcuts; });
64628
64629           var shortcutKeys = shortcutRows
64630               .append('td')
64631               .attr('class', 'shortcut-keys');
64632
64633           var modifierKeys = shortcutKeys
64634               .filter(function (d) { return d.modifiers; });
64635
64636           modifierKeys
64637               .selectAll('kbd.modifier')
64638               .data(function (d) {
64639                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
64640                       return ['⌘'];
64641                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
64642                       return [];
64643                   } else {
64644                       return d.modifiers;
64645                   }
64646               })
64647               .enter()
64648               .each(function () {
64649                   var selection$$1 = select(this);
64650
64651                   selection$$1
64652                       .append('kbd')
64653                       .attr('class', 'modifier')
64654                       .text(function (d) { return uiCmd.display(d); });
64655
64656                   selection$$1
64657                       .append('span')
64658                       .text('+');
64659               });
64660
64661
64662           shortcutKeys
64663               .selectAll('kbd.shortcut')
64664               .data(function (d) {
64665                   var arr = d.shortcuts;
64666                   if (detected.os === 'win' && d.text === 'shortcuts.editing.commands.redo') {
64667                       arr = ['Y'];
64668                   } else if (detected.os !== 'mac' && d.text === 'shortcuts.browsing.display_options.fullscreen') {
64669                       arr = ['F11'];
64670                   }
64671
64672                   return arr.map(function(s) {
64673                       return {
64674                           shortcut: s,
64675                           separator: d.separator
64676                       };
64677                   });
64678               })
64679               .enter()
64680               .each(function (d, i, nodes) {
64681                   var selection$$1 = select(this);
64682                   var click = d.shortcut.toLowerCase().match(/(.*).click/);
64683
64684                   if (click && click[1]) {
64685                       selection$$1
64686                           .call(svgIcon('#iD-walkthrough-mouse', 'mouseclick', click[1]));
64687                   } else {
64688                       selection$$1
64689                           .append('kbd')
64690                           .attr('class', 'shortcut')
64691                           .text(function (d) {
64692                               var key = d.shortcut;
64693                               return key.indexOf('.') !== -1 ? uiCmd.display(t(key)) : uiCmd.display(key);
64694                           });
64695                   }
64696
64697                   if (i < nodes.length - 1) {
64698                       selection$$1
64699                           .append('span')
64700                           .text(d.separator || '\u00a0' + t('shortcuts.or') + '\u00a0');
64701                   }
64702               });
64703
64704
64705           shortcutKeys
64706               .filter(function(d) { return d.gesture; })
64707               .each(function () {
64708                   var selection$$1 = select(this);
64709
64710                   selection$$1
64711                       .append('span')
64712                       .text('+');
64713
64714                   selection$$1
64715                       .append('span')
64716                       .attr('class', 'gesture')
64717                       .text(function (d) { return t(d.gesture); });
64718               });
64719
64720
64721           shortcutRows
64722               .append('td')
64723               .attr('class', 'shortcut-desc')
64724               .text(function (d) { return d.text ? t(d.text) : '\u00a0'; });
64725
64726
64727           shortcuts = shortcuts
64728               .merge(shortcutsEnter);
64729
64730           // Update
64731           wrapper.selectAll('.shortcut-tab')
64732               .style('display', function (d, i) {
64733                   return i === _activeTab ? 'flex' : 'none';
64734               });
64735       }
64736
64737
64738       return function(selection$$1, show) {
64739           _selection = selection$$1;
64740           if (show) {
64741               _modalSelection = uiModal(selection$$1);
64742               shortcutsModal(_modalSelection);
64743           }
64744       };
64745   }
64746
64747   function uiHelp(context) {
64748       var key = t('help.key');
64749
64750       var docKeys = [
64751           ['help', [
64752               'welcome',
64753               'open_data_h',
64754               'open_data',
64755               'before_start_h',
64756               'before_start',
64757               'open_source_h',
64758               'open_source',
64759               'open_source_help'
64760           ]],
64761           ['overview', [
64762               'navigation_h',
64763               'navigation_drag',
64764               'navigation_zoom',
64765               'features_h',
64766               'features',
64767               'nodes_ways'
64768           ]],
64769           ['editing', [
64770               'select_h',
64771               'select_left_click',
64772               'select_right_click',
64773               'multiselect_h',
64774               'multiselect_shift_click',
64775               'multiselect_lasso',
64776               'undo_redo_h',
64777               'undo_redo',
64778               'save_h',
64779               'save',
64780               'save_validation',
64781               'upload_h',
64782               'upload',
64783               'backups_h',
64784               'backups',
64785               'keyboard_h',
64786               'keyboard'
64787           ]],
64788           ['feature_editor', [
64789               'intro',
64790               'definitions',
64791               'type_h',
64792               'type',
64793               'type_picker',
64794               'fields_h',
64795               'fields_all_fields',
64796               'fields_example',
64797               'fields_add_field',
64798               'tags_h',
64799               'tags_all_tags',
64800               'tags_resources'
64801           ]],
64802           ['points', [
64803               'intro',
64804               'add_point_h',
64805               'add_point',
64806               'add_point_finish',
64807               'move_point_h',
64808               'move_point',
64809               'delete_point_h',
64810               'delete_point',
64811               'delete_point_command'
64812           ]],
64813           ['lines', [
64814               'intro',
64815               'add_line_h',
64816               'add_line',
64817               'add_line_draw',
64818               'add_line_finish',
64819               'modify_line_h',
64820               'modify_line_dragnode',
64821               'modify_line_addnode',
64822               'connect_line_h',
64823               'connect_line',
64824               'connect_line_display',
64825               'connect_line_drag',
64826               'connect_line_tag',
64827               'disconnect_line_h',
64828               'disconnect_line_command',
64829               'move_line_h',
64830               'move_line_command',
64831               'move_line_connected',
64832               'delete_line_h',
64833               'delete_line',
64834               'delete_line_command'
64835           ]],
64836           ['areas', [
64837               'intro',
64838               'point_or_area_h',
64839               'point_or_area',
64840               'add_area_h',
64841               'add_area_command',
64842               'add_area_draw',
64843               'add_area_finish',
64844               'square_area_h',
64845               'square_area_command',
64846               'modify_area_h',
64847               'modify_area_dragnode',
64848               'modify_area_addnode',
64849               'delete_area_h',
64850               'delete_area',
64851               'delete_area_command'
64852           ]],
64853           ['relations', [
64854               'intro',
64855               'edit_relation_h',
64856               'edit_relation',
64857               'edit_relation_add',
64858               'edit_relation_delete',
64859               'maintain_relation_h',
64860               'maintain_relation',
64861               'relation_types_h',
64862               'multipolygon_h',
64863               'multipolygon',
64864               'multipolygon_create',
64865               'multipolygon_merge',
64866               'turn_restriction_h',
64867               'turn_restriction',
64868               'turn_restriction_field',
64869               'turn_restriction_editing',
64870               'route_h',
64871               'route',
64872               'route_add',
64873               'boundary_h',
64874               'boundary',
64875               'boundary_add'
64876           ]],
64877           ['notes', [
64878               'intro',
64879               'add_note_h',
64880               'add_note',
64881               'move_note',
64882               'update_note_h',
64883               'update_note',
64884               'save_note_h',
64885               'save_note'
64886           ]],
64887
64888           ['imagery', [
64889               'intro',
64890               'sources_h',
64891               'choosing',
64892               'sources',
64893               'offsets_h',
64894               'offset',
64895               'offset_change'
64896           ]],
64897           ['streetlevel', [
64898               'intro',
64899               'using_h',
64900               'using',
64901               'photos',
64902               'viewer'
64903           ]],
64904           ['gps', [
64905               'intro',
64906               'survey',
64907               'using_h',
64908               'using',
64909               'tracing',
64910               'upload'
64911           ]]
64912       ];
64913
64914       var headings = {
64915           'help.help.open_data_h': 3,
64916           'help.help.before_start_h': 3,
64917           'help.help.open_source_h': 3,
64918           'help.overview.navigation_h': 3,
64919           'help.overview.features_h': 3,
64920           'help.editing.select_h': 3,
64921           'help.editing.multiselect_h': 3,
64922           'help.editing.undo_redo_h': 3,
64923           'help.editing.save_h': 3,
64924           'help.editing.upload_h': 3,
64925           'help.editing.backups_h': 3,
64926           'help.editing.keyboard_h': 3,
64927           'help.feature_editor.type_h': 3,
64928           'help.feature_editor.fields_h': 3,
64929           'help.feature_editor.tags_h': 3,
64930           'help.points.add_point_h': 3,
64931           'help.points.move_point_h': 3,
64932           'help.points.delete_point_h': 3,
64933           'help.lines.add_line_h': 3,
64934           'help.lines.modify_line_h': 3,
64935           'help.lines.connect_line_h': 3,
64936           'help.lines.disconnect_line_h': 3,
64937           'help.lines.move_line_h': 3,
64938           'help.lines.delete_line_h': 3,
64939           'help.areas.point_or_area_h': 3,
64940           'help.areas.add_area_h': 3,
64941           'help.areas.square_area_h': 3,
64942           'help.areas.modify_area_h': 3,
64943           'help.areas.delete_area_h': 3,
64944           'help.relations.edit_relation_h': 3,
64945           'help.relations.maintain_relation_h': 3,
64946           'help.relations.relation_types_h': 2,
64947           'help.relations.multipolygon_h': 3,
64948           'help.relations.turn_restriction_h': 3,
64949           'help.relations.route_h': 3,
64950           'help.relations.boundary_h': 3,
64951           'help.notes.add_note_h': 3,
64952           'help.notes.update_note_h': 3,
64953           'help.notes.save_note_h': 3,
64954           'help.imagery.sources_h': 3,
64955           'help.imagery.offsets_h': 3,
64956           'help.streetlevel.using_h': 3,
64957           'help.gps.using_h': 3,
64958       };
64959
64960       var replacements = {
64961           point: icon('#iD-icon-point', 'pre-text'),
64962           line: icon('#iD-icon-line', 'pre-text'),
64963           area: icon('#iD-icon-area', 'pre-text'),
64964           note: icon('#iD-icon-note', 'pre-text add-note'),
64965           plus: icon('#iD-icon-plus', 'pre-text'),
64966           minus: icon('#iD-icon-minus', 'pre-text'),
64967           orthogonalize: icon('#iD-operation-orthogonalize', 'pre-text'),
64968           disconnect: icon('#iD-operation-disconnect', 'pre-text'),
64969           layers: icon('#iD-icon-layers', 'pre-text'),
64970           data: icon('#iD-icon-data', 'pre-text'),
64971           inspect: icon('#iD-icon-inspect', 'pre-text'),
64972           move: icon('#iD-operation-move', 'pre-text'),
64973           merge: icon('#iD-operation-merge', 'pre-text'),
64974           delete: icon('#iD-operation-delete', 'pre-text'),
64975           close: icon('#iD-icon-close', 'pre-text'),
64976           undo: icon(textDirection === 'rtl' ? '#iD-icon-redo' : '#iD-icon-undo', 'pre-text'),
64977           redo: icon(textDirection === 'rtl' ? '#iD-icon-undo' : '#iD-icon-redo', 'pre-text'),
64978           save: icon('#iD-icon-save', 'pre-text'),
64979           leftclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'left'),
64980           rightclick: icon('#iD-walkthrough-mouse', 'pre-text mouseclick', 'right'),
64981           shift: uiCmd.display('⇧'),
64982           alt: uiCmd.display('⌥'),
64983           return: uiCmd.display('↵'),
64984           version: context.version
64985       };
64986
64987       // For each section, squash all the texts into a single markdown document
64988       var docs = docKeys.map(function(key) {
64989           var helpkey = 'help.' + key[0];
64990           var text = key[1].reduce(function(all, part) {
64991               var subkey = helpkey + '.' + part;
64992               var depth = headings[subkey];                              // is this subkey a heading?
64993               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
64994               return all + hhh + t(subkey, replacements) + '\n\n';
64995           }, '');
64996
64997           return {
64998               title: t(helpkey + '.title'),
64999               html: marked(text.trim())
65000           };
65001       });
65002
65003
65004       function help(selection$$1) {
65005
65006           function hidePane() {
65007               setVisible(false);
65008           }
65009
65010
65011           function togglePane() {
65012               if (event) event.preventDefault();
65013               tooltipBehavior.hide(button);
65014               setVisible(!button.classed('active'));
65015           }
65016
65017
65018           function setVisible(show) {
65019               if (show !== shown) {
65020                   button.classed('active', show);
65021                   shown = show;
65022
65023                   if (show) {
65024                       uiBackground.hidePane();
65025                       uiMapData.hidePane();
65026
65027                       pane.style('display', 'block')
65028                           .style('right', '-500px')
65029                           .transition()
65030                           .duration(200)
65031                           .style('right', '0px');
65032
65033                   } else {
65034                       pane.style('right', '0px')
65035                           .transition()
65036                           .duration(200)
65037                           .style('right', '-500px')
65038                           .on('end', function() {
65039                               select(this).style('display', 'none');
65040                           });
65041                   }
65042               }
65043           }
65044
65045
65046           function clickHelp(d, i) {
65047               var rtl = (textDirection === 'rtl');
65048               content.property('scrollTop', 0);
65049               doctitle.html(d.title);
65050
65051               body.html(d.html);
65052               body.selectAll('a')
65053                   .attr('target', '_blank');
65054               menuItems.classed('selected', function(m) {
65055                   return m.title === d.title;
65056               });
65057
65058               nav.html('');
65059               if (rtl) {
65060                   nav.call(drawNext).call(drawPrevious);
65061               } else {
65062                   nav.call(drawPrevious).call(drawNext);
65063               }
65064
65065
65066               function drawNext(selection$$1) {
65067                   if (i < docs.length - 1) {
65068                       var nextLink = selection$$1
65069                           .append('a')
65070                           .attr('class', 'next')
65071                           .on('click', function() {
65072                               clickHelp(docs[i + 1], i + 1);
65073                           });
65074
65075                       nextLink
65076                           .append('span')
65077                           .text(docs[i + 1].title)
65078                           .call(svgIcon((rtl ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'));
65079                   }
65080               }
65081
65082
65083               function drawPrevious(selection$$1) {
65084                   if (i > 0) {
65085                       var prevLink = selection$$1
65086                           .append('a')
65087                           .attr('class', 'previous')
65088                           .on('click', function() {
65089                               clickHelp(docs[i - 1], i - 1);
65090                           });
65091
65092                       prevLink
65093                           .call(svgIcon((rtl ? '#iD-icon-forward' : '#iD-icon-backward'), 'inline'))
65094                           .append('span')
65095                           .text(docs[i - 1].title);
65096                   }
65097               }
65098           }
65099
65100
65101           function clickWalkthrough() {
65102               if (context.inIntro()) return;
65103               context.container().call(uiIntro(context));
65104               setVisible(false);
65105           }
65106
65107
65108           function clickShortcuts() {
65109               context.container().call(uiShortcuts(context), true);
65110           }
65111
65112
65113           var pane = selection$$1.append('div')
65114               .attr('class', 'help-wrap map-pane fillL hide');
65115
65116           var tooltipBehavior = tooltip()
65117               .placement((textDirection === 'rtl') ? 'right' : 'left')
65118               .html(true)
65119               .title(uiTooltipHtml(t('help.title'), key));
65120
65121           var button = selection$$1.append('button')
65122               .attr('tabindex', -1)
65123               .on('click', togglePane)
65124               .call(svgIcon('#iD-icon-help', 'light'))
65125               .call(tooltipBehavior);
65126
65127           var shown = false;
65128
65129
65130           var heading = pane
65131               .append('div')
65132               .attr('class', 'pane-heading');
65133
65134           var doctitle = heading
65135               .append('h2')
65136               .text(t('help.title'));
65137
65138           heading
65139               .append('button')
65140               .on('click', function() { uiHelp.hidePane(); })
65141               .call(svgIcon('#iD-icon-close'));
65142
65143
65144           var content = pane
65145               .append('div')
65146               .attr('class', 'pane-content');
65147
65148           var toc = content
65149               .append('ul')
65150               .attr('class', 'toc');
65151
65152           var menuItems = toc.selectAll('li')
65153               .data(docs)
65154               .enter()
65155               .append('li')
65156               .append('a')
65157               .html(function(d) { return d.title; })
65158               .on('click', clickHelp);
65159
65160           var shortcuts = toc
65161               .append('li')
65162               .attr('class', 'shortcuts')
65163               .call(tooltip()
65164                   .html(true)
65165                   .title(uiTooltipHtml(t('shortcuts.tooltip'), '?'))
65166                   .placement('top')
65167               )
65168               .append('a')
65169               .on('click', clickShortcuts);
65170
65171           shortcuts
65172               .append('div')
65173               .text(t('shortcuts.title'));
65174
65175           var walkthrough = toc
65176               .append('li')
65177               .attr('class', 'walkthrough')
65178               .append('a')
65179               .on('click', clickWalkthrough);
65180
65181           walkthrough
65182               .append('svg')
65183               .attr('class', 'logo logo-walkthrough')
65184               .append('use')
65185               .attr('xlink:href', '#iD-logo-walkthrough');
65186
65187           walkthrough
65188               .append('div')
65189               .text(t('splash.walkthrough'));
65190
65191
65192           var helpContent = content
65193               .append('div')
65194               .attr('class', 'left-content');
65195
65196           var body = helpContent
65197               .append('div')
65198               .attr('class', 'body');
65199
65200           var nav = helpContent
65201               .append('div')
65202               .attr('class', 'nav');
65203
65204           clickHelp(docs[0], 0);
65205
65206           context.keybinding()
65207               .on(key, togglePane);
65208
65209           uiHelp.hidePane = hidePane;
65210           uiHelp.togglePane = togglePane;
65211           uiHelp.setVisible = setVisible;
65212       }
65213
65214       return help;
65215   }
65216
65217   function localeDateString(s) {
65218       if (!s) return null;
65219       var detected = utilDetect();
65220       var options = { day: 'numeric', month: 'short', year: 'numeric' };
65221       var d = new Date(s);
65222       if (isNaN(d.getTime())) return null;
65223       return d.toLocaleDateString(detected.locale, options);
65224   }
65225
65226   function vintageRange(vintage) {
65227       var s;
65228       if (vintage.start || vintage.end) {
65229           s = (vintage.start || '?');
65230           if (vintage.start !== vintage.end) {
65231               s += ' - ' + (vintage.end || '?');
65232           }
65233       }
65234       return s;
65235   }
65236
65237
65238   function rendererBackgroundSource(data) {
65239       var source = clone(data);
65240       var offset = [0, 0];
65241       var name = source.name;
65242       var description = source.description;
65243       var best = !!source.best;
65244       var template = source.template;
65245
65246       source.tileSize = data.tileSize || 256;
65247       source.zoomExtent = data.zoomExtent || [0, 22];
65248       source.overzoom = data.overzoom !== false;
65249
65250       source.offset = function(_) {
65251           if (!arguments.length) return offset;
65252           offset = _;
65253           return source;
65254       };
65255
65256
65257       source.nudge = function(_, zoomlevel) {
65258           offset[0] += _[0] / Math.pow(2, zoomlevel);
65259           offset[1] += _[1] / Math.pow(2, zoomlevel);
65260           return source;
65261       };
65262
65263
65264       source.name = function() {
65265           var id_safe = source.id.replace('.', '<TX_DOT>');
65266           return t('imagery.' + id_safe + '.name', { default: name });
65267       };
65268
65269
65270       source.description = function() {
65271           var id_safe = source.id.replace('.', '<TX_DOT>');
65272           return t('imagery.' + id_safe + '.description', { default: description });
65273       };
65274
65275
65276       source.best = function() {
65277           return best;
65278       };
65279
65280
65281       source.area = function() {
65282           if (!data.polygon) return Number.MAX_VALUE;  // worldwide
65283           var area = d3_geoArea({ type: 'MultiPolygon', coordinates: [ data.polygon ] });
65284           return isNaN(area) ? 0 : area;
65285       };
65286
65287
65288       source.imageryUsed = function() {
65289           return name || source.id;
65290       };
65291
65292
65293       source.template = function(_) {
65294           if (!arguments.length) return template;
65295           if (source.id === 'custom') template = _;
65296           return source;
65297       };
65298
65299
65300       source.url = function(coord) {
65301           if (this.type === 'wms') {
65302               var tileToProjectedCoords = (function(x, y, z) {
65303                   //polyfill for IE11, PhantomJS
65304                   var sinh = Math.sinh || function(x) {
65305                       var y = Math.exp(x);
65306                       return (y - 1 / y) / 2;
65307                   };
65308
65309                   var zoomSize = Math.pow(2, z);
65310                   var lon = x / zoomSize * Math.PI * 2 - Math.PI;
65311                   var lat = Math.atan(sinh(Math.PI * (1 - 2 * y / zoomSize)));
65312
65313                   switch (this.projection) {
65314                       case 'EPSG:4326':
65315                           return {
65316                               x: lon * 180 / Math.PI,
65317                               y: lat * 180 / Math.PI
65318                           };
65319                       default: // EPSG:3857 and synonyms
65320                           var mercCoords = mercatorRaw(lon, lat);
65321                           return {
65322                               x: 20037508.34 / Math.PI * mercCoords[0],
65323                               y: 20037508.34 / Math.PI * mercCoords[1]
65324                           };
65325                   }
65326               }).bind(this);
65327
65328               var minXmaxY = tileToProjectedCoords(coord[0], coord[1], coord[2]);
65329               var maxXminY = tileToProjectedCoords(coord[0]+1, coord[1]+1, coord[2]);
65330               return template
65331                   .replace('{width}', this.tileSize)
65332                   .replace('{height}', this.tileSize)
65333                   .replace('{proj}', this.projection)
65334                   .replace('{bbox}', minXmaxY.x + ',' + maxXminY.y + ',' + maxXminY.x + ',' + minXmaxY.y);
65335           }
65336           return template
65337               .replace('{x}', coord[0])
65338               .replace('{y}', coord[1])
65339               // TMS-flipped y coordinate
65340               .replace(/\{[t-]y\}/, Math.pow(2, coord[2]) - coord[1] - 1)
65341               .replace(/\{z(oom)?\}/, coord[2])
65342               .replace(/\{switch:([^}]+)\}/, function(s, r) {
65343                   var subdomains = r.split(',');
65344                   return subdomains[(coord[0] + coord[1]) % subdomains.length];
65345               })
65346               .replace('{u}', function() {
65347                   var u = '';
65348                   for (var zoom = coord[2]; zoom > 0; zoom--) {
65349                       var b = 0;
65350                       var mask = 1 << (zoom - 1);
65351                       if ((coord[0] & mask) !== 0) b++;
65352                       if ((coord[1] & mask) !== 0) b += 2;
65353                       u += b.toString();
65354                   }
65355                   return u;
65356               });
65357       };
65358
65359
65360       source.validZoom = function(z) {
65361           return source.zoomExtent[0] <= z &&
65362               (source.overzoom || source.zoomExtent[1] > z);
65363       };
65364
65365
65366       source.isLocatorOverlay = function() {
65367           return source.id === 'mapbox_locator_overlay';
65368       };
65369
65370
65371       /* hides a source from the list, but leaves it available for use */
65372       source.isHidden = function() {
65373           return source.id === 'DigitalGlobe-Premium-vintage' ||
65374               source.id === 'DigitalGlobe-Standard-vintage';
65375       };
65376
65377
65378       source.copyrightNotices = function() {};
65379
65380
65381       source.getMetadata = function(center, tileCoord, callback) {
65382           var vintage = {
65383               start: localeDateString(source.startDate),
65384               end: localeDateString(source.endDate)
65385           };
65386           vintage.range = vintageRange(vintage);
65387
65388           var metadata = { vintage: vintage };
65389           callback(null, metadata);
65390       };
65391
65392
65393       return source;
65394   }
65395
65396
65397   rendererBackgroundSource.Bing = function(data, dispatch) {
65398       // http://msdn.microsoft.com/en-us/library/ff701716.aspx
65399       // http://msdn.microsoft.com/en-us/library/ff701701.aspx
65400
65401       data.template = 'https://ecn.t{switch:0,1,2,3}.tiles.virtualearth.net/tiles/a{u}.jpeg?g=587&mkt=en-gb&n=z';
65402
65403       var bing = rendererBackgroundSource(data);
65404       var key = 'Arzdiw4nlOJzRwOz__qailc8NiR31Tt51dN2D7cm57NrnceZnCpgOkmJhNpGoppU'; // Same as P2 and JOSM
65405       var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial?include=ImageryProviders&key=' +
65406               key;
65407       var cache = {};
65408       var inflight = {};
65409       var providers = [];
65410
65411       d3_json(url, function(err, json$$1) {
65412           providers = json$$1.resourceSets[0].resources[0].imageryProviders.map(function(provider) {
65413               return {
65414                   attribution: provider.attribution,
65415                   areas: provider.coverageAreas.map(function(area) {
65416                       return {
65417                           zoom: [area.zoomMin, area.zoomMax],
65418                           extent: geoExtent$$1([area.bbox[1], area.bbox[0]], [area.bbox[3], area.bbox[2]])
65419                       };
65420                   })
65421               };
65422           });
65423           dispatch.call('change');
65424       });
65425
65426
65427       bing.copyrightNotices = function(zoom, extent) {
65428           zoom = Math.min(zoom, 21);
65429           return providers.filter(function(provider) {
65430               return some(provider.areas, function(area) {
65431                   return extent.intersects(area.extent) &&
65432                       area.zoom[0] <= zoom &&
65433                       area.zoom[1] >= zoom;
65434               });
65435           }).map(function(provider) {
65436               return provider.attribution;
65437           }).join(', ');
65438       };
65439
65440
65441       bing.getMetadata = function(center, tileCoord, callback) {
65442           var tileId = tileCoord.slice(0, 3).join('/');
65443           var zoom = Math.min(tileCoord[2], 21);
65444           var centerPoint = center[1] + ',' + center[0];  // lat,lng
65445           var url = 'https://dev.virtualearth.net/REST/v1/Imagery/Metadata/Aerial/' + centerPoint +
65446                   '?zl=' + zoom + '&key=' + key;
65447
65448           if (inflight[tileId]) return;
65449
65450           if (!cache[tileId]) {
65451               cache[tileId] = {};
65452           }
65453           if (cache[tileId] && cache[tileId].metadata) {
65454               return callback(null, cache[tileId].metadata);
65455           }
65456
65457           inflight[tileId] = true;
65458           d3_json(url, function(error, result) {
65459               delete inflight[tileId];
65460
65461               var err;
65462               if (error) {
65463                   err = error;
65464               } else if (!result && 'Unknown Error') {
65465                   err = result.errorDetails;
65466               }
65467               if (err) {
65468                   return callback(err);
65469               } else {
65470                   var vintage = {
65471                       start: localeDateString(result.resourceSets[0].resources[0].vintageStart),
65472                       end: localeDateString(result.resourceSets[0].resources[0].vintageEnd)
65473                   };
65474                   vintage.range = vintageRange(vintage);
65475
65476                   var metadata = { vintage: vintage };
65477                   cache[tileId].metadata = metadata;
65478                   return callback(null, metadata);
65479               }
65480           });
65481       };
65482
65483
65484       bing.terms_url = 'https://blog.openstreetmap.org/2010/11/30/microsoft-imagery-details';
65485
65486
65487       return bing;
65488   };
65489
65490
65491
65492   rendererBackgroundSource.Esri = function(data) {
65493       // in addition to using the tilemap at zoom level 20, overzoom real tiles - #4327 (deprecated technique, but it works)
65494       if (data.template.match(/blankTile/) === null) {
65495           data.template = data.template + '?blankTile=false';
65496       }
65497
65498       var esri = rendererBackgroundSource(data);
65499       var cache = {};
65500       var inflight = {};
65501       var _prevCenter;
65502
65503       // use a tilemap service to set maximum zoom for esri tiles dynamically
65504       // https://developers.arcgis.com/documentation/tiled-elevation-service/
65505       esri.fetchTilemap = function(center) {
65506           // skip if we have already fetched a tilemap within 5km
65507           if (_prevCenter && geoSphericalDistance(center, _prevCenter) < 5000) return;
65508           _prevCenter = center;
65509
65510           // tiles are available globally to zoom level 19, afterward they may or may not be present
65511           var z = 20;
65512
65513           // first generate a random url using the template
65514           var dummyUrl = esri.url([1,2,3]);
65515
65516           // calculate url z/y/x from the lat/long of the center of the map
65517           var x = (Math.floor((center[0] + 180) / 360 * Math.pow(2, z)));
65518           var y = (Math.floor((1 - Math.log(Math.tan(center[1] * Math.PI / 180) + 1 / Math.cos(center[1] * Math.PI / 180)) / Math.PI) / 2 * Math.pow(2, z)));
65519
65520           // fetch an 8x8 grid to leverage cache
65521           var tilemapUrl = dummyUrl.replace(/tile\/[0-9]+\/[0-9]+\/[0-9]+\?blankTile=false/, 'tilemap') + '/' + z + '/' + y + '/' + x + '/8/8';
65522
65523           // make the request and introspect the response from the tilemap server
65524           d3_json(tilemapUrl, function (err, tilemap) {
65525               if (err || !tilemap) return;
65526
65527               var hasTiles = true;
65528               for (var i = 0; i < tilemap.data.length; i++) {
65529                   // 0 means an individual tile in the grid doesn't exist
65530                   if (!tilemap.data[i]) {
65531                       hasTiles = false;
65532                       break;
65533                   }
65534               }
65535
65536               // if any tiles are missing at level 20 we restrict maxZoom to 19
65537               esri.zoomExtent[1] = (hasTiles ? 22 : 19);
65538           });
65539       };
65540
65541       esri.getMetadata = function(center, tileCoord, callback) {
65542           var tileId = tileCoord.slice(0, 3).join('/');
65543           var zoom = Math.min(tileCoord[2], esri.zoomExtent[1]);
65544           var centerPoint = center[0] + ',' + center[1];  // long, lat (as it should be)
65545           var unknown = t('info_panels.background.unknown');
65546           var metadataLayer;
65547           var vintage = {};
65548           var metadata = {};
65549
65550           if (inflight[tileId]) return;
65551
65552           switch (true) {
65553               case (zoom >= 20 && esri.id === 'EsriWorldImageryClarity'):
65554                   metadataLayer = 4;
65555                   break;
65556               case zoom >= 19:
65557                   metadataLayer = 3;
65558                   break;
65559               case zoom >= 17:
65560                   metadataLayer = 2;
65561                   break;
65562               case zoom >= 13:
65563                   metadataLayer = 0;
65564                   break;
65565               default:
65566                   metadataLayer = 99;
65567           }
65568
65569           var url;
65570           // build up query using the layer appropriate to the current zoom
65571           if (esri.id === 'EsriWorldImagery') {
65572               url = 'https://services.arcgisonline.com/arcgis/rest/services/World_Imagery/MapServer/';
65573           } else if (esri.id === 'EsriWorldImageryClarity') {
65574               url = 'https://serviceslab.arcgisonline.com/arcgis/rest/services/Clarity_World_Imagery/MapServer/';
65575           }
65576
65577           url += metadataLayer + '/query?returnGeometry=false&geometry=' + centerPoint + '&inSR=4326&geometryType=esriGeometryPoint&outFields=*&f=json';
65578
65579           if (!cache[tileId]) {
65580               cache[tileId] = {};
65581           }
65582           if (cache[tileId] && cache[tileId].metadata) {
65583               return callback(null, cache[tileId].metadata);
65584           }
65585
65586           // accurate metadata is only available >= 13
65587           if (metadataLayer === 99) {
65588               vintage = {
65589                   start: null,
65590                   end: null,
65591                   range: null
65592               };
65593               metadata = {
65594                   vintage: null,
65595                   source: unknown,
65596                   description: unknown,
65597                   resolution: unknown,
65598                   accuracy: unknown
65599               };
65600
65601               callback(null, metadata);
65602
65603           } else {
65604               inflight[tileId] = true;
65605               d3_json(url, function(error, result) {
65606                   delete inflight[tileId];
65607
65608                   var err;
65609                   if (error) {
65610                       err = error;
65611                   } else if (!result) {
65612                       err = 'Unknown Error';
65613                   } else if (result.features && result.features.length < 1) {
65614                       err = 'No Results';
65615                   } else if (result.error && result.error.message) {
65616                       err = result.error.message;
65617                   }
65618
65619                   if (err) {
65620                       return callback(err);
65621                   } else {
65622                       // pass through the discrete capture date from metadata
65623                       var captureDate = localeDateString(result.features[0].attributes.SRC_DATE2);
65624                       vintage = {
65625                           start: captureDate,
65626                           end: captureDate,
65627                           range: captureDate
65628                       };
65629                       metadata = {
65630                           vintage: vintage,
65631                           source: clean(result.features[0].attributes.NICE_NAME),
65632                           description: clean(result.features[0].attributes.NICE_DESC),
65633                           resolution: clean(result.features[0].attributes.SRC_RES),
65634                           accuracy: clean(result.features[0].attributes.SRC_ACC)
65635                       };
65636
65637                       // append units - meters
65638                       if (isFinite(metadata.resolution)) {
65639                           metadata.resolution += ' m';
65640                       }
65641                       if (isFinite(metadata.accuracy)) {
65642                           metadata.accuracy += ' m';
65643                       }
65644
65645                       cache[tileId].metadata = metadata;
65646                       return callback(null, metadata);
65647                   }
65648               });
65649           }
65650
65651
65652           function clean(val) {
65653               return String(val).trim() || unknown;
65654           }
65655       };
65656
65657       return esri;
65658   };
65659
65660
65661   rendererBackgroundSource.None = function() {
65662       var source = rendererBackgroundSource({ id: 'none', template: '' });
65663
65664
65665       source.name = function() {
65666           return t('background.none');
65667       };
65668
65669
65670       source.imageryUsed = function() {
65671           return 'None';
65672       };
65673
65674
65675       source.area = function() {
65676           return -1;  // sources in background pane are sorted by area
65677       };
65678
65679
65680       return source;
65681   };
65682
65683
65684   rendererBackgroundSource.Custom = function(template) {
65685       var source = rendererBackgroundSource({ id: 'custom', template: template });
65686
65687
65688       source.name = function() {
65689           return t('background.custom');
65690       };
65691
65692
65693       source.imageryUsed = function() {
65694           return 'Custom (' + source.template() + ')';
65695       };
65696
65697
65698       source.area = function() {
65699           return -2;  // sources in background pane are sorted by area
65700       };
65701
65702
65703       return source;
65704   };
65705
65706   function rendererTileLayer(context) {
65707       var transformProp = utilPrefixCSSProperty('Transform');
65708       var tiler = utilTiler();
65709
65710       var _tileSize = 256;
65711       var _projection;
65712       var _cache = {};
65713       var _tileOrigin;
65714       var _zoom;
65715       var _source;
65716
65717
65718       function tileSizeAtZoom(d, z) {
65719           var EPSILON = 0.002;    // close seams
65720           return ((_tileSize * Math.pow(2, z - d[2])) / _tileSize) + EPSILON;
65721       }
65722
65723
65724       function atZoom(t$$1, distance) {
65725           var power = Math.pow(2, distance);
65726           return [
65727               Math.floor(t$$1[0] * power),
65728               Math.floor(t$$1[1] * power),
65729               t$$1[2] + distance
65730           ];
65731       }
65732
65733
65734       function lookUp(d) {
65735           for (var up = -1; up > -d[2]; up--) {
65736               var tile = atZoom(d, up);
65737               if (_cache[_source.url(tile)] !== false) {
65738                   return tile;
65739               }
65740           }
65741       }
65742
65743
65744       function uniqueBy(a, n) {
65745           var o = [];
65746           var seen = {};
65747           for (var i = 0; i < a.length; i++) {
65748               if (seen[a[i][n]] === undefined) {
65749                   o.push(a[i]);
65750                   seen[a[i][n]] = true;
65751               }
65752           }
65753           return o;
65754       }
65755
65756
65757       function addSource(d) {
65758           d.push(_source.url(d));
65759           return d;
65760       }
65761
65762
65763       // Update tiles based on current state of `projection`.
65764       function background(selection$$1) {
65765           _zoom = geoScaleToZoom(_projection.scale(), _tileSize);
65766
65767           var pixelOffset;
65768           if (_source) {
65769               pixelOffset = [
65770                   _source.offset()[0] * Math.pow(2, _zoom),
65771                   _source.offset()[1] * Math.pow(2, _zoom)
65772               ];
65773           } else {
65774               pixelOffset = [0, 0];
65775           }
65776
65777           var translate = [
65778               _projection.translate()[0] + pixelOffset[0],
65779               _projection.translate()[1] + pixelOffset[1]
65780           ];
65781
65782           tiler
65783               .scale(_projection.scale() * 2 * Math.PI)
65784               .translate(translate);
65785
65786           _tileOrigin = [
65787               _projection.scale() * Math.PI - translate[0],
65788               _projection.scale() * Math.PI - translate[1]
65789           ];
65790
65791           render(selection$$1);
65792       }
65793
65794
65795       // Derive the tiles onscreen, remove those offscreen and position them.
65796       // Important that this part not depend on `_projection` because it's
65797       // rentered when tiles load/error (see #644).
65798       function render(selection$$1) {
65799           if (!_source) return;
65800           var requests = [];
65801           var showDebug = context.getDebug('tile') && !_source.overlay;
65802
65803           if (_source.validZoom(_zoom)) {
65804               tiler.skipNullIsland(!!_source.overlay);
65805
65806               tiler().forEach(function(d) {
65807                   addSource(d);
65808                   if (d[3] === '') return;
65809                   if (typeof d[3] !== 'string') return; // Workaround for #2295
65810                   requests.push(d);
65811                   if (_cache[d[3]] === false && lookUp(d)) {
65812                       requests.push(addSource(lookUp(d)));
65813                   }
65814               });
65815
65816               requests = uniqueBy(requests, 3).filter(function(r) {
65817                   // don't re-request tiles which have failed in the past
65818                   return _cache[r[3]] !== false;
65819               });
65820           }
65821
65822           function load(d) {
65823               _cache[d[3]] = true;
65824               select(this)
65825                   .on('error', null)
65826                   .on('load', null)
65827                   .classed('tile-loaded', true);
65828               render(selection$$1);
65829           }
65830
65831           function error(d) {
65832               _cache[d[3]] = false;
65833               select(this)
65834                   .on('error', null)
65835                   .on('load', null)
65836                   .remove();
65837               render(selection$$1);
65838           }
65839
65840           function imageTransform(d) {
65841               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
65842               var scale = tileSizeAtZoom(d, _zoom);
65843               return 'translate(' +
65844                   ((d[0] * ts) - _tileOrigin[0]) + 'px,' +
65845                   ((d[1] * ts) - _tileOrigin[1]) + 'px) ' +
65846                   'scale(' + scale + ',' + scale + ')';
65847           }
65848
65849           function tileCenter(d) {
65850               var ts = _tileSize * Math.pow(2, _zoom - d[2]);
65851               return [
65852                   ((d[0] * ts) - _tileOrigin[0] + (ts / 2)),
65853                   ((d[1] * ts) - _tileOrigin[1] + (ts / 2))
65854               ];
65855           }
65856
65857           function debugTransform(d) {
65858               var coord = tileCenter(d);
65859               return 'translate(' + coord[0] + 'px,' + coord[1] + 'px)';
65860           }
65861
65862
65863           // Pick a representative tile near the center of the viewport
65864           // (This is useful for sampling the imagery vintage)
65865           var dims = tiler.size();
65866           var mapCenter = [dims[0] / 2, dims[1] / 2];
65867           var minDist = Math.max(dims[0], dims[1]);
65868           var nearCenter;
65869
65870           requests.forEach(function(d) {
65871               var c = tileCenter(d);
65872               var dist = geoVecLength(c, mapCenter);
65873               if (dist < minDist) {
65874                   minDist = dist;
65875                   nearCenter = d;
65876               }
65877           });
65878
65879
65880           var image = selection$$1.selectAll('img')
65881               .data(requests, function(d) { return d[3]; });
65882
65883           image.exit()
65884               .style(transformProp, imageTransform)
65885               .classed('tile-removing', true)
65886               .classed('tile-center', false)
65887               .each(function() {
65888                   var tile = select(this);
65889                   window.setTimeout(function() {
65890                       if (tile.classed('tile-removing')) {
65891                           tile.remove();
65892                       }
65893                   }, 300);
65894               });
65895
65896           image.enter()
65897             .append('img')
65898               .attr('class', 'tile')
65899               .attr('src', function(d) { return d[3]; })
65900               .on('error', error)
65901               .on('load', load)
65902             .merge(image)
65903               .style(transformProp, imageTransform)
65904               .classed('tile-debug', showDebug)
65905               .classed('tile-removing', false)
65906               .classed('tile-center', function(d) { return d === nearCenter; });
65907
65908
65909
65910           var debug = selection$$1.selectAll('.tile-label-debug')
65911               .data(showDebug ? requests : [], function(d) { return d[3]; });
65912
65913           debug.exit()
65914               .remove();
65915
65916           if (showDebug) {
65917               var debugEnter = debug.enter()
65918                   .append('div')
65919                   .attr('class', 'tile-label-debug');
65920
65921               debugEnter
65922                   .append('div')
65923                   .attr('class', 'tile-label-debug-coord');
65924
65925               debugEnter
65926                   .append('div')
65927                   .attr('class', 'tile-label-debug-vintage');
65928
65929               debug = debug.merge(debugEnter);
65930
65931               debug
65932                   .style(transformProp, debugTransform);
65933
65934               debug
65935                   .selectAll('.tile-label-debug-coord')
65936                   .text(function(d) { return d[2] + ' / ' + d[0] + ' / ' + d[1]; });
65937
65938               debug
65939                   .selectAll('.tile-label-debug-vintage')
65940                   .each(function(d) {
65941                       var span = select(this);
65942                       var center = context.projection.invert(tileCenter(d));
65943                       _source.getMetadata(center, d, function(err, result) {
65944                           span.text((result && result.vintage && result.vintage.range) ||
65945                               t('info_panels.background.vintage') + ': ' + t('info_panels.background.unknown')
65946                           );
65947                       });
65948                   });
65949           }
65950
65951       }
65952
65953
65954       background.projection = function(_) {
65955           if (!arguments.length) return _projection;
65956           _projection = _;
65957           return background;
65958       };
65959
65960
65961       background.dimensions = function(_) {
65962           if (!arguments.length) return tiler.size();
65963           tiler.size(_);
65964           return background;
65965       };
65966
65967
65968       background.source = function(_) {
65969           if (!arguments.length) return _source;
65970           _source = _;
65971           _tileSize = _source.tileSize;
65972           _cache = {};
65973           tiler.tileSize(_source.tileSize).zoomExtent(_source.zoomExtent);
65974           return background;
65975       };
65976
65977
65978       return background;
65979   }
65980
65981   function rendererBackground(context) {
65982       var dispatch$$1 = dispatch('change');
65983       var detected = utilDetect();
65984       var baseLayer = rendererTileLayer(context).projection(context.projection);
65985       var _overlayLayers = [];
65986       var _backgroundSources = [];
65987       var _brightness = 1;
65988       var _contrast = 1;
65989       var _saturation = 1;
65990       var _sharpness = 1;
65991
65992
65993       function background(selection$$1) {
65994           // If we are displaying an Esri basemap at high zoom,
65995           // check its tilemap to see how high the zoom can go
65996           if (context.map().zoom() > 18) {
65997               var basemap = baseLayer.source();
65998               if (basemap && /^EsriWorldImagery/.test(basemap.id)) {
65999                   var center = context.map().center();
66000                   basemap.fetchTilemap(center);
66001               }
66002           }
66003
66004           var baseFilter = '';
66005           if (detected.cssfilters) {
66006               if (_brightness !== 1) {
66007                   baseFilter += 'brightness(' + _brightness + ')';
66008               }
66009               if (_contrast !== 1) {
66010                   baseFilter += 'contrast(' + _contrast + ')';
66011               }
66012               if (_saturation !== 1) {
66013                   baseFilter += 'saturate(' + _saturation + ')';
66014               }
66015               if (_sharpness < 1) {  // gaussian blur
66016                   var blur = interpolateNumber(0.5, 5)(1 - _sharpness);
66017                   baseFilter += 'blur(' + blur + 'px)';
66018               }
66019           }
66020
66021           var base = selection$$1.selectAll('.layer-background')
66022               .data([0]);
66023
66024           base = base.enter()
66025               .insert('div', '.layer-data')
66026               .attr('class', 'layer layer-background')
66027               .merge(base);
66028
66029           if (detected.cssfilters) {
66030               base.style('filter', baseFilter || null);
66031           } else {
66032               base.style('opacity', _brightness);
66033           }
66034
66035
66036           var imagery = base.selectAll('.layer-imagery')
66037               .data([0]);
66038
66039           imagery.enter()
66040               .append('div')
66041               .attr('class', 'layer layer-imagery')
66042               .merge(imagery)
66043               .call(baseLayer);
66044
66045
66046           var maskFilter = '';
66047           var mixBlendMode = '';
66048           if (detected.cssfilters && _sharpness > 1) {  // apply unsharp mask
66049               mixBlendMode = 'overlay';
66050               maskFilter = 'saturate(0) blur(3px) invert(1)';
66051
66052               var contrast = _sharpness - 1;
66053               maskFilter += ' contrast(' + contrast + ')';
66054
66055               var brightness = interpolateNumber(1, 0.85)(_sharpness - 1);
66056               maskFilter += ' brightness(' + brightness + ')';
66057           }
66058
66059           var mask = base.selectAll('.layer-unsharp-mask')
66060               .data(detected.cssfilters && _sharpness > 1 ? [0] : []);
66061
66062           mask.exit()
66063               .remove();
66064
66065           mask.enter()
66066               .append('div')
66067               .attr('class', 'layer layer-mask layer-unsharp-mask')
66068               .merge(mask)
66069               .call(baseLayer)
66070               .style('filter', maskFilter || null)
66071               .style('mix-blend-mode', mixBlendMode || null);
66072
66073
66074           var overlays = selection$$1.selectAll('.layer-overlay')
66075               .data(_overlayLayers, function(d) { return d.source().name(); });
66076
66077           overlays.exit()
66078               .remove();
66079
66080           overlays.enter()
66081               .insert('div', '.layer-data')
66082               .attr('class', 'layer layer-overlay')
66083               .merge(overlays)
66084               .each(function(layer) { select(this).call(layer); });
66085       }
66086
66087
66088       background.updateImagery = function() {
66089           if (context.inIntro()) return;
66090
66091           var b = background.baseLayerSource();
66092           var o = _overlayLayers
66093               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
66094               .map(function (d) { return d.source().id; })
66095               .join(',');
66096
66097           var meters = geoOffsetToMeters(b.offset());
66098           var epsilon = 0.01;
66099           var x = +meters[0].toFixed(2);
66100           var y = +meters[1].toFixed(2);
66101           var q = utilStringQs(window.location.hash.substring(1));
66102
66103           var id = b.id;
66104           if (id === 'custom') {
66105               id = 'custom:' + b.template();
66106           }
66107
66108           if (id) {
66109               q.background = id;
66110           } else {
66111               delete q.background;
66112           }
66113
66114           if (o) {
66115               q.overlays = o;
66116           } else {
66117               delete q.overlays;
66118           }
66119
66120           if (Math.abs(x) > epsilon || Math.abs(y) > epsilon) {
66121               q.offset = x + ',' + y;
66122           } else {
66123               delete q.offset;
66124           }
66125
66126           if (!window.mocha) {
66127               window.location.replace('#' + utilQsString(q, true));
66128           }
66129
66130           var imageryUsed = [b.imageryUsed()];
66131
66132           _overlayLayers
66133               .filter(function (d) { return !d.source().isLocatorOverlay() && !d.source().isHidden(); })
66134               .forEach(function (d) { imageryUsed.push(d.source().imageryUsed()); });
66135
66136           var data$$1 = context.layers().layer('data');
66137           if (data$$1 && data$$1.enabled() && data$$1.hasData()) {
66138               imageryUsed.push(data$$1.getSrc());
66139           }
66140
66141           var streetside = context.layers().layer('streetside');
66142           if (streetside && streetside.enabled()) {
66143               imageryUsed.push('Bing Streetside');
66144           }
66145
66146           var mapillary_images = context.layers().layer('mapillary-images');
66147           if (mapillary_images && mapillary_images.enabled()) {
66148               imageryUsed.push('Mapillary Images');
66149           }
66150
66151           var mapillary_signs = context.layers().layer('mapillary-signs');
66152           if (mapillary_signs && mapillary_signs.enabled()) {
66153               imageryUsed.push('Mapillary Signs');
66154           }
66155
66156           var openstreetcam_images = context.layers().layer('openstreetcam-images');
66157           if (openstreetcam_images && openstreetcam_images.enabled()) {
66158               imageryUsed.push('OpenStreetCam Images');
66159           }
66160
66161           context.history().imageryUsed(imageryUsed);
66162       };
66163
66164
66165       background.sources = function(extent) {
66166           if (!data.imagery || !data.imagery.query) return [];   // called before init()?
66167
66168           var matchIDs = {};
66169           var matchImagery = data.imagery.query.bbox(extent.rectangle(), true) || [];
66170           matchImagery.forEach(function(d) { matchIDs[d.id] = true; });
66171
66172           return _backgroundSources.filter(function(source) {
66173               return matchIDs[source.id] || !source.polygon;   // no polygon = worldwide
66174           });
66175       };
66176
66177
66178       background.dimensions = function(d) {
66179           if (!d) return;
66180           baseLayer.dimensions(d);
66181
66182           _overlayLayers.forEach(function(layer) {
66183               layer.dimensions(d);
66184           });
66185       };
66186
66187
66188       background.baseLayerSource = function(d) {
66189           if (!arguments.length) return baseLayer.source();
66190
66191           // test source against OSM imagery blacklists..
66192           var osm = context.connection();
66193           if (!osm) return background;
66194
66195           var blacklists = context.connection().imageryBlacklists();
66196           var template = d.template();
66197           var fail = false;
66198           var tested = 0;
66199           var regex;
66200
66201           for (var i = 0; i < blacklists.length; i++) {
66202               try {
66203                   regex = new RegExp(blacklists[i]);
66204                   fail = regex.test(template);
66205                   tested++;
66206                   if (fail) break;
66207               } catch (e) {
66208                   /* noop */
66209               }
66210           }
66211
66212           // ensure at least one test was run.
66213           if (!tested) {
66214               regex = new RegExp('.*\.google(apis)?\..*/(vt|kh)[\?/].*([xyz]=.*){3}.*');
66215               fail = regex.test(template);
66216           }
66217
66218           baseLayer.source(!fail ? d : background.findSource('none'));
66219           dispatch$$1.call('change');
66220           background.updateImagery();
66221           return background;
66222       };
66223
66224
66225       background.findSource = function(id) {
66226           return find$1(_backgroundSources, function(d) {
66227               return d.id && d.id === id;
66228           });
66229       };
66230
66231
66232       background.bing = function() {
66233           background.baseLayerSource(background.findSource('Bing'));
66234       };
66235
66236
66237       background.showsLayer = function(d) {
66238           return d.id === baseLayer.source().id ||
66239               _overlayLayers.some(function(layer) { return d.id === layer.source().id; });
66240       };
66241
66242
66243       background.overlayLayerSources = function() {
66244           return _overlayLayers.map(function (l) { return l.source(); });
66245       };
66246
66247
66248       background.toggleOverlayLayer = function(d) {
66249           var layer;
66250           for (var i = 0; i < _overlayLayers.length; i++) {
66251               layer = _overlayLayers[i];
66252               if (layer.source() === d) {
66253                   _overlayLayers.splice(i, 1);
66254                   dispatch$$1.call('change');
66255                   background.updateImagery();
66256                   return;
66257               }
66258           }
66259
66260           layer = rendererTileLayer(context)
66261               .source(d)
66262               .projection(context.projection)
66263               .dimensions(baseLayer.dimensions()
66264           );
66265
66266           _overlayLayers.push(layer);
66267           dispatch$$1.call('change');
66268           background.updateImagery();
66269       };
66270
66271
66272       background.nudge = function(d, zoom) {
66273           baseLayer.source().nudge(d, zoom);
66274           dispatch$$1.call('change');
66275           background.updateImagery();
66276           return background;
66277       };
66278
66279
66280       background.offset = function(d) {
66281           if (!arguments.length) return baseLayer.source().offset();
66282           baseLayer.source().offset(d);
66283           dispatch$$1.call('change');
66284           background.updateImagery();
66285           return background;
66286       };
66287
66288
66289       background.brightness = function(d) {
66290           if (!arguments.length) return _brightness;
66291           _brightness = d;
66292           if (context.mode()) dispatch$$1.call('change');
66293           return background;
66294       };
66295
66296
66297       background.contrast = function(d) {
66298           if (!arguments.length) return _contrast;
66299           _contrast = d;
66300           if (context.mode()) dispatch$$1.call('change');
66301           return background;
66302       };
66303
66304
66305       background.saturation = function(d) {
66306           if (!arguments.length) return _saturation;
66307           _saturation = d;
66308           if (context.mode()) dispatch$$1.call('change');
66309           return background;
66310       };
66311
66312
66313       background.sharpness = function(d) {
66314           if (!arguments.length) return _sharpness;
66315           _sharpness = d;
66316           if (context.mode()) dispatch$$1.call('change');
66317           return background;
66318       };
66319
66320
66321       background.init = function() {
66322           function parseMap(qmap) {
66323               if (!qmap) return false;
66324               var args = qmap.split('/').map(Number);
66325               if (args.length < 3 || args.some(isNaN)) return false;
66326               return geoExtent$$1([args[2], args[1]]);
66327           }
66328
66329           var q = utilStringQs(window.location.hash.substring(1));
66330           var requested = q.background || q.layer;
66331           var extent = parseMap(q.map);
66332           var first;
66333           var best;
66334
66335
66336           data.imagery = data.imagery || [];
66337           data.imagery.features = {};
66338
66339           // build efficient index and querying for data.imagery
66340           var features = data.imagery.map(function(source) {
66341               if (!source.polygon) return null;
66342
66343               // Add an extra array nest to each element in `source.polygon`
66344               // so the rings are not treated as a bunch of holes:
66345               // what we have: [ [[outer],[hole],[hole]] ]
66346               // what we want: [ [[outer]],[[outer]],[[outer]] ]
66347               var rings = source.polygon.map(function(ring) { return [ring]; });
66348
66349               var feature = {
66350                   type: 'Feature',
66351                   properties: { id: source.id },
66352                   geometry: { type: 'MultiPolygon', coordinates: rings }
66353               };
66354
66355               data.imagery.features[source.id] = feature;
66356               return feature;
66357
66358           }).filter(Boolean);
66359
66360           data.imagery.query = whichPolygon_1({
66361               type: 'FeatureCollection',
66362               features: features
66363           });
66364
66365
66366           // Add all the available imagery sources
66367           _backgroundSources = data.imagery.map(function(source) {
66368               if (source.type === 'bing') {
66369                   return rendererBackgroundSource.Bing(source, dispatch$$1);
66370               } else if (/^EsriWorldImagery/.test(source.id)) {
66371                   return rendererBackgroundSource.Esri(source);
66372               } else {
66373                   return rendererBackgroundSource(source);
66374               }
66375           });
66376
66377           first = _backgroundSources.length && _backgroundSources[0];
66378
66379           // Add 'None'
66380           _backgroundSources.unshift(rendererBackgroundSource.None());
66381
66382           // Add 'Custom'
66383           var template = context.storage('background-custom-template') || '';
66384           var custom = rendererBackgroundSource.Custom(template);
66385           _backgroundSources.unshift(custom);
66386
66387
66388           // Decide which background layer to display
66389           if (!requested && extent) {
66390               best = find$1(this.sources(extent), function(s) { return s.best(); });
66391           }
66392           if (requested && requested.indexOf('custom:') === 0) {
66393               template = requested.replace(/^custom:/, '');
66394               background.baseLayerSource(custom.template(template));
66395               context.storage('background-custom-template', template);
66396           } else {
66397               background.baseLayerSource(
66398                   background.findSource(requested) ||
66399                   best ||
66400                   background.findSource(context.storage('background-last-used')) ||
66401                   background.findSource('Bing') ||
66402                   first ||
66403                   background.findSource('none')
66404               );
66405           }
66406
66407           var locator = find$1(_backgroundSources, function(d) {
66408               return d.overlay && d.default;
66409           });
66410
66411           if (locator) {
66412               background.toggleOverlayLayer(locator);
66413           }
66414
66415           var overlays = (q.overlays || '').split(',');
66416           overlays.forEach(function(overlay) {
66417               overlay = background.findSource(overlay);
66418               if (overlay) {
66419                   background.toggleOverlayLayer(overlay);
66420               }
66421           });
66422
66423           if (q.gpx) {
66424               var gpx = context.layers().layer('data');
66425               if (gpx) {
66426                   gpx.url(q.gpx, '.gpx');
66427               }
66428           }
66429
66430           if (q.offset) {
66431               var offset = q.offset.replace(/;/g, ',').split(',').map(function(n) {
66432                   return !isNaN(n) && n;
66433               });
66434
66435               if (offset.length === 2) {
66436                   background.offset(geoMetersToOffset(offset));
66437               }
66438           }
66439       };
66440
66441
66442       return utilRebind(background, dispatch$$1, 'on');
66443   }
66444
66445   function rendererFeatures(context) {
66446       var traffic_roads = {
66447           'motorway': true,
66448           'motorway_link': true,
66449           'trunk': true,
66450           'trunk_link': true,
66451           'primary': true,
66452           'primary_link': true,
66453           'secondary': true,
66454           'secondary_link': true,
66455           'tertiary': true,
66456           'tertiary_link': true,
66457           'residential': true,
66458           'unclassified': true,
66459           'living_street': true
66460       };
66461
66462       var service_roads = {
66463           'service': true,
66464           'road': true,
66465           'track': true
66466       };
66467
66468       var paths = {
66469           'path': true,
66470           'footway': true,
66471           'cycleway': true,
66472           'bridleway': true,
66473           'steps': true,
66474           'pedestrian': true,
66475           'corridor': true
66476       };
66477
66478       var past_futures = {
66479           'proposed': true,
66480           'construction': true,
66481           'abandoned': true,
66482           'dismantled': true,
66483           'disused': true,
66484           'razed': true,
66485           'demolished': true,
66486           'obliterated': true
66487       };
66488
66489       var dispatch$$1 = dispatch('change', 'redraw'),
66490           _cullFactor = 1,
66491           _cache = {},
66492           _features = {},
66493           _stats = {},
66494           _keys = [],
66495           _hidden = [];
66496
66497
66498       function update() {
66499           if (!window.mocha) {
66500               var q = utilStringQs(window.location.hash.substring(1));
66501               var disabled = features.disabled();
66502               if (disabled.length) {
66503                   q.disable_features = disabled.join(',');
66504               } else {
66505                   delete q.disable_features;
66506               }
66507               window.location.replace('#' + utilQsString(q, true));
66508               context.storage('disabled-features', disabled.join(','));
66509           }
66510           _hidden = features.hidden();
66511           dispatch$$1.call('change');
66512           dispatch$$1.call('redraw');
66513       }
66514
66515
66516       function defineFeature(k, filter, max) {
66517           var isEnabled = true;
66518
66519           _keys.push(k);
66520           _features[k] = {
66521               filter: filter,
66522               enabled: isEnabled,   // whether the user wants it enabled..
66523               count: 0,
66524               currentMax: (max || Infinity),
66525               defaultMax: (max || Infinity),
66526               enable: function() { this.enabled = true; this.currentMax = this.defaultMax; },
66527               disable: function() { this.enabled = false; this.currentMax = 0; },
66528               hidden: function() { return !context.editable() || this.count > this.currentMax * _cullFactor; },
66529               autoHidden: function() { return this.hidden() && this.currentMax > 0; }
66530           };
66531       }
66532
66533
66534       defineFeature('points', function isPoint(entity, resolver, geometry) {
66535           return geometry === 'point';
66536       }, 200);
66537
66538       defineFeature('traffic_roads', function isTrafficRoad(entity) {
66539           return traffic_roads[entity.tags.highway];
66540       });
66541
66542       defineFeature('service_roads', function isServiceRoad(entity) {
66543           return service_roads[entity.tags.highway];
66544       });
66545
66546       defineFeature('paths', function isPath(entity) {
66547           return paths[entity.tags.highway];
66548       });
66549
66550       defineFeature('buildings', function isBuilding(entity) {
66551           return (
66552               !!entity.tags['building:part'] ||
66553               (!!entity.tags.building && entity.tags.building !== 'no') ||
66554               entity.tags.parking === 'multi-storey' ||
66555               entity.tags.parking === 'sheds' ||
66556               entity.tags.parking === 'carports' ||
66557               entity.tags.parking === 'garage_boxes'
66558           );
66559       }, 250);
66560
66561       defineFeature('landuse', function isLanduse(entity, resolver, geometry) {
66562           return geometry === 'area' &&
66563               !_features.buildings.filter(entity) &&
66564               !_features.water.filter(entity);
66565       });
66566
66567       defineFeature('boundaries', function isBoundary(entity) {
66568           return (
66569               !!entity.tags.boundary
66570           ) && !(
66571               traffic_roads[entity.tags.highway] ||
66572               service_roads[entity.tags.highway] ||
66573               paths[entity.tags.highway]
66574           );
66575       });
66576
66577       defineFeature('water', function isWater(entity) {
66578           return (
66579               !!entity.tags.waterway ||
66580               entity.tags.natural === 'water' ||
66581               entity.tags.natural === 'coastline' ||
66582               entity.tags.natural === 'bay' ||
66583               entity.tags.landuse === 'pond' ||
66584               entity.tags.landuse === 'basin' ||
66585               entity.tags.landuse === 'reservoir' ||
66586               entity.tags.landuse === 'salt_pond'
66587           );
66588       });
66589
66590       defineFeature('rail', function isRail(entity) {
66591           return (
66592               !!entity.tags.railway ||
66593               entity.tags.landuse === 'railway'
66594           ) && !(
66595               traffic_roads[entity.tags.highway] ||
66596               service_roads[entity.tags.highway] ||
66597               paths[entity.tags.highway]
66598           );
66599       });
66600
66601       defineFeature('power', function isPower(entity) {
66602           return !!entity.tags.power;
66603       });
66604
66605       // contains a past/future tag, but not in active use as a road/path/cycleway/etc..
66606       defineFeature('past_future', function isPastFuture(entity) {
66607           if (
66608               traffic_roads[entity.tags.highway] ||
66609               service_roads[entity.tags.highway] ||
66610               paths[entity.tags.highway]
66611           ) { return false; }
66612
66613           var strings = Object.keys(entity.tags);
66614
66615           for (var i = 0; i < strings.length; i++) {
66616               var s = strings[i];
66617               if (past_futures[s] || past_futures[entity.tags[s]]) { return true; }
66618           }
66619           return false;
66620       });
66621
66622       // Lines or areas that don't match another feature filter.
66623       // IMPORTANT: The 'others' feature must be the last one defined,
66624       //   so that code in getMatches can skip this test if `hasMatch = true`
66625       defineFeature('others', function isOther(entity, resolver, geometry) {
66626           return (geometry === 'line' || geometry === 'area');
66627       });
66628
66629
66630       function features() {}
66631
66632
66633       features.features = function() {
66634           return _features;
66635       };
66636
66637
66638       features.keys = function() {
66639           return _keys;
66640       };
66641
66642
66643       features.enabled = function(k) {
66644           if (!arguments.length) {
66645               return _keys.filter(function(k) { return _features[k].enabled; });
66646           }
66647           return _features[k] && _features[k].enabled;
66648       };
66649
66650
66651       features.disabled = function(k) {
66652           if (!arguments.length) {
66653               return _keys.filter(function(k) { return !_features[k].enabled; });
66654           }
66655           return _features[k] && !_features[k].enabled;
66656       };
66657
66658
66659       features.hidden = function(k) {
66660           if (!arguments.length) {
66661               return _keys.filter(function(k) { return _features[k].hidden(); });
66662           }
66663           return _features[k] && _features[k].hidden();
66664       };
66665
66666
66667       features.autoHidden = function(k) {
66668           if (!arguments.length) {
66669               return _keys.filter(function(k) { return _features[k].autoHidden(); });
66670           }
66671           return _features[k] && _features[k].autoHidden();
66672       };
66673
66674
66675       features.enable = function(k) {
66676           if (_features[k] && !_features[k].enabled) {
66677               _features[k].enable();
66678               update();
66679           }
66680       };
66681
66682
66683       features.disable = function(k) {
66684           if (_features[k] && _features[k].enabled) {
66685               _features[k].disable();
66686               update();
66687           }
66688       };
66689
66690
66691       features.toggle = function(k) {
66692           if (_features[k]) {
66693               (function(f) { return f.enabled ? f.disable() : f.enable(); }(_features[k]));
66694               update();
66695           }
66696       };
66697
66698
66699       features.resetStats = function() {
66700           for (var i = 0; i < _keys.length; i++) {
66701               _features[_keys[i]].count = 0;
66702           }
66703           dispatch$$1.call('change');
66704       };
66705
66706
66707       features.gatherStats = function(d, resolver, dimensions) {
66708           var needsRedraw = false,
66709               type = groupBy(d, function(ent) { return ent.type; }),
66710               entities = [].concat(type.relation || [], type.way || [], type.node || []),
66711               currHidden, geometry, matches, i, j;
66712
66713           for (i = 0; i < _keys.length; i++) {
66714               _features[_keys[i]].count = 0;
66715           }
66716
66717           // adjust the threshold for point/building culling based on viewport size..
66718           // a _cullFactor of 1 corresponds to a 1000x1000px viewport..
66719           _cullFactor = dimensions[0] * dimensions[1] / 1000000;
66720
66721           for (i = 0; i < entities.length; i++) {
66722               geometry = entities[i].geometry(resolver);
66723               if (!(geometry === 'vertex' || geometry === 'relation')) {
66724                   matches = Object.keys(features.getMatches(entities[i], resolver, geometry));
66725                   for (j = 0; j < matches.length; j++) {
66726                       _features[matches[j]].count++;
66727                   }
66728               }
66729           }
66730
66731           currHidden = features.hidden();
66732           if (currHidden !== _hidden) {
66733               _hidden = currHidden;
66734               needsRedraw = true;
66735               dispatch$$1.call('change');
66736           }
66737
66738           return needsRedraw;
66739       };
66740
66741
66742       features.stats = function() {
66743           for (var i = 0; i < _keys.length; i++) {
66744               _stats[_keys[i]] = _features[_keys[i]].count;
66745           }
66746
66747           return _stats;
66748       };
66749
66750
66751       features.clear = function(d) {
66752           for (var i = 0; i < d.length; i++) {
66753               features.clearEntity(d[i]);
66754           }
66755       };
66756
66757
66758       features.clearEntity = function(entity) {
66759           delete _cache[osmEntity$$1.key(entity)];
66760       };
66761
66762
66763       features.reset = function() {
66764           _cache = {};
66765       };
66766
66767
66768       features.getMatches = function(entity, resolver, geometry) {
66769           if (geometry === 'vertex' || geometry === 'relation') return {};
66770
66771           var ent = osmEntity$$1.key(entity);
66772           if (!_cache[ent]) {
66773               _cache[ent] = {};
66774           }
66775
66776           if (!_cache[ent].matches) {
66777               var matches = {},
66778                   hasMatch = false;
66779
66780               for (var i = 0; i < _keys.length; i++) {
66781                   if (_keys[i] === 'others') {
66782                       if (hasMatch) continue;
66783
66784                       // Multipolygon members:
66785                       // If an entity...
66786                       //   1. is a way that hasn't matched other 'interesting' feature rules,
66787                       //   2. and it belongs to a single parent multipolygon relation
66788                       // ...then match whatever feature rules the parent multipolygon has matched.
66789                       // see #2548, #2887
66790                       //
66791                       // IMPORTANT:
66792                       // For this to work, getMatches must be called on relations before ways.
66793                       //
66794                       if (entity.type === 'way') {
66795                           var parents = features.getParents(entity, resolver, geometry);
66796                           if (parents.length === 1 && parents[0].isMultipolygon()) {
66797                               var pkey = osmEntity$$1.key(parents[0]);
66798                               if (_cache[pkey] && _cache[pkey].matches) {
66799                                   matches = clone(_cache[pkey].matches);
66800                                   continue;
66801                               }
66802                           }
66803                       }
66804                   }
66805
66806                   if (_features[_keys[i]].filter(entity, resolver, geometry)) {
66807                       matches[_keys[i]] = hasMatch = true;
66808                   }
66809               }
66810               _cache[ent].matches = matches;
66811           }
66812
66813           return _cache[ent].matches;
66814       };
66815
66816
66817       features.getParents = function(entity, resolver, geometry) {
66818           if (geometry === 'point') return [];
66819
66820           var ent = osmEntity$$1.key(entity);
66821           if (!_cache[ent]) {
66822               _cache[ent] = {};
66823           }
66824
66825           if (!_cache[ent].parents) {
66826               var parents = [];
66827               if (geometry === 'vertex') {
66828                   parents = resolver.parentWays(entity);
66829               } else {   // 'line', 'area', 'relation'
66830                   parents = resolver.parentRelations(entity);
66831               }
66832               _cache[ent].parents = parents;
66833           }
66834           return _cache[ent].parents;
66835       };
66836
66837
66838       features.isHiddenFeature = function(entity, resolver, geometry) {
66839           if (!_hidden.length) return false;
66840           if (!entity.version) return false;
66841
66842           var matches = features.getMatches(entity, resolver, geometry);
66843
66844           for (var i = 0; i < _hidden.length; i++) {
66845               if (matches[_hidden[i]]) return true;
66846           }
66847           return false;
66848       };
66849
66850
66851       features.isHiddenChild = function(entity, resolver, geometry) {
66852           if (!_hidden.length) return false;
66853           if (!entity.version || geometry === 'point') return false;
66854
66855           var parents = features.getParents(entity, resolver, geometry);
66856           if (!parents.length) return false;
66857
66858           for (var i = 0; i < parents.length; i++) {
66859               if (!features.isHidden(parents[i], resolver, parents[i].geometry(resolver))) {
66860                   return false;
66861               }
66862           }
66863           return true;
66864       };
66865
66866
66867       features.hasHiddenConnections = function(entity, resolver) {
66868           if (!_hidden.length) return false;
66869           var childNodes, connections;
66870
66871           if (entity.type === 'midpoint') {
66872               childNodes = [resolver.entity(entity.edge[0]), resolver.entity(entity.edge[1])];
66873               connections = [];
66874           } else {
66875               childNodes = entity.nodes ? resolver.childNodes(entity) : [];
66876               connections = features.getParents(entity, resolver, entity.geometry(resolver));
66877           }
66878
66879           // gather ways connected to child nodes..
66880           connections = reduce(childNodes, function(result, e) {
66881               return resolver.isShared(e) ? union(result, resolver.parentWays(e)) : result;
66882           }, connections);
66883
66884           return connections.length ? some(connections, function(e) {
66885               return features.isHidden(e, resolver, e.geometry(resolver));
66886           }) : false;
66887       };
66888
66889
66890       features.isHidden = function(entity, resolver, geometry) {
66891           if (!_hidden.length) return false;
66892           if (!entity.version) return false;
66893
66894           var fn = (geometry === 'vertex' ? features.isHiddenChild : features.isHiddenFeature);
66895           return fn(entity, resolver, geometry);
66896       };
66897
66898
66899       features.filter = function(d, resolver) {
66900           if (!_hidden.length) return d;
66901
66902           var result = [];
66903           for (var i = 0; i < d.length; i++) {
66904               var entity = d[i];
66905               if (!features.isHidden(entity, resolver, entity.geometry(resolver))) {
66906                   result.push(entity);
66907               }
66908           }
66909           return result;
66910       };
66911
66912
66913       features.init = function() {
66914           var storage = context.storage('disabled-features');
66915           if (storage) {
66916               var storageDisabled = storage.replace(/;/g, ',').split(',');
66917               storageDisabled.forEach(features.disable);
66918           }
66919
66920           var q = utilStringQs(window.location.hash.substring(1));
66921           if (q.disable_features) {
66922               var hashDisabled = q.disable_features.replace(/;/g, ',').split(',');
66923               hashDisabled.forEach(features.disable);
66924           }
66925       };
66926
66927       return utilRebind(features, dispatch$$1, 'on');
66928   }
66929
66930   function utilBindOnce(target, type, listener, capture) {
66931       var typeOnce = type + '.once';
66932       function one() {
66933           target.on(typeOnce, null);
66934           listener.apply(this, arguments);
66935       }
66936       target.on(typeOnce, one, capture);
66937       return this;
66938   }
66939
66940   // constants
66941   var TAU$1 = 2 * Math.PI;
66942   var TILESIZE = 256;
66943   var kMin = geoZoomToScale(2, TILESIZE);
66944   var kMax = geoZoomToScale(24, TILESIZE);
66945
66946
66947   function rendererMap(context) {
66948       var dispatch$$1 = dispatch('move', 'drawn');
66949       var projection = context.projection;
66950       var curtainProjection = context.curtainProjection;
66951       var drawLayers = svgLayers(projection, context);
66952       var drawPoints = svgPoints$$1(projection, context);
66953       var drawVertices = svgVertices$$1(projection, context);
66954       var drawLines = svgLines$$1(projection, context);
66955       var drawAreas = svgAreas$$1(projection, context);
66956       var drawMidpoints = svgMidpoints$$1(projection, context);
66957       var drawLabels = svgLabels(projection, context);
66958
66959       var _selection = select(null);
66960       var supersurface = select(null);
66961       var wrapper = select(null);
66962       var surface = select(null);
66963
66964       var dimensions = [1, 1];
66965       var _dblClickEnabled = true;
66966       var _redrawEnabled = true;
66967       var _gestureTransformStart;
66968       var _transformStart = projection.transform();
66969       var _transformLast;
66970       var _transformed = false;
66971       var minzoom = 0;
66972       var mouse$$1;
66973       var mousemove;
66974
66975       var zoom$$1 = d3_zoom()
66976           .scaleExtent([kMin, kMax])
66977           .interpolate(interpolate)
66978           .filter(zoomEventFilter)
66979           .on('zoom', zoomPan);
66980
66981       var scheduleRedraw = throttle(redraw, 750);
66982       // var isRedrawScheduled = false;
66983       // var pendingRedrawCall;
66984       // function scheduleRedraw() {
66985       //     // Only schedule the redraw if one has not already been set.
66986       //     if (isRedrawScheduled) return;
66987       //     isRedrawScheduled = true;
66988       //     var that = this;
66989       //     var args = arguments;
66990       //     pendingRedrawCall = window.requestIdleCallback(function () {
66991       //         // Reset the boolean so future redraws can be set.
66992       //         isRedrawScheduled = false;
66993       //         redraw.apply(that, args);
66994       //     }, { timeout: 1400 });
66995       // }
66996
66997       function cancelPendingRedraw() {
66998           scheduleRedraw.cancel();
66999           // isRedrawScheduled = false;
67000           // window.cancelIdleCallback(pendingRedrawCall);
67001       }
67002
67003
67004       function map(selection$$1) {
67005           _selection = selection$$1;
67006
67007           context
67008               .on('change.map', immediateRedraw);
67009
67010           var osm = context.connection();
67011           if (osm) {
67012               osm.on('change.map', immediateRedraw);
67013           }
67014
67015           context.history()
67016               .on('change.map', immediateRedraw)
67017               .on('undone.map redone.map', function(stack) {
67018                   var mode = context.mode().id;
67019                   if (mode !== 'browse' && mode !== 'select') return;
67020
67021                   var followSelected = false;
67022                   if (Array.isArray(stack.selectedIDs)) {
67023                       followSelected = (stack.selectedIDs.length === 1 && stack.selectedIDs[0][0] === 'n');
67024                       context.enter(
67025                           modeSelect(context, stack.selectedIDs).follow(followSelected)
67026                       );
67027                   }
67028                   if (!followSelected && stack.transform) {
67029                       map.transformEase(stack.transform);
67030                   }
67031               });
67032
67033           context.background()
67034               .on('change.map', immediateRedraw);
67035
67036           context.features()
67037               .on('redraw.map', immediateRedraw);
67038
67039           drawLayers
67040               .on('change.map', function() {
67041                   context.background().updateImagery();
67042                   immediateRedraw();
67043               });
67044
67045           selection$$1
67046               .on('dblclick.map', dblClick)
67047               .call(zoom$$1)
67048               .call(zoom$$1.transform, projection.transform());
67049
67050           supersurface = selection$$1.append('div')
67051               .attr('id', 'supersurface')
67052               .call(utilSetTransform, 0, 0);
67053
67054           // Need a wrapper div because Opera can't cope with an absolutely positioned
67055           // SVG element: http://bl.ocks.org/jfirebaugh/6fbfbd922552bf776c16
67056           wrapper = supersurface
67057               .append('div')
67058               .attr('class', 'layer layer-data');
67059
67060           map.surface = surface = wrapper
67061               .call(drawLayers)
67062               .selectAll('.surface')
67063               .attr('id', 'surface');
67064
67065           surface
67066               .call(drawLabels.observe)
67067               .on('gesturestart.surface', function() {
67068                   _gestureTransformStart = projection.transform();
67069               })
67070               .on('gesturechange.surface', gestureChange)
67071               .on('mousedown.zoom', function() {
67072                   if (event.button === 2) {
67073                       event.stopPropagation();
67074                   }
67075               }, true)
67076               .on('mouseup.zoom', function() {
67077                   if (resetTransform()) {
67078                       immediateRedraw();
67079                   }
67080               })
67081               .on('mousemove.map', function() {
67082                   mousemove = event;
67083               })
67084               .on('mouseover.vertices', function() {
67085                   if (map.editable() && !_transformed) {
67086                       var hover = event.target.__data__;
67087                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
67088                       dispatch$$1.call('drawn', this, { full: false });
67089                   }
67090               })
67091               .on('mouseout.vertices', function() {
67092                   if (map.editable() && !_transformed) {
67093                       var hover = event.relatedTarget && event.relatedTarget.__data__;
67094                       surface.call(drawVertices.drawHover, context.graph(), hover, map.extent());
67095                       dispatch$$1.call('drawn', this, { full: false });
67096                   }
67097               });
67098
67099           supersurface
67100               .call(context.background());
67101
67102           context.on('enter.map',  function() {
67103               if (map.editable() && !_transformed) {
67104                   // redraw immediately any objects affected by a change in selectedIDs.
67105                   var graph = context.graph();
67106                   var selectedAndParents = {};
67107                   context.selectedIDs().forEach(function(id) {
67108                       var entity = graph.hasEntity(id);
67109                       if (entity) {
67110                           selectedAndParents[entity.id] = entity;
67111                           if (entity.type === 'node') {
67112                               graph.parentWays(entity).forEach(function(parent) {
67113                                   selectedAndParents[parent.id] = parent;
67114                               });
67115                           }
67116                       }
67117                   });
67118                   var data = values$1(selectedAndParents);
67119                   var filter = function(d) { return d.id in selectedAndParents; };
67120
67121                   data = context.features().filter(data, graph);
67122
67123                   surface
67124                       .call(drawVertices.drawSelected, graph, map.extent())
67125                       .call(drawLines, graph, data, filter)
67126                       .call(drawAreas, graph, data, filter)
67127                       .call(drawMidpoints, graph, data, filter, map.trimmedExtent());
67128
67129                   dispatch$$1.call('drawn', this, { full: false });
67130
67131                   // redraw everything else later
67132                   scheduleRedraw();
67133               }
67134           });
67135
67136           map.dimensions(utilGetDimensions(selection$$1));
67137       }
67138
67139
67140       function zoomEventFilter() {
67141           // Fix for #2151, (see also d3/d3-zoom#60, d3/d3-brush#18)
67142           // Intercept `mousedown` and check if there is an orphaned zoom gesture.
67143           // This can happen if a previous `mousedown` occurred without a `mouseup`.
67144           // If we detect this, dispatch `mouseup` to complete the orphaned gesture,
67145           // so that d3-zoom won't stop propagation of new `mousedown` events.
67146           if (event.type === 'mousedown') {
67147               var hasOrphan = false;
67148               var listeners = window.__on;
67149               for (var i = 0; i < listeners.length; i++) {
67150                   var listener = listeners[i];
67151                   if (listener.name === 'zoom' && listener.type === 'mouseup') {
67152                       hasOrphan = true;
67153                       break;
67154                   }
67155               }
67156               if (hasOrphan) {
67157                   var event$$1 = window.CustomEvent;
67158                   if (event$$1) {
67159                       event$$1 = new event$$1('mouseup');
67160                   } else {
67161                       event$$1 = window.document.createEvent('Event');
67162                       event$$1.initEvent('mouseup', false, false);
67163                   }
67164                   // Event needs to be dispatched with an event.view property.
67165                   event$$1.view = window;
67166                   window.dispatchEvent(event$$1);
67167               }
67168           }
67169
67170           return event.button !== 2;   // ignore right clicks
67171       }
67172
67173
67174       function pxCenter() {
67175           return [dimensions[0] / 2, dimensions[1] / 2];
67176       }
67177
67178
67179       function drawVector(difference, extent) {
67180           var mode = context.mode();
67181           var graph = context.graph();
67182           var features = context.features();
67183           var all = context.intersects(map.extent());
67184           var fullRedraw = false;
67185           var data;
67186           var filter;
67187
67188           if (difference) {
67189               var complete = difference.complete(map.extent());
67190               data = compact(values$1(complete));
67191               filter = function(d) { return d.id in complete; };
67192               features.clear(data);
67193
67194           } else {
67195               // force a full redraw if gatherStats detects that a feature
67196               // should be auto-hidden (e.g. points or buildings)..
67197               if (features.gatherStats(all, graph, dimensions)) {
67198                   extent = undefined;
67199               }
67200
67201               if (extent) {
67202                   data = context.intersects(map.extent().intersection(extent));
67203                   var set$$1 = set$2(map$3(data, 'id'));
67204                   filter = function(d) { return set$$1.has(d.id); };
67205
67206               } else {
67207                   data = all;
67208                   fullRedraw = true;
67209                   filter = utilFunctor(true);
67210               }
67211           }
67212
67213           data = features.filter(data, graph);
67214
67215           if (mode && mode.id === 'select') {
67216               // update selected vertices - the user might have just double-clicked a way,
67217               // creating a new vertex, triggering a partial redraw without a mode change
67218               surface.call(drawVertices.drawSelected, graph, map.extent());
67219           }
67220
67221           surface
67222               .call(drawVertices, graph, data, filter, map.extent(), fullRedraw)
67223               .call(drawLines, graph, data, filter)
67224               .call(drawAreas, graph, data, filter)
67225               .call(drawMidpoints, graph, data, filter, map.trimmedExtent())
67226               .call(drawLabels, graph, data, filter, dimensions, fullRedraw)
67227               .call(drawPoints, graph, data, filter);
67228
67229           dispatch$$1.call('drawn', this, {full: true});
67230       }
67231
67232
67233       function editOff() {
67234           context.features().resetStats();
67235           surface.selectAll('.layer-osm *').remove();
67236           surface.selectAll('.layer-touch *').remove();
67237
67238           var mode = context.mode();
67239           if (mode && mode.id !== 'save' && mode.id !== 'select-note' && mode.id !== 'select-data') {
67240               context.enter(modeBrowse(context));
67241           }
67242
67243           dispatch$$1.call('drawn', this, {full: true});
67244       }
67245
67246
67247       function dblClick() {
67248           if (!_dblClickEnabled) {
67249               event.preventDefault();
67250               event.stopImmediatePropagation();
67251           }
67252       }
67253
67254
67255       function gestureChange() {
67256           // Remap Safari gesture events to wheel events - #5492
67257           // We want these disabled most places, but enabled for zoom/unzoom on map surface
67258           // https://developer.mozilla.org/en-US/docs/Web/API/GestureEvent
67259           var e = event;
67260           e.preventDefault();
67261
67262           var props = {
67263               deltaMode: 0,    // dummy values to ignore in zoomPan
67264               deltaY: 1,       // dummy values to ignore in zoomPan
67265               clientX: e.clientX,
67266               clientY: e.clientY,
67267               screenX: e.screenX,
67268               screenY: e.screenY,
67269               x: e.x,
67270               y: e.y
67271           };
67272
67273           var e2 = new WheelEvent('wheel', props);
67274           e2._scale = e.scale;         // preserve the original scale
67275           e2._rotation = e.rotation;   // preserve the original rotation
67276
67277           _selection.node().dispatchEvent(e2);
67278       }
67279
67280
67281       function zoomPan(manualEvent) {
67282           var event$$1 = (manualEvent || event);
67283           var source = event$$1.sourceEvent;
67284           var eventTransform = event$$1.transform;
67285           var x = eventTransform.x;
67286           var y = eventTransform.y;
67287           var k = eventTransform.k;
67288
67289           if (_transformStart.x === x &&
67290               _transformStart.y === y &&
67291               _transformStart.k === k) {
67292               return;  // no change
67293           }
67294
67295           // Special handling of 'wheel' events:
67296           // They might be triggered by the user scrolling the mouse wheel,
67297           // or 2-finger pinch/zoom gestures, the transform may need adjustment.
67298           if (source && source.type === 'wheel') {
67299               var detected = utilDetect();
67300               var dX = source.deltaX;
67301               var dY = source.deltaY;
67302               var x2 = x;
67303               var y2 = y;
67304               var k2 = k;
67305               var t0, p0, p1;
67306
67307               // Normalize mousewheel scroll speed (Firefox) - #3029
67308               // If wheel delta is provided in LINE units, recalculate it in PIXEL units
67309               // We are essentially redoing the calculations that occur here:
67310               //   https://github.com/d3/d3-zoom/blob/78563a8348aa4133b07cac92e2595c2227ca7cd7/src/zoom.js#L203
67311               // See this for more info:
67312               //   https://github.com/basilfx/normalize-wheel/blob/master/src/normalizeWheel.js
67313               if (source.deltaMode === 1 /* LINE */) {
67314                   // Convert from lines to pixels, more if the user is scrolling fast.
67315                   // (I made up the exp function to roughly match Firefox to what Chrome does)
67316                   var lines = Math.abs(source.deltaY);
67317                   var sign = (source.deltaY > 0) ? 1 : -1;
67318                   dY = sign * clamp(
67319                       Math.exp((lines - 1) * 0.75) * 4.000244140625,
67320                       4.000244140625,    // min
67321                       350.000244140625   // max
67322                   );
67323
67324                   // On Firefox/Windows we just always get +/- the scroll line amount (default 3)
67325                   // There doesn't seem to be any scroll accelleration.
67326                   // This multiplier increases the speed a little bit - #5512
67327                   if (detected.os === 'win') {
67328                       dY *= 5;
67329                   }
67330
67331                   // recalculate x2,y2,k2
67332                   t0 = _transformed ? _transformLast : _transformStart;
67333                   p0 = mouse$$1(source);
67334                   p1 = t0.invert(p0);
67335                   k2 = t0.k * Math.pow(2, -dY / 500);
67336                   x2 = p0[0] - p1[0] * k2;
67337                   y2 = p0[1] - p1[1] * k2;
67338
67339               // 2 finger map pinch zooming (Safari) - #5492
67340               // These are fake `wheel` events we made from Safari `gesturechange` events..
67341               } else if (source._scale) {
67342                   // recalculate x2,y2,k2
67343                   t0 = _gestureTransformStart;
67344                   p0 = mouse$$1(source);
67345                   p1 = t0.invert(p0);
67346                   k2 = t0.k * source._scale;
67347                   x2 = p0[0] - p1[0] * k2;
67348                   y2 = p0[1] - p1[1] * k2;
67349
67350               // 2 finger map pinch zooming (all browsers except Safari) - #5492
67351               // Pinch zooming via the `wheel` event will always have:
67352               // - `ctrlKey = true`
67353               // - `deltaY` is not round integer pixels (ignore `deltaX`)
67354               } else if (source.ctrlKey && !isInteger(dY)) {
67355                   dY *= 6;   // slightly scale up whatever the browser gave us
67356
67357                   // recalculate x2,y2,k2
67358                   t0 = _transformed ? _transformLast : _transformStart;
67359                   p0 = mouse$$1(source);
67360                   p1 = t0.invert(p0);
67361                   k2 = t0.k * Math.pow(2, -dY / 500);
67362                   x2 = p0[0] - p1[0] * k2;
67363                   y2 = p0[1] - p1[1] * k2;
67364
67365               // Trackpad scroll zooming with shift or alt/option key down
67366               } else if ((source.altKey || source.shiftKey) && isInteger(dY)) {
67367
67368                   // recalculate x2,y2,k2
67369                   t0 = _transformed ? _transformLast : _transformStart;
67370                   p0 = mouse$$1(source);
67371                   p1 = t0.invert(p0);
67372                   k2 = t0.k * Math.pow(2, -dY / 500);
67373                   x2 = p0[0] - p1[0] * k2;
67374                   y2 = p0[1] - p1[1] * k2;
67375
67376               // 2 finger map panning (Mac only, all browsers) - #5492, #5512
67377               // Panning via the `wheel` event will always have:
67378               // - `ctrlKey = false`
67379               // - `deltaX`,`deltaY` are round integer pixels
67380               } else if (detected.os === 'mac' && !source.ctrlKey && isInteger(dX) && isInteger(dY)) {
67381                   // Firefox will set `mozInputSource = 1` if the event was generated
67382                   // by an actual mouse wheel.  If we detect this, don't pan..
67383                   if (source.mozInputSource === undefined || source.mozInputSource !== 1) {
67384                       p1 = projection.translate();
67385                       x2 = p1[0] - dX;
67386                       y2 = p1[1] - dY;
67387                       k2 = projection.scale();
67388                   }
67389               }
67390
67391               // something changed - replace the event transform
67392               if (x2 !== x || y2 !== y || k2 !== k) {
67393                   x = x2;
67394                   y = y2;
67395                   k = k2;
67396                   eventTransform = identity$7.translate(x2, y2).scale(k2);
67397                   _selection.node().__zoom = eventTransform;
67398               }
67399
67400           }
67401
67402           if (geoScaleToZoom(k, TILESIZE) < minzoom) {
67403               surface.interrupt();
67404               uiFlash().text(t('cannot_zoom'))();
67405               setZoom(context.minEditableZoom(), true);
67406               scheduleRedraw();
67407               dispatch$$1.call('move', this, map);
67408               return;
67409           }
67410
67411           projection.transform(eventTransform);
67412
67413           var scale = k / _transformStart.k;
67414           var tX = (x / scale - _transformStart.x) * scale;
67415           var tY = (y / scale - _transformStart.y) * scale;
67416
67417           if (context.inIntro()) {
67418               curtainProjection.transform({
67419                   x: x - tX,
67420                   y: y - tY,
67421                   k: k
67422               });
67423           }
67424
67425           if (source) mousemove = event$$1;
67426           _transformed = true;
67427           _transformLast = eventTransform;
67428           utilSetTransform(supersurface, tX, tY, scale);
67429           scheduleRedraw();
67430
67431           dispatch$$1.call('move', this, map);
67432
67433
67434           function clamp(num, min, max) {
67435               return Math.max(min, Math.min(num, max));
67436           }
67437
67438           function isInteger(val) {
67439               return typeof val === 'number' && isFinite(val) && Math.floor(val) === val;
67440           }
67441       }
67442
67443
67444       function resetTransform() {
67445           if (!_transformed) return false;
67446
67447           // deprecation warning - Radial Menu to be removed in iD v3
67448           surface.selectAll('.edit-menu, .radial-menu').interrupt().remove();
67449           utilSetTransform(supersurface, 0, 0);
67450           _transformed = false;
67451           if (context.inIntro()) {
67452               curtainProjection.transform(projection.transform());
67453           }
67454           return true;
67455       }
67456
67457
67458       function redraw(difference, extent) {
67459           if (surface.empty() || !_redrawEnabled) return;
67460
67461           // If we are in the middle of a zoom/pan, we can't do differenced redraws.
67462           // It would result in artifacts where differenced entities are redrawn with
67463           // one transform and unchanged entities with another.
67464           if (resetTransform()) {
67465               difference = extent = undefined;
67466           }
67467
67468           var zoom$$1 = map.zoom();
67469           var z = String(~~zoom$$1);
67470
67471           if (surface.attr('data-zoom') !== z) {
67472               surface.attr('data-zoom', z);
67473           }
67474
67475           // class surface as `lowzoom` around z17-z18.5 (based on latitude)
67476           var lat = map.center()[1];
67477           var lowzoom = linear$2()
67478               .domain([-60, 0, 60])
67479               .range([17, 18.5, 17])
67480               .clamp(true);
67481
67482           surface
67483               .classed('low-zoom', zoom$$1 <= lowzoom(lat));
67484
67485
67486           if (!difference) {
67487               supersurface.call(context.background());
67488           }
67489
67490           wrapper
67491               .call(drawLayers);
67492
67493           // OSM
67494           if (map.editable()) {
67495               context.loadTiles(projection);
67496               drawVector(difference, extent);
67497           } else {
67498               editOff();
67499           }
67500
67501           _transformStart = projection.transform();
67502
67503           return map;
67504       }
67505
67506
67507
67508       var immediateRedraw = function(difference, extent) {
67509           if (!difference && !extent) cancelPendingRedraw();
67510           redraw(difference, extent);
67511       };
67512
67513
67514       map.mouse = function() {
67515           var event$$1 = mousemove || event;
67516           if (event$$1) {
67517               var s;
67518               while ((s = event$$1.sourceEvent)) { event$$1 = s; }
67519               return mouse$$1(event$$1);
67520           }
67521           return null;
67522       };
67523
67524
67525       // returns Lng/Lat
67526       map.mouseCoordinates = function() {
67527           var coord = map.mouse() || pxCenter();
67528           return projection.invert(coord);
67529       };
67530
67531
67532       map.dblclickEnable = function(_) {
67533           if (!arguments.length) return _dblClickEnabled;
67534           _dblClickEnabled = _;
67535           return map;
67536       };
67537
67538
67539       map.redrawEnable = function(_) {
67540           if (!arguments.length) return _redrawEnabled;
67541           _redrawEnabled = _;
67542           return map;
67543       };
67544
67545
67546       map.isTransformed = function() {
67547           return _transformed;
67548       };
67549
67550
67551       function setTransform(t2, duration, force) {
67552           var t$$1 = projection.transform();
67553           if (!force && t2.k === t$$1.k && t2.x === t$$1.x && t2.y === t$$1.y) {
67554               return false;
67555           }
67556
67557           if (duration) {
67558               _selection
67559                   .transition()
67560                   .duration(duration)
67561                   .on('start', function() { map.startEase(); })
67562                   .call(zoom$$1.transform, identity$7.translate(t2.x, t2.y).scale(t2.k));
67563           } else {
67564               projection.transform(t2);
67565               _transformStart = t2;
67566               _selection.call(zoom$$1.transform, _transformStart);
67567           }
67568       }
67569
67570
67571       function setZoom(z2, force, duration) {
67572           if (z2 === map.zoom() && !force) {
67573               return false;
67574           }
67575
67576           var k = projection.scale();
67577           var k2 = Math.max(kMin, Math.min(kMax, geoZoomToScale(z2, TILESIZE)));
67578           var center = pxCenter();
67579           var l = pointLocation(center);
67580
67581           projection.scale(k2);
67582
67583           var t$$1 = projection.translate();
67584           l = locationPoint(l);
67585
67586           t$$1[0] += center[0] - l[0];
67587           t$$1[1] += center[1] - l[1];
67588
67589           if (duration) {
67590               projection.scale(k);  // reset scale
67591               _selection
67592                   .transition()
67593                   .duration(duration)
67594                   .on('start', function() { map.startEase(); })
67595                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k2));
67596           } else {
67597               projection.translate(t$$1);
67598               _transformStart = projection.transform();
67599               _selection.call(zoom$$1.transform, _transformStart);
67600           }
67601
67602           return true;
67603
67604
67605           function locationPoint(l) {
67606               var translate = projection.translate();
67607               var scale = projection.scale() * TAU$1;
67608               return [l[0] * scale + translate[0], l[1] * scale + translate[1]];
67609           }
67610
67611           function pointLocation(p) {
67612               var translate = projection.translate();
67613               var scale = projection.scale() * TAU$1;
67614               return [(p[0] - translate[0]) / scale, (p[1] - translate[1]) / scale];
67615           }
67616       }
67617
67618
67619       function setCenter(loc2, duration) {
67620           var c = map.center();
67621           if (loc2[0] === c[0] && loc2[1] === c[1]) {
67622               return false;
67623           }
67624
67625           var t$$1 = projection.translate();
67626           var k = projection.scale();
67627           var pxC = pxCenter();
67628           var ll = projection(loc2);
67629
67630           t$$1[0] = t$$1[0] - ll[0] + pxC[0];
67631           t$$1[1] = t$$1[1] - ll[1] + pxC[1];
67632
67633           if (duration) {
67634               _selection
67635                   .transition()
67636                   .duration(duration)
67637                   .on('start', function() { map.startEase(); })
67638                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
67639           } else {
67640               projection.translate(t$$1);
67641               _transformStart = projection.transform();
67642               _selection.call(zoom$$1.transform, _transformStart);
67643           }
67644
67645           return true;
67646       }
67647
67648
67649       map.pan = function(delta, duration) {
67650           var t$$1 = projection.translate();
67651           var k = projection.scale();
67652
67653           t$$1[0] += delta[0];
67654           t$$1[1] += delta[1];
67655
67656           if (duration) {
67657               _selection
67658                   .transition()
67659                   .duration(duration)
67660                   .on('start', function() { map.startEase(); })
67661                   .call(zoom$$1.transform, identity$7.translate(t$$1[0], t$$1[1]).scale(k));
67662           } else {
67663               projection.translate(t$$1);
67664               _transformStart = projection.transform();
67665               _selection.call(zoom$$1.transform, _transformStart);
67666               dispatch$$1.call('move', this, map);
67667               immediateRedraw();
67668           }
67669
67670           return map;
67671       };
67672
67673
67674       map.dimensions = function(_) {
67675           if (!arguments.length) return dimensions;
67676           dimensions = _;
67677           drawLayers.dimensions(dimensions);
67678           context.background().dimensions(dimensions);
67679           projection.clipExtent([[0, 0], dimensions]);
67680           mouse$$1 = utilFastMouse(supersurface.node());
67681
67682           scheduleRedraw();
67683           return map;
67684       };
67685
67686
67687       function zoomIn(delta) {
67688           setZoom(~~map.zoom() + delta, true, 250);
67689       }
67690
67691       function zoomOut(delta) {
67692           setZoom(~~map.zoom() - delta, true, 250);
67693       }
67694
67695       map.zoomIn = function() { zoomIn(1); };
67696       map.zoomInFurther = function() { zoomIn(4); };
67697
67698       map.zoomOut = function() { zoomOut(1); };
67699       map.zoomOutFurther = function() { zoomOut(4); };
67700
67701
67702       map.center = function(loc2) {
67703           if (!arguments.length) {
67704               return projection.invert(pxCenter());
67705           }
67706
67707           if (setCenter(loc2)) {
67708               dispatch$$1.call('move', this, map);
67709           }
67710
67711           scheduleRedraw();
67712           return map;
67713       };
67714
67715
67716       map.zoom = function(z2) {
67717           if (!arguments.length) {
67718               return Math.max(geoScaleToZoom(projection.scale(), TILESIZE), 0);
67719           }
67720
67721           if (z2 < minzoom) {
67722               surface.interrupt();
67723               uiFlash().text(t('cannot_zoom'))();
67724               z2 = context.minEditableZoom();
67725           }
67726
67727           if (setZoom(z2)) {
67728               dispatch$$1.call('move', this, map);
67729           }
67730
67731           scheduleRedraw();
67732           return map;
67733       };
67734
67735
67736       map.zoomTo = function(entity, zoomLimits) {
67737           var extent = entity.extent(context.graph());
67738           if (!isFinite(extent.area())) return;
67739
67740           var z2 = map.trimmedExtentZoom(extent);
67741           zoomLimits = zoomLimits || [context.minEditableZoom(), 19];
67742           map.centerZoom(extent.center(), Math.min(Math.max(z2, zoomLimits[0]), zoomLimits[1]));
67743       };
67744
67745
67746       map.centerZoom = function(loc2, z2) {
67747           var centered = setCenter(loc2);
67748           var zoomed   = setZoom(z2);
67749
67750           if (centered || zoomed) {
67751               dispatch$$1.call('move', this, map);
67752           }
67753
67754           scheduleRedraw();
67755           return map;
67756       };
67757
67758
67759       map.centerEase = function(loc2, duration) {
67760           duration = duration || 250;
67761           setCenter(loc2, duration);
67762           return map;
67763       };
67764
67765
67766       map.zoomEase = function(z2, duration) {
67767           duration = duration || 250;
67768           setZoom(z2, false, duration);
67769           return map;
67770       };
67771
67772
67773       map.transformEase = function(t2, duration) {
67774           duration = duration || 250;
67775           setTransform(t2, duration, false);
67776           return map;
67777       };
67778
67779
67780       map.startEase = function() {
67781           utilBindOnce(surface, 'mousedown.ease', function() {
67782               map.cancelEase();
67783           });
67784           return map;
67785       };
67786
67787
67788       map.cancelEase = function() {
67789           _selection.interrupt();
67790           return map;
67791       };
67792
67793
67794       map.extent = function(_) {
67795           if (!arguments.length) {
67796               return new geoExtent$$1(
67797                   projection.invert([0, dimensions[1]]),
67798                   projection.invert([dimensions[0], 0])
67799               );
67800           } else {
67801               var extent = geoExtent$$1(_);
67802               map.centerZoom(extent.center(), map.extentZoom(extent));
67803           }
67804       };
67805
67806
67807       map.trimmedExtent = function(_) {
67808           if (!arguments.length) {
67809               var headerY = 60;
67810               var footerY = 30;
67811               var pad = 10;
67812               return new geoExtent$$1(
67813                   projection.invert([pad, dimensions[1] - footerY - pad]),
67814                   projection.invert([dimensions[0] - pad, headerY + pad])
67815               );
67816           } else {
67817               var extent = geoExtent$$1(_);
67818               map.centerZoom(extent.center(), map.trimmedExtentZoom(extent));
67819           }
67820       };
67821
67822
67823       function calcZoom(extent, dim) {
67824           var tl = projection([extent[0][0], extent[1][1]]);
67825           var br = projection([extent[1][0], extent[0][1]]);
67826
67827           // Calculate maximum zoom that fits extent
67828           var hFactor = (br[0] - tl[0]) / dim[0];
67829           var vFactor = (br[1] - tl[1]) / dim[1];
67830           var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
67831           var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
67832           var newZoom = map.zoom() - Math.max(hZoomDiff, vZoomDiff);
67833
67834           return newZoom;
67835       }
67836
67837
67838       map.extentZoom = function(_) {
67839           return calcZoom(geoExtent$$1(_), dimensions);
67840       };
67841
67842
67843       map.trimmedExtentZoom = function(_) {
67844           var trimY = 120;
67845           var trimX = 40;
67846           var trimmed = [dimensions[0] - trimX, dimensions[1] - trimY];
67847           return calcZoom(geoExtent$$1(_), trimmed);
67848       };
67849
67850
67851       map.editable = function() {
67852           var osmLayer = surface.selectAll('.data-layer.osm');
67853           if (!osmLayer.empty() && osmLayer.classed('disabled')) return false;
67854
67855           return map.zoom() >= context.minEditableZoom();
67856       };
67857
67858
67859       map.notesEditable = function() {
67860           var noteLayer = surface.selectAll('.data-layer.notes');
67861           if (!noteLayer.empty() && noteLayer.classed('disabled')) return false;
67862
67863           return map.zoom() >= context.minEditableZoom();
67864       };
67865
67866
67867       map.minzoom = function(_) {
67868           if (!arguments.length) return minzoom;
67869           minzoom = _;
67870           return map;
67871       };
67872
67873
67874       map.layers = drawLayers;
67875
67876
67877       return utilRebind(map, dispatch$$1, 'on');
67878   }
67879
67880   function uiMapInMap(context) {
67881
67882       function map_in_map(selection$$1) {
67883           var backgroundLayer = rendererTileLayer(context);
67884           var overlayLayers = {};
67885           var projection$$1 = geoRawMercator();
67886           var dataLayer = svgData$$1(projection$$1, context).showLabels(false);
67887           var debugLayer = svgDebug$$1(projection$$1, context);
67888           var zoom$$1 = d3_zoom()
67889               .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(24)])
67890               .on('start', zoomStarted)
67891               .on('zoom', zoomed)
67892               .on('end', zoomEnded);
67893           var isTransformed = false;
67894           var isHidden = true;
67895           var skipEvents = false;
67896           var gesture = null;
67897           var zDiff = 6;    // by default, minimap renders at (main zoom - 6)
67898           var wrap = select(null);
67899           var tiles = select(null);
67900           var viewport = select(null);
67901           var tStart;    // transform at start of gesture
67902           var tCurr;     // transform at most recent event
67903           var timeoutId;
67904
67905
67906           function zoomStarted() {
67907               if (skipEvents) return;
67908               tStart = tCurr = projection$$1.transform();
67909               gesture = null;
67910           }
67911
67912
67913           function zoomed() {
67914               if (skipEvents) return;
67915
67916               var x = event.transform.x;
67917               var y = event.transform.y;
67918               var k = event.transform.k;
67919               var isZooming = (k !== tStart.k);
67920               var isPanning = (x !== tStart.x || y !== tStart.y);
67921
67922               if (!isZooming && !isPanning) {
67923                   return;  // no change
67924               }
67925
67926               // lock in either zooming or panning, don't allow both in minimap.
67927               if (!gesture) {
67928                   gesture = isZooming ? 'zoom' : 'pan';
67929               }
67930
67931               var tMini = projection$$1.transform();
67932               var tX, tY, scale;
67933
67934               if (gesture === 'zoom') {
67935                   var dMini = utilGetDimensions(wrap);
67936                   var cMini = geoVecScale(dMini, 0.5);
67937                   scale = k / tMini.k;
67938                   tX = (cMini[0] / scale - cMini[0]) * scale;
67939                   tY = (cMini[1] / scale - cMini[1]) * scale;
67940               } else {
67941                   k = tMini.k;
67942                   scale = 1;
67943                   tX = x - tMini.x;
67944                   tY = y - tMini.y;
67945               }
67946
67947               utilSetTransform(tiles, tX, tY, scale);
67948               utilSetTransform(viewport, 0, 0, scale);
67949               isTransformed = true;
67950               tCurr = identity$7.translate(x, y).scale(k);
67951
67952               var zMain = geoScaleToZoom(context.projection.scale());
67953               var zMini = geoScaleToZoom(k);
67954
67955               zDiff = zMain - zMini;
67956
67957               queueRedraw();
67958           }
67959
67960
67961           function zoomEnded() {
67962               if (skipEvents) return;
67963               if (gesture !== 'pan') return;
67964
67965               updateProjection();
67966               gesture = null;
67967               var dMini = utilGetDimensions(wrap);
67968               var cMini = geoVecScale(dMini, 0.5);
67969               context.map().center(projection$$1.invert(cMini));   // recenter main map..
67970           }
67971
67972
67973           function updateProjection() {
67974               var loc = context.map().center();
67975               var dMini = utilGetDimensions(wrap);
67976               var cMini = geoVecScale(dMini, 0.5);
67977               var tMain = context.projection.transform();
67978               var zMain = geoScaleToZoom(tMain.k);
67979               var zMini = Math.max(zMain - zDiff, 0.5);
67980               var kMini = geoZoomToScale(zMini);
67981
67982               projection$$1
67983                   .translate([tMain.x, tMain.y])
67984                   .scale(kMini);
67985
67986               var point$$1 = projection$$1(loc);
67987               var mouse$$1 = (gesture === 'pan') ? geoVecSubtract([tCurr.x, tCurr.y], [tStart.x, tStart.y]) : [0, 0];
67988               var xMini = cMini[0] - point$$1[0] + tMain.x + mouse$$1[0];
67989               var yMini = cMini[1] - point$$1[1] + tMain.y + mouse$$1[1];
67990
67991               projection$$1
67992                   .translate([xMini, yMini])
67993                   .clipExtent([[0, 0], dMini]);
67994
67995               tCurr = projection$$1.transform();
67996
67997               if (isTransformed) {
67998                   utilSetTransform(tiles, 0, 0);
67999                   utilSetTransform(viewport, 0, 0);
68000                   isTransformed = false;
68001               }
68002
68003               zoom$$1
68004                   .scaleExtent([geoZoomToScale(0.5), geoZoomToScale(zMain - 3)]);
68005
68006               skipEvents = true;
68007               wrap.call(zoom$$1.transform, tCurr);
68008               skipEvents = false;
68009           }
68010
68011
68012           function redraw() {
68013               clearTimeout(timeoutId);
68014               if (isHidden) return;
68015
68016               updateProjection();
68017
68018               var dMini = utilGetDimensions(wrap);
68019               var zMini = geoScaleToZoom(projection$$1.scale());
68020
68021               // setup tile container
68022               tiles = wrap
68023                   .selectAll('.map-in-map-tiles')
68024                   .data([0]);
68025
68026               tiles = tiles.enter()
68027                   .append('div')
68028                   .attr('class', 'map-in-map-tiles')
68029                   .merge(tiles);
68030
68031               // redraw background
68032               backgroundLayer
68033                   .source(context.background().baseLayerSource())
68034                   .projection(projection$$1)
68035                   .dimensions(dMini);
68036
68037               var background = tiles
68038                   .selectAll('.map-in-map-background')
68039                   .data([0]);
68040
68041               background.enter()
68042                   .append('div')
68043                   .attr('class', 'map-in-map-background')
68044                   .merge(background)
68045                   .call(backgroundLayer);
68046
68047
68048               // redraw overlay
68049               var overlaySources = context.background().overlayLayerSources();
68050               var activeOverlayLayers = [];
68051               for (var i = 0; i < overlaySources.length; i++) {
68052                   if (overlaySources[i].validZoom(zMini)) {
68053                       if (!overlayLayers[i]) overlayLayers[i] = rendererTileLayer(context);
68054                       activeOverlayLayers.push(overlayLayers[i]
68055                           .source(overlaySources[i])
68056                           .projection(projection$$1)
68057                           .dimensions(dMini));
68058                   }
68059               }
68060
68061               var overlay = tiles
68062                   .selectAll('.map-in-map-overlay')
68063                   .data([0]);
68064
68065               overlay = overlay.enter()
68066                   .append('div')
68067                   .attr('class', 'map-in-map-overlay')
68068                   .merge(overlay);
68069
68070
68071               var overlays = overlay
68072                   .selectAll('div')
68073                   .data(activeOverlayLayers, function(d) { return d.source().name(); });
68074
68075               overlays.exit()
68076                   .remove();
68077
68078               overlays = overlays.enter()
68079                   .append('div')
68080                   .merge(overlays)
68081                   .each(function(layer) { select(this).call(layer); });
68082
68083
68084               var dataLayers = tiles
68085                   .selectAll('.map-in-map-data')
68086                   .data([0]);
68087
68088               dataLayers.exit()
68089                   .remove();
68090
68091               dataLayers = dataLayers.enter()
68092                   .append('svg')
68093                   .attr('class', 'map-in-map-data')
68094                   .merge(dataLayers)
68095                   .call(dataLayer)
68096                   .call(debugLayer);
68097
68098
68099               // redraw viewport bounding box
68100               if (gesture !== 'pan') {
68101                   var getPath = d3_geoPath(projection$$1);
68102                   var bbox = { type: 'Polygon', coordinates: [context.map().extent().polygon()] };
68103
68104                   viewport = wrap.selectAll('.map-in-map-viewport')
68105                       .data([0]);
68106
68107                   viewport = viewport.enter()
68108                       .append('svg')
68109                       .attr('class', 'map-in-map-viewport')
68110                       .merge(viewport);
68111
68112
68113                   var path = viewport.selectAll('.map-in-map-bbox')
68114                       .data([bbox]);
68115
68116                   path.enter()
68117                       .append('path')
68118                       .attr('class', 'map-in-map-bbox')
68119                       .merge(path)
68120                       .attr('d', getPath)
68121                       .classed('thick', function(d) { return getPath.area(d) < 30; });
68122               }
68123           }
68124
68125
68126           function queueRedraw() {
68127               clearTimeout(timeoutId);
68128               timeoutId = setTimeout(function() { redraw(); }, 750);
68129           }
68130
68131
68132           function toggle() {
68133               if (event) event.preventDefault();
68134
68135               isHidden = !isHidden;
68136
68137               select('.minimap-toggle-item')
68138                   .classed('active', !isHidden)
68139                   .select('input')
68140                   .property('checked', !isHidden);
68141
68142               if (isHidden) {
68143                   wrap
68144                       .style('display', 'block')
68145                       .style('opacity', '1')
68146                       .transition()
68147                       .duration(200)
68148                       .style('opacity', '0')
68149                       .on('end', function() {
68150                           selection$$1.selectAll('.map-in-map')
68151                               .style('display', 'none');
68152                       });
68153               } else {
68154                   wrap
68155                       .style('display', 'block')
68156                       .style('opacity', '0')
68157                       .transition()
68158                       .duration(200)
68159                       .style('opacity', '1')
68160                       .on('end', function() {
68161                           redraw();
68162                       });
68163               }
68164           }
68165
68166
68167           uiMapInMap.toggle = toggle;
68168
68169           wrap = selection$$1.selectAll('.map-in-map')
68170               .data([0]);
68171
68172           wrap = wrap.enter()
68173               .append('div')
68174               .attr('class', 'map-in-map')
68175               .style('display', (isHidden ? 'none' : 'block'))
68176               .call(zoom$$1)
68177               .on('dblclick.zoom', null)
68178               .merge(wrap);
68179
68180           context.map()
68181               .on('drawn.map-in-map', function(drawn) {
68182                   if (drawn.full === true) {
68183                       redraw();
68184                   }
68185               });
68186
68187           redraw();
68188
68189           context.keybinding()
68190               .on(t('background.minimap.key'), toggle);
68191       }
68192
68193       return map_in_map;
68194   }
68195
68196   function uiSettingsCustomBackground(context) {
68197       var dispatch$$1 = dispatch('change');
68198
68199       function render(selection) {
68200           var _origSettings = {
68201               template: context.storage('background-custom-template')
68202           };
68203           var _currSettings = cloneDeep(_origSettings);
68204           var example = 'https://{switch:a,b,c}.tile.openstreetmap.org/{zoom}/{x}/{y}.png';
68205           var modal = uiConfirm(selection).okButton();
68206
68207           modal
68208               .classed('settings-modal settings-custom-background', true);
68209
68210           modal.select('.modal-section.header')
68211               .append('h3')
68212               .text(t('settings.custom_background.header'));
68213
68214
68215           var textSection = modal.select('.modal-section.message-text');
68216
68217           textSection
68218               .append('pre')
68219               .attr('class', 'instructions-template')
68220               .text(t('settings.custom_background.instructions', { example: example }));
68221
68222           textSection
68223               .append('textarea')
68224               .attr('class', 'field-template')
68225               .attr('placeholder', t('settings.custom_background.template.placeholder'))
68226               .call(utilNoAuto)
68227               .property('value', _currSettings.template);
68228
68229
68230           // insert a cancel button
68231           var buttonSection = modal.select('.modal-section.buttons');
68232
68233           buttonSection
68234               .insert('button', '.ok-button')
68235               .attr('class', 'button cancel-button secondary-action')
68236               .text(t('confirm.cancel'));
68237
68238
68239           buttonSection.select('.cancel-button')
68240               .on('click.cancel', clickCancel);
68241
68242           buttonSection.select('.ok-button')
68243               .attr('disabled', isSaveDisabled)
68244               .on('click.save', clickSave);
68245
68246
68247           function isSaveDisabled() {
68248               return null;
68249           }
68250
68251
68252           // restore the original template
68253           function clickCancel() {
68254               textSection.select('.field-template').property('value', _origSettings.template);
68255               context.storage('background-custom-template', _origSettings.template);
68256               this.blur();
68257               modal.close();
68258           }
68259
68260           // accept the current template
68261           function clickSave() {
68262               _currSettings.template = textSection.select('.field-template').property('value');
68263               context.storage('background-custom-template', _currSettings.template);
68264               this.blur();
68265               modal.close();
68266               dispatch$$1.call('change', this, _currSettings);
68267           }
68268       }
68269
68270       return utilRebind(render, dispatch$$1, 'on');
68271   }
68272
68273   function uiBackground(context) {
68274       var key = t('background.key');
68275
68276       var _customSource = context.background().findSource('custom');
68277       var _previousBackground = context.background().findSource(context.storage('background-last-used-toggle'));
68278       var _shown = false;
68279
68280       var _backgroundList = select(null);
68281       var _overlayList = select(null);
68282       var _displayOptionsContainer = select(null);
68283       var _offsetContainer = select(null);
68284
68285       var backgroundDisplayOptions = uiBackgroundDisplayOptions(context);
68286       var backgroundOffset = uiBackgroundOffset(context);
68287
68288       var settingsCustomBackground = uiSettingsCustomBackground(context)
68289           .on('change', customChanged);
68290
68291
68292       function setTooltips(selection$$1) {
68293           selection$$1.each(function(d, i, nodes) {
68294               var item = select(this).select('label');
68295               var span = item.select('span');
68296               var placement = (i < nodes.length / 2) ? 'bottom' : 'top';
68297               var description = d.description();
68298               var isOverflowing = (span.property('clientWidth') !== span.property('scrollWidth'));
68299
68300               item.call(tooltip().destroyAny);
68301
68302               if (d === _previousBackground) {
68303                   item.call(tooltip()
68304                       .placement(placement)
68305                       .html(true)
68306                       .title(function() {
68307                           var tip = '<div>' + t('background.switch') + '</div>';
68308                           return uiTooltipHtml(tip, uiCmd('⌘' + key));
68309                       })
68310                   );
68311               } else if (description || isOverflowing) {
68312                   item.call(tooltip()
68313                       .placement(placement)
68314                       .title(description || d.name())
68315                   );
68316               }
68317           });
68318       }
68319
68320
68321       function updateLayerSelections(selection$$1) {
68322           function active(d) {
68323               return context.background().showsLayer(d);
68324           }
68325
68326           selection$$1.selectAll('.layer')
68327               .classed('active', active)
68328               .classed('switch', function(d) { return d === _previousBackground; })
68329               .call(setTooltips)
68330               .selectAll('input')
68331               .property('checked', active);
68332       }
68333
68334
68335       function chooseBackground(d) {
68336           if (d.id === 'custom' && !d.template()) {
68337               return editCustom();
68338           }
68339
68340           event.preventDefault();
68341           _previousBackground = context.background().baseLayerSource();
68342           context.storage('background-last-used-toggle', _previousBackground.id);
68343           context.storage('background-last-used', d.id);
68344           context.background().baseLayerSource(d);
68345           _backgroundList.call(updateLayerSelections);
68346           document.activeElement.blur();
68347       }
68348
68349
68350       function customChanged(d) {
68351           if (d && d.template) {
68352               _customSource.template(d.template);
68353               chooseBackground(_customSource);
68354           } else {
68355               _customSource.template('');
68356               chooseBackground(context.background().findSource('none'));
68357           }
68358       }
68359
68360
68361       function editCustom() {
68362           event.preventDefault();
68363           context.container()
68364               .call(settingsCustomBackground);
68365       }
68366
68367
68368       function chooseOverlay(d) {
68369           event.preventDefault();
68370           context.background().toggleOverlayLayer(d);
68371           _overlayList.call(updateLayerSelections);
68372           document.activeElement.blur();
68373       }
68374
68375
68376       function drawListItems(layerList, type, change, filter) {
68377           var sources = context.background()
68378               .sources(context.map().extent())
68379               .filter(filter);
68380
68381           var layerLinks = layerList.selectAll('li.layer')
68382               .data(sources, function(d) { return d.name(); });
68383
68384           layerLinks.exit()
68385               .remove();
68386
68387           var enter = layerLinks.enter()
68388               .append('li')
68389               .attr('class', 'layer')
68390               .classed('layer-custom', function(d) { return d.id === 'custom'; })
68391               .classed('best', function(d) { return d.best(); });
68392
68393           enter.filter(function(d) { return d.id === 'custom'; })
68394               .append('button')
68395               .attr('class', 'layer-browse')
68396               .call(tooltip()
68397                   .title(t('settings.custom_background.tooltip'))
68398                   .placement((textDirection === 'rtl') ? 'right' : 'left')
68399               )
68400               .on('click', editCustom)
68401               .call(svgIcon('#iD-icon-more'));
68402
68403           enter.filter(function(d) { return d.best(); })
68404               .append('div')
68405               .attr('class', 'best')
68406               .call(tooltip()
68407                   .title(t('background.best_imagery'))
68408                   .placement((textDirection === 'rtl') ? 'right' : 'left')
68409               )
68410               .append('span')
68411               .html('&#9733;');
68412
68413           var label = enter
68414               .append('label');
68415
68416           label
68417               .append('input')
68418               .attr('type', type)
68419               .attr('name', 'layers')
68420               .on('change', change);
68421
68422           label
68423               .append('span')
68424               .text(function(d) { return d.name(); });
68425
68426
68427           layerList.selectAll('li.layer')
68428               .sort(sortSources)
68429               .style('display', layerList.selectAll('li.layer').data().length > 0 ? 'block' : 'none');
68430
68431           layerList
68432               .call(updateLayerSelections);
68433
68434
68435           function sortSources(a, b) {
68436               return a.best() && !b.best() ? -1
68437                   : b.best() && !a.best() ? 1
68438                   : d3_descending(a.area(), b.area()) || ascending(a.name(), b.name()) || 0;
68439           }
68440       }
68441
68442
68443       function renderBackgroundList(selection$$1) {
68444
68445           // the background list
68446           var container = selection$$1.selectAll('.layer-background-list')
68447               .data([0]);
68448
68449           _backgroundList = container.enter()
68450               .append('ul')
68451               .attr('class', 'layer-list layer-background-list')
68452               .attr('dir', 'auto')
68453               .merge(container);
68454
68455
68456           // add minimap toggle below list
68457           var minimapEnter = selection$$1.selectAll('.minimap-toggle-list')
68458               .data([0])
68459               .enter()
68460               .append('ul')
68461               .attr('class', 'layer-list minimap-toggle-list')
68462               .append('li')
68463               .attr('class', 'layer minimap-toggle-item');
68464
68465           var minimapLabelEnter = minimapEnter
68466               .append('label')
68467               .call(tooltip()
68468                   .html(true)
68469                   .title(uiTooltipHtml(t('background.minimap.tooltip'), t('background.minimap.key')))
68470                   .placement('top')
68471               );
68472
68473           minimapLabelEnter
68474               .append('input')
68475               .attr('type', 'checkbox')
68476               .on('change', function() {
68477                   event.preventDefault();
68478                   uiMapInMap.toggle();
68479               });
68480
68481           minimapLabelEnter
68482               .append('span')
68483               .text(t('background.minimap.description'));
68484
68485
68486           // "Info / Report a Problem" link
68487           selection$$1.selectAll('.imagery-faq')
68488               .data([0])
68489               .enter()
68490               .append('div')
68491               .attr('class', 'imagery-faq')
68492               .append('a')
68493               .attr('target', '_blank')
68494               .attr('tabindex', -1)
68495               .call(svgIcon('#iD-icon-out-link', 'inline'))
68496               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/FAQ.md#how-can-i-report-an-issue-with-background-imagery')
68497               .append('span')
68498               .text(t('background.imagery_source_faq'));
68499       }
68500
68501
68502       function renderOverlayList(selection$$1) {
68503           var container = selection$$1.selectAll('.layer-overlay-list')
68504               .data([0]);
68505
68506           _overlayList = container.enter()
68507               .append('ul')
68508               .attr('class', 'layer-list layer-overlay-list')
68509               .attr('dir', 'auto')
68510               .merge(container);
68511       }
68512
68513
68514       function update() {
68515           _backgroundList
68516               .call(drawListItems, 'radio', chooseBackground, function(d) { return !d.isHidden() && !d.overlay; });
68517
68518           _overlayList
68519               .call(drawListItems, 'checkbox', chooseOverlay, function(d) { return !d.isHidden() && d.overlay; });
68520
68521           _displayOptionsContainer
68522               .call(backgroundDisplayOptions);
68523
68524           _offsetContainer
68525               .call(backgroundOffset);
68526       }
68527
68528
68529       function quickSwitch() {
68530           if (event) {
68531               event.stopImmediatePropagation();
68532               event.preventDefault();
68533           }
68534           if (_previousBackground) {
68535               chooseBackground(_previousBackground);
68536           }
68537       }
68538
68539
68540       function background(selection$$1) {
68541
68542           function hidePane() {
68543               setVisible(false);
68544           }
68545
68546           function togglePane() {
68547               if (event) event.preventDefault();
68548               paneTooltip.hide(button);
68549               setVisible(!button.classed('active'));
68550           }
68551
68552           function setVisible(show) {
68553               if (show !== _shown) {
68554                   button.classed('active', show);
68555                   _shown = show;
68556
68557                   if (show) {
68558                       uiMapData.hidePane();
68559                       uiHelp.hidePane();
68560                       update();
68561
68562                       pane
68563                           .style('display', 'block')
68564                           .style('right', '-300px')
68565                           .transition()
68566                           .duration(200)
68567                           .style('right', '0px');
68568
68569                   } else {
68570                       pane
68571                           .style('display', 'block')
68572                           .style('right', '0px')
68573                           .transition()
68574                           .duration(200)
68575                           .style('right', '-300px')
68576                           .on('end', function() {
68577                               select(this).style('display', 'none');
68578                           });
68579                   }
68580               }
68581           }
68582
68583
68584           var pane = selection$$1
68585               .append('div')
68586               .attr('class', 'fillL map-pane hide');
68587
68588           var paneTooltip = tooltip()
68589               .placement((textDirection === 'rtl') ? 'right' : 'left')
68590               .html(true)
68591               .title(uiTooltipHtml(t('background.description'), key));
68592
68593           var button = selection$$1
68594               .append('button')
68595               .attr('tabindex', -1)
68596               .on('click', togglePane)
68597               .call(svgIcon('#iD-icon-layers', 'light'))
68598               .call(paneTooltip);
68599
68600
68601           var heading = pane
68602               .append('div')
68603               .attr('class', 'pane-heading');
68604
68605           heading
68606               .append('h2')
68607               .text(t('background.title'));
68608
68609           heading
68610               .append('button')
68611               .on('click', function() { uiBackground.hidePane(); })
68612               .call(svgIcon('#iD-icon-close'));
68613
68614
68615           var content = pane
68616               .append('div')
68617               .attr('class', 'pane-content');
68618
68619           // background list
68620           content
68621               .append('div')
68622               .attr('class', 'background-background-list-container')
68623               .call(uiDisclosure(context, 'background_list', true)
68624                   .title(t('background.backgrounds'))
68625                   .content(renderBackgroundList)
68626               );
68627
68628           // overlay list
68629           content
68630               .append('div')
68631               .attr('class', 'background-overlay-list-container')
68632               .call(uiDisclosure(context, 'overlay_list', true)
68633                   .title(t('background.overlays'))
68634                   .content(renderOverlayList)
68635               );
68636
68637           // display options
68638           _displayOptionsContainer = content
68639               .append('div')
68640               .attr('class', 'background-display-options');
68641
68642           // offset controls
68643           _offsetContainer = content
68644               .append('div')
68645               .attr('class', 'background-offset');
68646
68647
68648           // add listeners
68649           context.map()
68650               .on('move.background-update', debounce(utilCallWhenIdle(update), 1000));
68651
68652           context.background()
68653               .on('change.background-update', update);
68654
68655
68656           update();
68657
68658           context.keybinding()
68659               .on(key, togglePane)
68660               .on(uiCmd('⌘' + key), quickSwitch);
68661
68662           uiBackground.hidePane = hidePane;
68663           uiBackground.togglePane = togglePane;
68664           uiBackground.setVisible = setVisible;
68665       }
68666
68667       return background;
68668   }
68669
68670   function uiContributors(context) {
68671       var osm = context.connection(),
68672           debouncedUpdate = debounce(function() { update(); }, 1000),
68673           limit = 4,
68674           hidden = false,
68675           wrap = select(null);
68676
68677
68678       function update() {
68679           if (!osm) return;
68680
68681           var users = {},
68682               entities = context.intersects(context.map().extent());
68683
68684           entities.forEach(function(entity) {
68685               if (entity && entity.user) users[entity.user] = true;
68686           });
68687
68688           var u = Object.keys(users),
68689               subset = u.slice(0, u.length > limit ? limit - 1 : limit);
68690
68691           wrap.html('')
68692               .call(svgIcon('#iD-icon-nearby', 'pre-text light'));
68693
68694           var userList = select(document.createElement('span'));
68695
68696           userList.selectAll()
68697               .data(subset)
68698               .enter()
68699               .append('a')
68700               .attr('class', 'user-link')
68701               .attr('href', function(d) { return osm.userURL(d); })
68702               .attr('target', '_blank')
68703               .attr('tabindex', -1)
68704               .text(String);
68705
68706           if (u.length > limit) {
68707               var count = select(document.createElement('span'));
68708
68709               count.append('a')
68710                   .attr('target', '_blank')
68711                   .attr('tabindex', -1)
68712                   .attr('href', function() {
68713                       return osm.changesetsURL(context.map().center(), context.map().zoom());
68714                   })
68715                   .text(u.length - limit + 1);
68716
68717               wrap.append('span')
68718                   .html(t('contributors.truncated_list', { users: userList.html(), count: count.html() }));
68719
68720           } else {
68721               wrap.append('span')
68722                   .html(t('contributors.list', { users: userList.html() }));
68723           }
68724
68725           if (!u.length) {
68726               hidden = true;
68727               wrap
68728                   .transition()
68729                   .style('opacity', 0);
68730
68731           } else if (hidden) {
68732               wrap
68733                   .transition()
68734                   .style('opacity', 1);
68735           }
68736       }
68737
68738
68739       return function(selection$$1) {
68740           if (!osm) return;
68741           wrap = selection$$1;
68742           update();
68743
68744           osm.on('loaded.contributors', debouncedUpdate);
68745           context.map().on('move.contributors', debouncedUpdate);
68746       };
68747   }
68748
68749   function uiFeatureInfo(context) {
68750       function update(selection$$1) {
68751           var features = context.features(),
68752               stats = features.stats(),
68753               count = 0,
68754               hiddenList = compact(map$3(features.hidden(), function(k) {
68755                   if (stats[k]) {
68756                       count += stats[k];
68757                       return String(stats[k]) + ' ' + t('feature.' + k + '.description');
68758                   }
68759               }));
68760
68761           selection$$1.html('');
68762
68763           if (hiddenList.length) {
68764               var tooltipBehavior = tooltip()
68765                   .placement('top')
68766                   .html(true)
68767                   .title(function() {
68768                       return uiTooltipHtml(hiddenList.join('<br/>'));
68769                   });
68770
68771               var warning = selection$$1.append('a')
68772                   .attr('href', '#')
68773                   .attr('tabindex', -1)
68774                   .html(t('feature_info.hidden_warning', { count: count }))
68775                   .call(tooltipBehavior)
68776                   .on('click', function() {
68777                       tooltipBehavior.hide(warning);
68778                       // open map data panel?
68779                       event.preventDefault();
68780                   });
68781           }
68782
68783           selection$$1
68784               .classed('hide', !hiddenList.length);
68785       }
68786
68787
68788       return function(selection$$1) {
68789           update(selection$$1);
68790
68791           context.features().on('change.feature_info', function() {
68792               update(selection$$1);
68793           });
68794       };
68795   }
68796
68797   function uiFullScreen(context) {
68798       var element = context.container().node();
68799       // var button = d3_select(null);
68800
68801
68802       function getFullScreenFn() {
68803           if (element.requestFullscreen) {
68804               return element.requestFullscreen;
68805           } else if (element.msRequestFullscreen) {
68806               return element.msRequestFullscreen;
68807           } else if (element.mozRequestFullScreen) {
68808               return element.mozRequestFullScreen;
68809           } else if (element.webkitRequestFullscreen) {
68810               return element.webkitRequestFullscreen;
68811           }
68812       }
68813
68814
68815       function getExitFullScreenFn() {
68816           if (document.exitFullscreen) {
68817               return document.exitFullscreen;
68818           } else if (document.msExitFullscreen) {
68819               return document.msExitFullscreen;
68820           } else if (document.mozCancelFullScreen) {
68821               return document.mozCancelFullScreen;
68822           } else if (document.webkitExitFullscreen) {
68823               return document.webkitExitFullscreen;
68824           }
68825       }
68826
68827
68828       function isFullScreen() {
68829           return document.fullscreenElement ||
68830               document.mozFullScreenElement ||
68831               document.webkitFullscreenElement ||
68832               document.msFullscreenElement;
68833       }
68834
68835
68836       function isSupported() {
68837           return !!getFullScreenFn();
68838       }
68839
68840
68841       function fullScreen() {
68842           event.preventDefault();
68843           if (!isFullScreen()) {
68844               // button.classed('active', true);
68845               getFullScreenFn().apply(element);
68846           } else {
68847               // button.classed('active', false);
68848               getExitFullScreenFn().apply(document);
68849           }
68850       }
68851
68852
68853       return function() { // selection) {
68854           if (!isSupported()) return;
68855
68856           // button = selection.append('button')
68857           //     .attr('title', t('full_screen'))
68858           //     .attr('tabindex', -1)
68859           //     .on('click', fullScreen)
68860           //     .call(tooltip);
68861
68862           // button.append('span')
68863           //     .attr('class', 'icon full-screen');
68864
68865           var detected = utilDetect();
68866           var keys = (detected.os === 'mac' ? [uiCmd('⌃⌘F'), 'f11'] : ['f11']);
68867           context.keybinding().on(keys, fullScreen);
68868       };
68869   }
68870
68871   function uiLoading(context) {
68872       var _modalSelection = select(null);
68873       var _message = '';
68874       var _blocking = false;
68875
68876
68877       var loading = function(selection$$1) {
68878           _modalSelection = uiModal(selection$$1, _blocking);
68879
68880           var loadertext = _modalSelection.select('.content')
68881               .classed('loading-modal', true)
68882               .append('div')
68883               .attr('class', 'modal-section fillL');
68884
68885           loadertext
68886               .append('img')
68887               .attr('class', 'loader')
68888               .attr('src', context.imagePath('loader-white.gif'));
68889
68890           loadertext
68891               .append('h3')
68892               .text(_message);
68893
68894           _modalSelection.select('button.close')
68895               .attr('class', 'hide');
68896
68897           return loading;
68898       };
68899
68900
68901       loading.message = function(_) {
68902           if (!arguments.length) return _message;
68903           _message = _;
68904           return loading;
68905       };
68906
68907
68908       loading.blocking = function(_) {
68909           if (!arguments.length) return _blocking;
68910           _blocking = _;
68911           return loading;
68912       };
68913
68914
68915       loading.close = function() {
68916           _modalSelection.remove();
68917       };
68918
68919
68920       return loading;
68921   }
68922
68923   function uiGeolocate(context) {
68924       var geoOptions = { enableHighAccuracy: false, timeout: 6000 /* 6sec */ },
68925           locating = uiLoading(context).message(t('geolocate.locating')).blocking(true),
68926           timeoutId;
68927
68928
68929       function click() {
68930           if (context.inIntro()) return;
68931           context.enter(modeBrowse(context));
68932           context.container().call(locating);
68933           navigator.geolocation.getCurrentPosition(success, error, geoOptions);
68934
68935           // This timeout ensures that we still call finish() even if
68936           // the user declines to share their location in Firefox
68937           timeoutId = setTimeout(finish, 10000 /* 10sec */ );
68938       }
68939
68940
68941       function success(position) {
68942           var map = context.map(),
68943               extent = geoExtent$$1([position.coords.longitude, position.coords.latitude])
68944                   .padByMeters(position.coords.accuracy);
68945
68946           map.centerZoom(extent.center(), Math.min(20, map.extentZoom(extent)));
68947           finish();
68948       }
68949
68950
68951       function error() {
68952           finish();
68953       }
68954
68955
68956       function finish() {
68957           locating.close();  // unblock ui
68958           if (timeoutId) { clearTimeout(timeoutId); }
68959           timeoutId = undefined;
68960       }
68961
68962
68963       return function(selection) {
68964           if (!navigator.geolocation) return;
68965
68966           selection
68967               .append('button')
68968               .attr('tabindex', -1)
68969               .attr('title', t('geolocate.title'))
68970               .on('click', click)
68971               .call(svgIcon('#iD-icon-geolocate', 'light'))
68972               .call(tooltip()
68973                   .placement((textDirection === 'rtl') ? 'right' : 'left'));
68974       };
68975   }
68976
68977   function uiPanelBackground(context) {
68978       var background = context.background();
68979       var currSourceName = null;
68980       var metadata = {};
68981       var metadataKeys = [
68982           'zoom', 'vintage', 'source', 'description', 'resolution', 'accuracy'
68983       ];
68984
68985       var debouncedRedraw = debounce(redraw, 250);
68986
68987       function redraw(selection$$1) {
68988           var source = background.baseLayerSource();
68989           var isDG = (source.id.match(/^DigitalGlobe/i) !== null);
68990
68991           if (currSourceName !== source.name()) {
68992               currSourceName = source.name();
68993               metadata = {};
68994           }
68995
68996           selection$$1.html('');
68997
68998           var list = selection$$1
68999               .append('ul')
69000               .attr('class', 'background-info');
69001
69002           list
69003               .append('li')
69004               .text(currSourceName);
69005
69006           metadataKeys.forEach(function(k) {
69007               // DigitalGlobe vintage is available in raster layers for now.
69008               if (isDG && k === 'vintage') return;
69009
69010               list
69011                   .append('li')
69012                   .attr('class', 'background-info-list-' + k)
69013                   .classed('hide', !metadata[k])
69014                   .text(t('info_panels.background.' + k) + ':')
69015                   .append('span')
69016                   .attr('class', 'background-info-span-' + k)
69017                   .text(metadata[k]);
69018           });
69019
69020           debouncedGetMetadata(selection$$1);
69021
69022           var toggleTiles = context.getDebug('tile') ? 'hide_tiles' : 'show_tiles';
69023
69024           selection$$1
69025               .append('a')
69026               .text(t('info_panels.background.' + toggleTiles))
69027               .attr('href', '#')
69028               .attr('class', 'button button-toggle-tiles')
69029               .on('click', function() {
69030                   event.preventDefault();
69031                   context.setDebug('tile', !context.getDebug('tile'));
69032                   selection$$1.call(redraw);
69033               });
69034
69035           if (isDG) {
69036               var key = source.id + '-vintage';
69037               var sourceVintage = context.background().findSource(key);
69038               var showsVintage = context.background().showsLayer(sourceVintage);
69039               var toggleVintage = showsVintage ? 'hide_vintage' : 'show_vintage';
69040               selection$$1
69041                   .append('a')
69042                   .text(t('info_panels.background.' + toggleVintage))
69043                   .attr('href', '#')
69044                   .attr('class', 'button button-toggle-vintage')
69045                   .on('click', function() {
69046                       event.preventDefault();
69047                       context.background().toggleOverlayLayer(sourceVintage);
69048                       selection$$1.call(redraw);
69049                   });
69050           }
69051
69052           // disable if necessary
69053           ['DigitalGlobe-Premium', 'DigitalGlobe-Standard'].forEach(function(layerId) {
69054               if (source.id !== layerId) {
69055                   var key = layerId + '-vintage';
69056                   var sourceVintage = context.background().findSource(key);
69057                   if (context.background().showsLayer(sourceVintage)) {
69058                       context.background().toggleOverlayLayer(sourceVintage);
69059                   }
69060               }
69061           });
69062       }
69063
69064
69065       var debouncedGetMetadata = debounce(getMetadata, 250);
69066
69067       function getMetadata(selection$$1) {
69068           var tile = select('.layer-background img.tile-center');   // tile near viewport center
69069           if (tile.empty()) return;
69070
69071           var sourceName = currSourceName,
69072               d = tile.datum(),
69073               zoom = (d && d.length >= 3 && d[2]) || Math.floor(context.map().zoom()),
69074               center = context.map().center();
69075
69076           // update zoom
69077           metadata.zoom = String(zoom);
69078           selection$$1.selectAll('.background-info-list-zoom')
69079               .classed('hide', false)
69080               .selectAll('.background-info-span-zoom')
69081               .text(metadata.zoom);
69082
69083           if (!d || !d.length >= 3) return;
69084
69085           background.baseLayerSource().getMetadata(center, d, function(err, result) {
69086               if (err || currSourceName !== sourceName) return;
69087
69088               // update vintage
69089               var vintage = result.vintage;
69090               metadata.vintage = (vintage && vintage.range) || t('info_panels.background.unknown');
69091               selection$$1.selectAll('.background-info-list-vintage')
69092                   .classed('hide', false)
69093                   .selectAll('.background-info-span-vintage')
69094                   .text(metadata.vintage);
69095
69096               // update other metdata
69097               without(metadataKeys, 'zoom', 'vintage')
69098                   .forEach(function(k) {
69099                       var val = result[k];
69100                       metadata[k] = val;
69101                       selection$$1.selectAll('.background-info-list-' + k)
69102                           .classed('hide', !val)
69103                           .selectAll('.background-info-span-' + k)
69104                           .text(val);
69105                   });
69106           });
69107       }
69108
69109
69110       var panel = function(selection$$1) {
69111           selection$$1.call(redraw);
69112
69113           context.map()
69114               .on('drawn.info-background', function() {
69115                   selection$$1.call(debouncedRedraw);
69116               })
69117               .on('move.info-background', function() {
69118                   selection$$1.call(debouncedGetMetadata);
69119               });
69120
69121       };
69122
69123       panel.off = function() {
69124           context.map()
69125               .on('drawn.info-background', null)
69126               .on('move.info-background', null);
69127       };
69128
69129       panel.id = 'background';
69130       panel.title = t('info_panels.background.title');
69131       panel.key = t('info_panels.background.key');
69132
69133
69134       return panel;
69135   }
69136
69137   function uiPanelHistory(context) {
69138       var osm;
69139
69140       function displayTimestamp(timestamp) {
69141           if (!timestamp) return t('info_panels.history.unknown');
69142           var detected = utilDetect();
69143           var options = {
69144               day: 'numeric', month: 'short', year: 'numeric',
69145               hour: 'numeric', minute: 'numeric', second: 'numeric'
69146           };
69147           var d = new Date(timestamp);
69148           if (isNaN(d.getTime())) return t('info_panels.history.unknown');
69149           return d.toLocaleString(detected.locale, options);
69150       }
69151
69152
69153       function displayUser(selection, userName) {
69154           if (!userName) {
69155               selection
69156                   .append('span')
69157                   .text(t('info_panels.history.unknown'));
69158               return;
69159           }
69160
69161           selection
69162               .append('span')
69163               .attr('class', 'user-name')
69164               .text(userName);
69165
69166           var links = selection
69167               .append('div')
69168               .attr('class', 'links');
69169
69170           if (osm) {
69171               links
69172                   .append('a')
69173                   .attr('class', 'user-osm-link')
69174                   .attr('href', osm.userURL(userName))
69175                   .attr('target', '_blank')
69176                   .attr('tabindex', -1)
69177                   .text('OSM');
69178           }
69179
69180           links
69181               .append('a')
69182               .attr('class', 'user-hdyc-link')
69183               .attr('href', 'https://hdyc.neis-one.org/?' + userName)
69184               .attr('target', '_blank')
69185               .attr('tabindex', -1)
69186               .text('HDYC');
69187       }
69188
69189
69190       function displayChangeset(selection, changeset) {
69191           if (!changeset) {
69192               selection
69193                   .append('span')
69194                   .text(t('info_panels.history.unknown'));
69195               return;
69196           }
69197
69198           selection
69199               .append('span')
69200               .attr('class', 'changeset-id')
69201               .text(changeset);
69202
69203           var links = selection
69204               .append('div')
69205               .attr('class', 'links');
69206
69207           if (osm) {
69208               links
69209                   .append('a')
69210                   .attr('class', 'changeset-osm-link')
69211                   .attr('href', osm.changesetURL(changeset))
69212                   .attr('target', '_blank')
69213                   .attr('tabindex', -1)
69214                   .text('OSM');
69215           }
69216
69217           links
69218               .append('a')
69219               .attr('class', 'changeset-osmcha-link')
69220               .attr('href', 'https://osmcha.mapbox.com/changesets/' + changeset)
69221               .attr('target', '_blank')
69222               .attr('tabindex', -1)
69223               .text('OSMCha');
69224       }
69225
69226
69227       function redraw(selection) {
69228           var selectedNoteID = context.selectedNoteID();
69229           osm = context.connection();
69230
69231           var selected, note, entity;
69232           if (selectedNoteID && osm) {       // selected 1 note
69233               selected = [ t('note.note') + ' ' + selectedNoteID ];
69234               note = osm.getNote(selectedNoteID);
69235           } else {                           // selected 1..n entities
69236               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
69237               if (selected.length) {
69238                   entity = context.entity(selected[0]);
69239               }
69240           }
69241
69242           var singular = selected.length === 1 ? selected[0] : null;
69243
69244           selection.html('');
69245
69246           selection
69247               .append('h4')
69248               .attr('class', 'history-heading')
69249               .text(singular || t('info_panels.history.selected', { n: selected.length }));
69250
69251           if (!singular) return;
69252
69253           if (entity) {
69254               selection.call(redrawEntity, entity);
69255           } else if (note) {
69256               selection.call(redrawNote, note);
69257           }
69258       }
69259
69260
69261       function redrawNote(selection, note) {
69262           if (!note || note.isNew()) {
69263               selection
69264                   .append('div')
69265                   .text(t('info_panels.history.note_no_history'));
69266               return;
69267           }
69268
69269           var list = selection
69270               .append('ul');
69271
69272           list
69273               .append('li')
69274               .text(t('info_panels.history.note_comments') + ':')
69275               .append('span')
69276               .text(note.comments.length);
69277
69278           if (note.comments.length) {
69279               list
69280                   .append('li')
69281                   .text(t('info_panels.history.note_created_date') + ':')
69282                   .append('span')
69283                   .text(displayTimestamp(note.comments[0].date));
69284
69285               list
69286                   .append('li')
69287                   .text(t('info_panels.history.note_created_user') + ':')
69288                   .call(displayUser, note.comments[0].user);
69289           }
69290
69291           if (osm) {
69292               selection
69293                   .append('a')
69294                   .attr('class', 'view-history-on-osm')
69295                   .attr('target', '_blank')
69296                   .attr('tabindex', -1)
69297                   .attr('href', osm.noteURL(note))
69298                   .call(svgIcon('#iD-icon-out-link', 'inline'))
69299                   .append('span')
69300                   .text(t('info_panels.history.note_link_text'));
69301           }
69302       }
69303
69304
69305       function redrawEntity(selection, entity) {
69306           if (!entity || entity.isNew()) {
69307               selection
69308                   .append('div')
69309                   .text(t('info_panels.history.no_history'));
69310               return;
69311           }
69312
69313           var list = selection
69314               .append('ul');
69315
69316           list
69317               .append('li')
69318               .text(t('info_panels.history.version') + ':')
69319               .append('span')
69320               .text(entity.version);
69321
69322           list
69323               .append('li')
69324               .text(t('info_panels.history.last_edit') + ':')
69325               .append('span')
69326               .text(displayTimestamp(entity.timestamp));
69327
69328           list
69329               .append('li')
69330               .text(t('info_panels.history.edited_by') + ':')
69331               .call(displayUser, entity.user);
69332
69333           list
69334               .append('li')
69335               .text(t('info_panels.history.changeset') + ':')
69336               .call(displayChangeset, entity.changeset);
69337
69338           if (osm) {
69339               selection
69340                   .append('a')
69341                   .attr('class', 'view-history-on-osm')
69342                   .attr('target', '_blank')
69343                   .attr('tabindex', -1)
69344                   .attr('href', osm.historyURL(entity))
69345                   .call(svgIcon('#iD-icon-out-link', 'inline'))
69346                   .append('span')
69347                   .text(t('info_panels.history.link_text'));
69348           }
69349       }
69350
69351
69352       var panel = function(selection) {
69353           selection.call(redraw);
69354
69355           context.map()
69356               .on('drawn.info-history', function() {
69357                   selection.call(redraw);
69358               });
69359
69360           context
69361               .on('enter.info-history', function() {
69362                   selection.call(redraw);
69363               });
69364       };
69365
69366       panel.off = function() {
69367           context.map().on('drawn.info-history', null);
69368           context.on('enter.info-history', null);
69369       };
69370
69371       panel.id = 'history';
69372       panel.title = t('info_panels.history.title');
69373       panel.key = t('info_panels.history.key');
69374
69375
69376       return panel;
69377   }
69378
69379   var OSM_PRECISION = 7;
69380   var locale$2 = utilDetect().locale;
69381
69382   /**
69383    * Returns a localized representation of the given length measurement.
69384    *
69385    * @param {Number} m area in meters
69386    * @param {Boolean} isImperial true for U.S. customary units; false for metric
69387    */
69388   function displayLength(m, isImperial) {
69389       var d = m * (isImperial ? 3.28084 : 1);
69390       var unit;
69391
69392       if (isImperial) {
69393           if (d >= 5280) {
69394               d /= 5280;
69395               unit = 'miles';
69396           } else {
69397               unit = 'feet';
69398           }
69399       } else {
69400           if (d >= 1000) {
69401               d /= 1000;
69402               unit = 'kilometers';
69403           } else {
69404               unit = 'meters';
69405           }
69406       }
69407
69408       return t('units.' + unit, {
69409           quantity: d.toLocaleString(locale$2, {
69410               maximumSignificantDigits: 4
69411           })
69412       });
69413   }
69414
69415   /**
69416    * Returns a localized representation of the given area measurement.
69417    *
69418    * @param {Number} m2 area in square meters
69419    * @param {Boolean} isImperial true for U.S. customary units; false for metric
69420    */
69421   function displayArea(m2, isImperial) {
69422       var d = m2 * (isImperial ? 10.7639111056 : 1);
69423       var d1, d2, area;
69424       var unit1 = '';
69425       var unit2 = '';
69426
69427       if (isImperial) {
69428           if (d >= 6969600) { // > 0.25mi² show mi²
69429               d1 = d / 27878400;
69430               unit1 = 'square_miles';
69431           } else {
69432               d1 = d;
69433               unit1 = 'square_feet';
69434           }
69435
69436           if (d > 4356 && d < 43560000) { // 0.1 - 1000 acres
69437               d2 = d / 43560;
69438               unit2 = 'acres';
69439           }
69440
69441       } else {
69442           if (d >= 250000) { // > 0.25km² show km²
69443               d1 = d / 1000000;
69444               unit1 = 'square_kilometers';
69445           } else {
69446               d1 = d;
69447               unit1 = 'square_meters';
69448           }
69449
69450           if (d > 1000 && d < 10000000) { // 0.1 - 1000 hectares
69451               d2 = d / 10000;
69452               unit2 = 'hectares';
69453           }
69454       }
69455
69456       area = t('units.' + unit1, {
69457           quantity: d1.toLocaleString(locale$2, {
69458               maximumSignificantDigits: 4
69459           })
69460       });
69461
69462       if (d2) {
69463           return t('units.area_pair', {
69464               area1: area,
69465               area2: t('units.' + unit2, {
69466                   quantity: d2.toLocaleString(locale$2, {
69467                       maximumSignificantDigits: 2
69468                   })
69469               })
69470           });
69471       } else {
69472           return area;
69473       }
69474   }
69475
69476   function wrap(x, min, max) {
69477       var d = max - min;
69478       return ((x - min) % d + d) % d + min;
69479   }
69480
69481   function clamp(x, min, max) {
69482       return Math.max(min, Math.min(x, max));
69483   }
69484
69485   function displayCoordinate(deg, pos, neg) {
69486       var min = (Math.abs(deg) - Math.floor(Math.abs(deg))) * 60;
69487       var sec = (min - Math.floor(min)) * 60;
69488       var displayDegrees = t('units.arcdegrees', {
69489           quantity: Math.floor(Math.abs(deg)).toLocaleString(locale$2)
69490       });
69491       var displayCoordinate;
69492
69493       if (Math.floor(sec) > 0) {
69494           displayCoordinate = displayDegrees +
69495               t('units.arcminutes', {
69496                   quantity: Math.floor(min).toLocaleString(locale$2)
69497               }) +
69498               t('units.arcseconds', {
69499                   quantity: Math.round(sec).toLocaleString(locale$2)
69500               });
69501       } else if (Math.floor(min) > 0) {
69502           displayCoordinate = displayDegrees +
69503               t('units.arcminutes', {
69504                   quantity: Math.round(min).toLocaleString(locale$2)
69505               });
69506       } else {
69507           displayCoordinate = t('units.arcdegrees', {
69508               quantity: Math.round(Math.abs(deg)).toLocaleString(locale$2)
69509           });
69510       }
69511
69512       if (deg === 0) {
69513           return displayCoordinate;
69514       } else {
69515           return t('units.coordinate', {
69516               coordinate: displayCoordinate,
69517               direction: t('units.' + (deg > 0 ? pos : neg))
69518           });
69519       }
69520   }
69521
69522   /**
69523    * Returns given coordinate pair in degree-minute-second format.
69524    *
69525    * @param {Array<Number>} coord longitude and latitude
69526    */
69527   function dmsCoordinatePair(coord) {
69528       return t('units.coordinate_pair', {
69529           latitude: displayCoordinate(clamp(coord[1], -90, 90), 'north', 'south'),
69530           longitude: displayCoordinate(wrap(coord[0], -180, 180), 'east', 'west')
69531       });
69532   }
69533
69534   /**
69535    * Returns the given coordinate pair in decimal format.
69536    * note: unlocalized to avoid comma ambiguity - see #4765
69537    *
69538    * @param {Array<Number>} coord longitude and latitude
69539    */
69540   function decimalCoordinatePair(coord) {
69541       return t('units.coordinate_pair', {
69542           latitude: clamp(coord[1], -90, 90).toFixed(OSM_PRECISION),
69543           longitude: wrap(coord[0], -180, 180).toFixed(OSM_PRECISION)
69544       });
69545   }
69546
69547   function uiPanelLocation(context) {
69548       var currLocation = '';
69549
69550
69551       function redraw(selection) {
69552           selection.html('');
69553
69554           var list = selection
69555               .append('ul');
69556
69557           // Mouse coordinates
69558           var coord = context.map().mouseCoordinates();
69559           if (coord.some(isNaN)) {
69560               coord = context.map().center();
69561           }
69562
69563           list
69564               .append('li')
69565               .text(dmsCoordinatePair(coord))
69566               .append('li')
69567               .text(decimalCoordinatePair(coord));
69568
69569           // Location Info
69570           selection
69571               .append('div')
69572               .attr('class', 'location-info')
69573               .text(currLocation || ' ');
69574
69575           debouncedGetLocation(selection, coord);
69576       }
69577
69578
69579       var debouncedGetLocation = debounce(getLocation, 250);
69580       function getLocation(selection, coord) {
69581           if (!services.geocoder) {
69582               currLocation = t('info_panels.location.unknown_location');
69583               selection.selectAll('.location-info')
69584                   .text(currLocation);
69585           } else {
69586               services.geocoder.reverse(coord, function(err, result) {
69587                   currLocation = result ? result.display_name : t('info_panels.location.unknown_location');
69588                   selection.selectAll('.location-info')
69589                       .text(currLocation);
69590               });
69591           }
69592       }
69593
69594
69595       var panel = function(selection) {
69596           selection.call(redraw);
69597
69598           context.surface()
69599               .on('mousemove.info-location', function() {
69600                   selection.call(redraw);
69601               });
69602       };
69603
69604       panel.off = function() {
69605           context.surface()
69606               .on('mousemove.info-location', null);
69607       };
69608
69609       panel.id = 'location';
69610       panel.title = t('info_panels.location.title');
69611       panel.key = t('info_panels.location.key');
69612
69613
69614       return panel;
69615   }
69616
69617   function uiPanelMeasurement(context) {
69618       var locale = utilDetect().locale,
69619           isImperial = (locale.toLowerCase() === 'en-us');
69620
69621
69622       function radiansToMeters(r) {
69623           // using WGS84 authalic radius (6371007.1809 m)
69624           return r * 6371007.1809;
69625       }
69626
69627       function steradiansToSqmeters(r) {
69628           // http://gis.stackexchange.com/a/124857/40446
69629           return r / (4 * Math.PI) * 510065621724000;
69630       }
69631
69632
69633       function toLineString(feature) {
69634           if (feature.type === 'LineString') return feature;
69635
69636           var result = { type: 'LineString', coordinates: [] };
69637           if (feature.type === 'Polygon') {
69638               result.coordinates = feature.coordinates[0];
69639           } else if (feature.type === 'MultiPolygon') {
69640               result.coordinates = feature.coordinates[0][0];
69641           }
69642
69643           return result;
69644       }
69645
69646
69647       function nodeCount(feature) {
69648         if (feature.type === 'LineString') return feature.coordinates.length;
69649         if (feature.type === 'Polygon') return feature.coordinates[0].length - 1;
69650       }
69651
69652
69653       function redraw(selection$$1) {
69654           var resolver = context.graph();
69655           var selectedNoteID = context.selectedNoteID();
69656           var osm = services.osm;
69657
69658           var selected, center, entity, note, geometry;
69659
69660           if (selectedNoteID && osm) {       // selected 1 note
69661               selected = [ t('note.note') + ' ' + selectedNoteID ];
69662               note = osm.getNote(selectedNoteID);
69663               center = note.loc;
69664               geometry = 'note';
69665
69666           } else {                           // selected 1..n entities
69667               var extent = geoExtent$$1();
69668               selected = filter(context.selectedIDs(), function(e) { return context.hasEntity(e); });
69669               if (selected.length) {
69670                   for (var i = 0; i < selected.length; i++) {
69671                       entity = context.entity(selected[i]);
69672                       extent._extend(entity.extent(resolver));
69673                   }
69674                   center = extent.center();
69675                   geometry = entity.geometry(resolver);
69676               }
69677           }
69678
69679           var singular = selected.length === 1 ? selected[0] : null;
69680
69681           selection$$1.html('');
69682
69683           selection$$1
69684               .append('h4')
69685               .attr('class', 'measurement-heading')
69686               .text(singular || t('info_panels.measurement.selected', { n: selected.length.toLocaleString(locale) }));
69687
69688           if (!selected.length) return;
69689
69690
69691           var list = selection$$1
69692               .append('ul');
69693           var coordItem;
69694
69695           // multiple selected features, just display extent center..
69696           if (!singular) {
69697               coordItem = list
69698                   .append('li')
69699                   .text(t('info_panels.measurement.center') + ':');
69700               coordItem.append('span')
69701                   .text(dmsCoordinatePair(center));
69702               coordItem.append('span')
69703                   .text(decimalCoordinatePair(center));
69704               return;
69705           }
69706
69707           // single selected feature, display details..
69708           if (geometry === 'line' || geometry === 'area') {
69709               var closed = (entity.type === 'relation') || (entity.isClosed() && !entity.isDegenerate());
69710               var feature = entity.asGeoJSON(resolver);
69711               var length = radiansToMeters(length$1(toLineString(feature)));
69712               var lengthLabel = t('info_panels.measurement.' + (closed ? 'perimeter' : 'length'));
69713               var centroid = d3_geoCentroid(feature);
69714
69715               list
69716                   .append('li')
69717                   .text(t('info_panels.measurement.geometry') + ':')
69718                   .append('span')
69719                   .text(
69720                       closed ? t('info_panels.measurement.closed_' + geometry) : t('geometry.' + geometry)
69721                   );
69722
69723               if (entity.type !== 'relation') {
69724                   list
69725                       .append('li')
69726                       .text(t('info_panels.measurement.node_count') + ':')
69727                       .append('span')
69728                       .text(nodeCount(feature).toLocaleString(locale));
69729               }
69730
69731               if (closed) {
69732                   var area = steradiansToSqmeters(entity.area(resolver));
69733                   list
69734                       .append('li')
69735                       .text(t('info_panels.measurement.area') + ':')
69736                       .append('span')
69737                       .text(displayArea(area, isImperial));
69738               }
69739
69740
69741               list
69742                   .append('li')
69743                   .text(lengthLabel + ':')
69744                   .append('span')
69745                   .text(displayLength(length, isImperial));
69746
69747               coordItem = list
69748                   .append('li')
69749                   .text(t('info_panels.measurement.centroid') + ':');
69750               coordItem.append('span')
69751                   .text(dmsCoordinatePair(centroid));
69752               coordItem.append('span')
69753                   .text(decimalCoordinatePair(centroid));
69754
69755               var toggle  = isImperial ? 'imperial' : 'metric';
69756
69757               selection$$1
69758                   .append('a')
69759                   .text(t('info_panels.measurement.' + toggle))
69760                   .attr('href', '#')
69761                   .attr('class', 'button button-toggle-units')
69762                   .on('click', function() {
69763                       event.preventDefault();
69764                       isImperial = !isImperial;
69765                       selection$$1.call(redraw);
69766                   });
69767
69768           } else {
69769               var centerLabel = t('info_panels.measurement.' +
69770                   (note || entity.type === 'node' ? 'location' : 'center'));
69771
69772               list
69773                   .append('li')
69774                   .text(t('info_panels.measurement.geometry') + ':')
69775                   .append('span')
69776                   .text(t('geometry.' + geometry));
69777
69778               coordItem = list
69779                   .append('li')
69780                   .text(centerLabel + ':');
69781               coordItem.append('span')
69782                   .text(dmsCoordinatePair(center));
69783               coordItem.append('span')
69784                   .text(decimalCoordinatePair(center));
69785           }
69786       }
69787
69788
69789       var panel = function(selection$$1) {
69790           selection$$1.call(redraw);
69791
69792           context.map()
69793               .on('drawn.info-measurement', function() {
69794                   selection$$1.call(redraw);
69795               });
69796
69797           context
69798               .on('enter.info-measurement', function() {
69799                   selection$$1.call(redraw);
69800               });
69801       };
69802
69803       panel.off = function() {
69804           context.map().on('drawn.info-measurement', null);
69805           context.on('enter.info-measurement', null);
69806       };
69807
69808       panel.id = 'measurement';
69809       panel.title = t('info_panels.measurement.title');
69810       panel.key = t('info_panels.measurement.key');
69811
69812
69813       return panel;
69814   }
69815
69816   var uiInfoPanels = {
69817       background: uiPanelBackground,
69818       history: uiPanelHistory,
69819       location: uiPanelLocation,
69820       measurement: uiPanelMeasurement,
69821   };
69822
69823   function uiInfo(context) {
69824       var ids = Object.keys(uiInfoPanels);
69825       var wasActive = ['measurement'];
69826       var panels = {};
69827       var active = {};
69828
69829       // create panels
69830       ids.forEach(function(k) {
69831           if (!panels[k]) {
69832               panels[k] = uiInfoPanels[k](context);
69833               active[k] = false;
69834           }
69835       });
69836
69837
69838       function info(selection$$1) {
69839
69840           function redraw() {
69841               var activeids = ids.filter(function(k) { return active[k]; }).sort();
69842
69843               var containers = infoPanels.selectAll('.panel-container')
69844                   .data(activeids, function(k) { return k; });
69845
69846               containers.exit()
69847                   .style('opacity', 1)
69848                   .transition()
69849                   .duration(200)
69850                   .style('opacity', 0)
69851                   .on('end', function(d) {
69852                       select(this)
69853                           .call(panels[d].off)
69854                           .remove();
69855                   });
69856
69857               var enter = containers.enter()
69858                   .append('div')
69859                   .attr('class', function(d) { return 'fillD2 panel-container panel-container-' + d; });
69860
69861               enter
69862                   .style('opacity', 0)
69863                   .transition()
69864                   .duration(200)
69865                   .style('opacity', 1);
69866
69867               var title = enter
69868                   .append('div')
69869                   .attr('class', 'panel-title fillD2');
69870
69871               title
69872                   .append('h3')
69873                   .text(function(d) { return panels[d].title; });
69874
69875               title
69876                   .append('button')
69877                   .attr('class', 'close')
69878                   .on('click', function (d) { toggle(d); })
69879                   .call(svgIcon('#iD-icon-close'));
69880
69881               enter
69882                   .append('div')
69883                   .attr('class', function(d) { return 'panel-content panel-content-' + d; });
69884
69885
69886               // redraw the panels
69887               infoPanels.selectAll('.panel-content')
69888                   .each(function(d) {
69889                       select(this).call(panels[d]);
69890                   });
69891           }
69892
69893
69894           function toggle(which) {
69895               if (event) {
69896                   event.stopImmediatePropagation();
69897                   event.preventDefault();
69898               }
69899
69900               var activeids = ids.filter(function(k) { return active[k]; });
69901
69902               if (which) {  // toggle one
69903                   active[which] = !active[which];
69904                   if (activeids.length === 1 && activeids[0] === which) {  // none active anymore
69905                       wasActive = [which];
69906                   }
69907               } else {      // toggle all
69908                   if (activeids.length) {
69909                       wasActive = activeids;
69910                       activeids.forEach(function(k) { active[k] = false; });
69911                   } else {
69912                       wasActive.forEach(function(k) { active[k] = true; });
69913                   }
69914               }
69915
69916               redraw();
69917           }
69918
69919
69920           var infoPanels = selection$$1.selectAll('.info-panels')
69921               .data([0]);
69922
69923           infoPanels = infoPanels.enter()
69924               .append('div')
69925               .attr('class', 'info-panels')
69926               .merge(infoPanels);
69927
69928           redraw();
69929
69930           context.keybinding()
69931               .on(uiCmd('⌘' + t('info_panels.key')), toggle);
69932
69933           ids.forEach(function(k) {
69934               var key = t('info_panels.' + k + '.key', { default: null });
69935               if (!key) return;
69936               context.keybinding()
69937                   .on(uiCmd('⌘⇧' + key), function() { toggle(k); });
69938           });
69939       }
69940
69941       return info;
69942   }
69943
69944   function uiModes(context) {
69945       var modes = [
69946           modeAddPoint$$1(context),
69947           modeAddLine$$1(context),
69948           modeAddArea$$1(context),
69949           modeAddNote$$1(context)
69950       ];
69951
69952
69953       function editable() {
69954           var mode = context.mode();
69955           return context.editable() && mode && mode.id !== 'save';
69956       }
69957
69958       function notesEnabled() {
69959           var noteLayer = context.layers().layer('notes');
69960           return noteLayer && noteLayer.enabled();
69961       }
69962
69963       function notesEditable() {
69964           var mode = context.mode();
69965           return context.map().notesEditable() && mode && mode.id !== 'save';
69966       }
69967
69968
69969       return function(selection$$1) {
69970           context
69971               .on('enter.editor', function(entered) {
69972                   selection$$1.selectAll('button.add-button')
69973                       .classed('active', function(mode) { return entered.button === mode.button; });
69974                   context.container()
69975                       .classed('mode-' + entered.id, true);
69976               });
69977
69978           context
69979               .on('exit.editor', function(exited) {
69980                   context.container()
69981                       .classed('mode-' + exited.id, false);
69982               });
69983
69984           modes.forEach(function(mode) {
69985               context.keybinding().on(mode.key, function() {
69986                   if (mode.id === 'add-note' && !(notesEnabled() && notesEditable())) return;
69987                   if (mode.id !== 'add-note' && !editable()) return;
69988
69989                   if (mode.id === context.mode().id) {
69990                       context.enter(modeBrowse(context));
69991                   } else {
69992                       context.enter(mode);
69993                   }
69994               });
69995           });
69996
69997
69998           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
69999
70000           context.map()
70001               .on('move.modes', debouncedUpdate)
70002               .on('drawn.modes', debouncedUpdate);
70003
70004           context
70005               .on('enter.modes', update);
70006
70007           update();
70008
70009
70010           function update() {
70011               var showNotes = notesEnabled();
70012               var data = showNotes ? modes : modes.slice(0, 3);
70013
70014               var buttons = selection$$1.selectAll('button.add-button')
70015                   .data(data, function(d) { return d.id; });
70016
70017               // exit
70018               buttons.exit()
70019                   .remove();
70020
70021               // enter
70022               var buttonsEnter = buttons.enter()
70023                   .append('button')
70024                   .attr('tabindex', -1)
70025                   .attr('class', function(d) { return d.id + ' add-button'; })
70026                   .on('click.mode-buttons', function(mode) {
70027                       // When drawing, ignore accidental clicks on mode buttons - #4042
70028                       var currMode = context.mode().id;
70029                       if (currMode.match(/^draw/) !== null) return;
70030
70031                       if (mode.id === currMode) {
70032                           context.enter(modeBrowse(context));
70033                       } else {
70034                           context.enter(mode);
70035                       }
70036                   })
70037                   .call(tooltip()
70038                       .placement('bottom')
70039                       .html(true)
70040                       .title(function(mode) {
70041                           return uiTooltipHtml(mode.description, mode.key);
70042                       })
70043                   );
70044
70045               buttonsEnter
70046                   .each(function(d) {
70047                       select(this)
70048                           .call(svgIcon('#iD-icon-' + d.button));
70049                   });
70050
70051               buttonsEnter
70052                   .append('span')
70053                   .attr('class', 'label')
70054                   .text(function(mode) { return mode.title; });
70055
70056               // if we are adding/removing the buttons, check if toolbar has overflowed
70057               if (buttons.enter().size() || buttons.exit().size()) {
70058                   context.ui().checkOverflow('#bar', true);
70059               }
70060
70061               // update
70062               buttons = buttons
70063                   .merge(buttonsEnter)
70064                   .property('disabled', function(d) {
70065                       return d.id === 'add-note' ? !notesEditable() : !editable();
70066                   });
70067           }
70068       };
70069   }
70070
70071   function uiNotice(context) {
70072
70073       return function(selection$$1) {
70074           var div = selection$$1
70075               .append('div')
70076               .attr('class', 'notice');
70077
70078           var button = div
70079               .append('button')
70080               .attr('class', 'zoom-to notice fillD')
70081               .on('click', function() {
70082                   context.map().zoomEase(context.minEditableZoom());
70083               })
70084               .on('wheel', function() {   // let wheel events pass through #4482
70085                   var e2 = new WheelEvent(event.type, event);
70086                   context.surface().node().dispatchEvent(e2);
70087               });
70088
70089           button
70090               .call(svgIcon('#iD-icon-plus', 'pre-text'))
70091               .append('span')
70092               .attr('class', 'label')
70093               .text(t('zoom_in_edit'));
70094
70095
70096           function disableTooHigh() {
70097               var canEdit = context.map().zoom() >= context.minEditableZoom();
70098               div.style('display', canEdit ? 'none' : 'block');
70099           }
70100
70101           context.map()
70102               .on('move.notice', debounce(disableTooHigh, 500));
70103
70104           disableTooHigh();
70105       };
70106   }
70107
70108   function uiPhotoviewer(context) {
70109
70110       var dispatch$$1 = dispatch('resize');
70111
70112       function photoviewer(selection$$1) {
70113           selection$$1
70114               .append('button')
70115               .attr('class', 'thumb-hide')
70116               .on('click', function () {
70117                   if (services.streetside) { services.streetside.hideViewer(); }
70118                   if (services.mapillary) { services.mapillary.hideViewer(); }
70119                   if (services.openstreetcam) { services.openstreetcam.hideViewer(); }
70120               })
70121               .append('div')
70122               .call(svgIcon('#iD-icon-close'));
70123
70124           selection$$1
70125               .append('button')
70126               .attr('class', 'resize-handle-xy')
70127               .on(
70128                   'mousedown',
70129                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnX: true, resizeOnY: true })
70130               );
70131
70132           selection$$1
70133               .append('button')
70134               .attr('class', 'resize-handle-x')
70135               .on(
70136                   'mousedown',
70137                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnX: true })
70138               );
70139
70140           selection$$1
70141               .append('button')
70142               .attr('class', 'resize-handle-y')
70143               .on(
70144                   'mousedown',
70145                   buildResizeListener(selection$$1, 'resize', dispatch$$1, { resizeOnY: true })
70146               );
70147
70148
70149           function buildResizeListener(target, eventName, dispatch$$1, options) {
70150               var resizeOnX = !!options.resizeOnX;
70151               var resizeOnY = !!options.resizeOnY;
70152               var minHeight = options.minHeight || 240;
70153               var minWidth = options.minWidth || 320;
70154               var startX;
70155               var startY;
70156               var startWidth;
70157               var startHeight;
70158
70159               function startResize() {
70160                   var mapSize = context.map().dimensions();
70161
70162                   if (resizeOnX) {
70163                       var maxWidth = mapSize[0];
70164                       var newWidth = clamp((startWidth + event.clientX - startX), minWidth, maxWidth);
70165                       target.style('width', newWidth + 'px');
70166                   }
70167
70168                   if (resizeOnY) {
70169                       var maxHeight = mapSize[1] - 90;  // preserve space at top/bottom of map
70170                       var newHeight = clamp((startHeight + startY - event.clientY), minHeight, maxHeight);
70171                       target.style('height', newHeight + 'px');
70172                   }
70173
70174                   dispatch$$1.call(eventName, target, utilGetDimensions(target, true));
70175               }
70176
70177               function clamp(num, min, max) {
70178                   return Math.max(min, Math.min(num, max));
70179               }
70180
70181               function stopResize() {
70182                   select(window)
70183                       .on('.' + eventName, null);
70184               }
70185
70186               return function initResize() {
70187                   startX = event.clientX;
70188                   startY = event.clientY;
70189                   startWidth = target.node().getBoundingClientRect().width;
70190                   startHeight = target.node().getBoundingClientRect().height;
70191
70192                   select(window)
70193                       .on('mousemove.' + eventName, startResize, false)
70194                       .on('mouseup.' + eventName, stopResize, false);
70195               };
70196           }
70197       }
70198
70199       photoviewer.onMapResize = function() {
70200           var photoviewer = select('#photoviewer');
70201           var content = select('#content');
70202           var mapDimensions = utilGetDimensions(content, true);
70203           // shrink photo viewer if it is too big
70204           // (-90 preserves space at top and bottom of map used by menus)
70205           var photoDimensions = utilGetDimensions(photoviewer, true);
70206           if (photoDimensions[0] > mapDimensions[0] || photoDimensions[1] > (mapDimensions[1] - 90)) {
70207               var setPhotoDimensions = [
70208                   Math.min(photoDimensions[0], mapDimensions[0]),
70209                   Math.min(photoDimensions[1], mapDimensions[1] - 90),
70210               ];
70211
70212               photoviewer
70213                   .style('width', setPhotoDimensions[0] + 'px')
70214                   .style('height', setPhotoDimensions[1] + 'px');
70215
70216               dispatch$$1.call('resize', photoviewer, setPhotoDimensions);
70217           }
70218       };
70219
70220       return utilRebind(photoviewer, dispatch$$1, 'on');
70221   }
70222
70223   function uiRestore(context) {
70224
70225       return function(selection) {
70226           if (!context.history().lock() || !context.history().restorableChanges())
70227               return;
70228
70229           var modalSelection = uiModal(selection, true);
70230
70231           modalSelection.select('.modal')
70232               .attr('class', 'modal fillL col6');
70233
70234           var introModal = modalSelection.select('.content');
70235
70236           introModal
70237               .attr('class','cf');
70238
70239           introModal
70240               .append('div')
70241               .attr('class', 'modal-section')
70242               .append('h3')
70243               .text(t('restore.heading'));
70244
70245           introModal
70246               .append('div')
70247               .attr('class','modal-section')
70248               .append('p')
70249               .text(t('restore.description'));
70250
70251           var buttonWrap = introModal
70252               .append('div')
70253               .attr('class', 'modal-actions cf');
70254
70255           var restore = buttonWrap
70256               .append('button')
70257               .attr('class', 'restore col6')
70258               .on('click', function() {
70259                   context.history().restore();
70260                   modalSelection.remove();
70261               });
70262
70263           restore
70264               .append('svg')
70265               .attr('class', 'logo logo-restore')
70266               .append('use')
70267               .attr('xlink:href', '#iD-logo-restore');
70268
70269           restore
70270               .append('div')
70271               .text(t('restore.restore'));
70272
70273           var reset = buttonWrap
70274               .append('button')
70275               .attr('class', 'reset col6')
70276               .on('click', function() {
70277                   context.history().clearSaved();
70278                   modalSelection.remove();
70279               });
70280
70281           reset
70282               .append('svg')
70283               .attr('class', 'logo logo-reset')
70284               .append('use')
70285               .attr('xlink:href', '#iD-logo-reset');
70286
70287           reset
70288               .append('div')
70289               .text(t('restore.reset'));
70290
70291           restore.node().focus();
70292       };
70293   }
70294
70295   function uiSave(context) {
70296       var history = context.history();
70297       var key = uiCmd('⌘S');
70298
70299
70300       function saving() {
70301           var mode = context.mode();
70302           return mode && mode.id === 'save';
70303       }
70304
70305
70306       function save() {
70307           event.preventDefault();
70308           if (!context.inIntro() && !saving() && history.hasChanges()) {
70309               context.enter(modeSave$$1(context));
70310           }
70311       }
70312
70313
70314       function getBackground(numChanges) {
70315           var step;
70316           if (numChanges === 0) {
70317               return null;
70318           } else if (numChanges <= 50) {
70319               step = numChanges / 50;
70320               return interpolateRgb('#fff', '#ff8')(step);  // white -> yellow
70321           } else {
70322               step = Math.min((numChanges - 50) / 50, 1.0);
70323               return interpolateRgb('#ff8', '#f88')(step);  // yellow -> red
70324           }
70325       }
70326
70327
70328       return function(selection$$1) {
70329           var numChanges = 0;
70330
70331           function updateCount() {
70332               var _ = history.difference().summary().length;
70333               if (_ === numChanges) return;
70334               numChanges = _;
70335
70336               tooltipBehavior
70337                   .title(uiTooltipHtml(
70338                       t(numChanges > 0 ? 'save.help' : 'save.no_changes'), key)
70339                   );
70340
70341               var background = getBackground(numChanges);
70342
70343               button
70344                   .classed('disabled', numChanges === 0)
70345                   .classed('has-count', numChanges > 0)
70346                   .style('background', background);
70347
70348               button.select('span.count')
70349                   .text(numChanges);
70350           }
70351
70352
70353           var tooltipBehavior = tooltip()
70354               .placement('bottom')
70355               .html(true)
70356               .title(uiTooltipHtml(t('save.no_changes'), key));
70357
70358           var button = selection$$1
70359               .append('button')
70360               .attr('class', 'save disabled')
70361               .attr('tabindex', -1)
70362               .on('click', save)
70363               .call(tooltipBehavior);
70364
70365           button
70366               .call(svgIcon('#iD-icon-save'));
70367
70368           button
70369               .append('span')
70370               .attr('class', 'label')
70371               .text(t('save.title'));
70372
70373           button
70374               .append('span')
70375               .attr('class', 'count')
70376               .text('0');
70377
70378           updateCount();
70379
70380
70381           context.keybinding()
70382               .on(key, save, true);
70383
70384           context.history()
70385               .on('change.save', updateCount);
70386
70387           context
70388               .on('enter.save', function() {
70389                   button.property('disabled', saving());
70390                   if (saving()) button.call(tooltipBehavior.hide);
70391               });
70392       };
70393   }
70394
70395   function uiScale(context) {
70396       var projection = context.projection,
70397           isImperial = (utilDetect().locale.toLowerCase() === 'en-us'),
70398           maxLength = 180,
70399           tickHeight = 8;
70400
70401
70402       function scaleDefs(loc1, loc2) {
70403           var lat = (loc2[1] + loc1[1]) / 2,
70404               conversion = (isImperial ? 3.28084 : 1),
70405               dist = geoLonToMeters(loc2[0] - loc1[0], lat) * conversion,
70406               scale = { dist: 0, px: 0, text: '' },
70407               buckets, i, val, dLon;
70408
70409           if (isImperial) {
70410               buckets = [5280000, 528000, 52800, 5280, 500, 50, 5, 1];
70411           } else {
70412               buckets = [5000000, 500000, 50000, 5000, 500, 50, 5, 1];
70413           }
70414
70415           // determine a user-friendly endpoint for the scale
70416           for (i = 0; i < buckets.length; i++) {
70417               val = buckets[i];
70418               if (dist >= val) {
70419                   scale.dist = Math.floor(dist / val) * val;
70420                   break;
70421               } else {
70422                   scale.dist = +dist.toFixed(2);
70423               }
70424           }
70425
70426           dLon = geoMetersToLon(scale.dist / conversion, lat);
70427           scale.px = Math.round(projection([loc1[0] + dLon, loc1[1]])[0]);
70428
70429           scale.text = displayLength(scale.dist / conversion, isImperial);
70430
70431           return scale;
70432       }
70433
70434
70435       function update(selection) {
70436           // choose loc1, loc2 along bottom of viewport (near where the scale will be drawn)
70437           var dims = context.map().dimensions(),
70438               loc1 = projection.invert([0, dims[1]]),
70439               loc2 = projection.invert([maxLength, dims[1]]),
70440               scale = scaleDefs(loc1, loc2);
70441
70442           selection.select('#scale-path')
70443               .attr('d', 'M0.5,0.5v' + tickHeight + 'h' + scale.px + 'v-' + tickHeight);
70444
70445           selection.select('#scale-textgroup')
70446               .attr('transform', 'translate(' + (scale.px + 8) + ',' + tickHeight + ')');
70447
70448           selection.select('#scale-text')
70449               .text(scale.text);
70450       }
70451
70452
70453       return function(selection) {
70454           function switchUnits() {
70455               isImperial = !isImperial;
70456               selection.call(update);
70457           }
70458
70459           var scalegroup = selection.append('svg')
70460               .attr('id', 'scale')
70461               .on('click', switchUnits)
70462               .append('g')
70463               .attr('transform', 'translate(10,11)');
70464
70465           scalegroup
70466               .append('path')
70467               .attr('id', 'scale-path');
70468
70469           scalegroup
70470               .append('g')
70471               .attr('id', 'scale-textgroup')
70472               .append('text')
70473               .attr('id', 'scale-text');
70474
70475           selection.call(update);
70476
70477           context.map().on('move.scale', function() {
70478               update(selection);
70479           });
70480       };
70481   }
70482
70483   function uiSidebar$$1(context) {
70484       var inspector = uiInspector(context);
70485       var dataEditor = uiDataEditor$$1(context);
70486       var noteEditor = uiNoteEditor$$1(context);
70487       var _current;
70488       var _wasData = false;
70489       var _wasNote = false;
70490
70491
70492       function sidebar(selection$$1) {
70493           var container = select('#id-container');
70494           var minWidth = 280;
70495           var sidebarWidth;
70496           var containerWidth;
70497           var dragOffset;
70498
70499           var resizer = selection$$1
70500               .append('div')
70501               .attr('id', 'sidebar-resizer');
70502
70503           // Set the initial width constraints
70504           selection$$1
70505               .style('min-width', minWidth + 'px')
70506               .style('max-width', '400px')
70507               .style('width', '33.3333%');
70508
70509           resizer.call(d3_drag()
70510               .container(container.node())
70511               .on('start', function() {
70512                   // offset from edge of sidebar-resizer
70513                   dragOffset = event.sourceEvent.offsetX - 1;
70514
70515                   sidebarWidth = selection$$1.node().getBoundingClientRect().width;
70516                   containerWidth = container.node().getBoundingClientRect().width;
70517                   var widthPct = (sidebarWidth / containerWidth) * 100;
70518                   selection$$1
70519                       .style('width', widthPct + '%')    // lock in current width
70520                       .style('max-width', '85%');        // but allow larger widths
70521
70522                   resizer.classed('dragging', true);
70523               })
70524               .on('drag', function() {
70525                   var isRTL = (textDirection === 'rtl');
70526                   var xMarginProperty = isRTL ? 'margin-right' : 'margin-left';
70527
70528                   var x = event.x - dragOffset;
70529                   sidebarWidth = isRTL ? containerWidth - x : x;
70530
70531                   var isCollapsed = selection$$1.classed('collapsed');
70532                   var shouldCollapse = sidebarWidth < minWidth;
70533
70534                   selection$$1.classed('collapsed', shouldCollapse);
70535
70536                   if (shouldCollapse) {
70537                       if (!isCollapsed) {
70538                           selection$$1
70539                               .style(xMarginProperty, '-400px')
70540                               .style('width', '400px');
70541
70542                           context.ui().onResize([sidebarWidth - event.dx, 0]);
70543                       }
70544
70545                   } else {
70546                       var widthPct = (sidebarWidth / containerWidth) * 100;
70547                       selection$$1
70548                           .style(xMarginProperty, null)
70549                           .style('width', widthPct + '%');
70550
70551                       if (isCollapsed) {
70552                           context.ui().onResize([-sidebarWidth, 0]);
70553                       } else {
70554                           context.ui().onResize([-event.dx, 0]);
70555                       }
70556                   }
70557               })
70558               .on('end', function() {
70559                   resizer.classed('dragging', false);
70560               })
70561           );
70562
70563           var featureListWrap = selection$$1
70564               .append('div')
70565               .attr('class', 'feature-list-pane')
70566               .call(uiFeatureList(context));
70567
70568           var inspectorWrap = selection$$1
70569               .append('div')
70570               .attr('class', 'inspector-hidden inspector-wrap fr');
70571
70572
70573           function hover(datum) {
70574               if (datum && datum.__featurehash__) {   // hovering on data
70575                   _wasData = true;
70576                   sidebar
70577                       .show(dataEditor.datum(datum));
70578
70579                   selection$$1.selectAll('.sidebar-component')
70580                       .classed('inspector-hover', true);
70581
70582               } else if (datum instanceof osmNote) {
70583                   if (context.mode().id === 'drag-note') return;
70584                   _wasNote = true;
70585
70586                   sidebar
70587                       .show(noteEditor.note(datum));
70588
70589                   selection$$1.selectAll('.sidebar-component')
70590                       .classed('inspector-hover', true);
70591
70592               } else if (!_current && (datum instanceof osmEntity$$1)) {
70593                   featureListWrap
70594                       .classed('inspector-hidden', true);
70595
70596                   inspectorWrap
70597                       .classed('inspector-hidden', false)
70598                       .classed('inspector-hover', true);
70599
70600                   if (inspector.entityID() !== datum.id || inspector.state() !== 'hover') {
70601                       inspector
70602                           .state('hover')
70603                           .entityID(datum.id);
70604
70605                       inspectorWrap
70606                           .call(inspector);
70607                   }
70608
70609               } else if (!_current) {
70610                   featureListWrap
70611                       .classed('inspector-hidden', false);
70612                   inspectorWrap
70613                       .classed('inspector-hidden', true);
70614                   inspector
70615                       .state('hide');
70616
70617               } else if (_wasData || _wasNote) {
70618                   _wasNote = false;
70619                   _wasData = false;
70620                   d3_selectAll('.note').classed('hover', false);
70621                   sidebar.hide();
70622               }
70623           }
70624
70625
70626           sidebar.hover = throttle(hover, 200);
70627
70628
70629           sidebar.intersects = function(extent) {
70630               var rect = selection$$1.node().getBoundingClientRect();
70631               return extent.intersects([
70632                   context.projection.invert([0, rect.height]),
70633                   context.projection.invert([rect.width, 0])
70634               ]);
70635           };
70636
70637
70638           sidebar.select = function(id, newFeature) {
70639               if (!_current && id) {
70640                   // uncollapse the sidebar
70641                   if (selection$$1.classed('collapsed')) {
70642                       var entity = context.entity(id);
70643                       var extent = entity.extent(context.graph());
70644                       sidebar.expand(sidebar.intersects(extent));
70645                   }
70646
70647                   featureListWrap
70648                       .classed('inspector-hidden', true);
70649
70650                   inspectorWrap
70651                       .classed('inspector-hidden', false)
70652                       .classed('inspector-hover', false);
70653
70654                   if (inspector.entityID() !== id || inspector.state() !== 'select') {
70655                       inspector
70656                           .state('select')
70657                           .entityID(id)
70658                           .newFeature(newFeature);
70659
70660                       inspectorWrap
70661                           .call(inspector);
70662                   }
70663
70664               } else if (!_current) {
70665                   featureListWrap
70666                       .classed('inspector-hidden', false);
70667                   inspectorWrap
70668                       .classed('inspector-hidden', true);
70669                   inspector
70670                       .state('hide');
70671               }
70672           };
70673
70674
70675           sidebar.show = function(component, element) {
70676               featureListWrap
70677                   .classed('inspector-hidden', true);
70678               inspectorWrap
70679                   .classed('inspector-hidden', true);
70680
70681               if (_current) _current.remove();
70682               _current = selection$$1
70683                   .append('div')
70684                   .attr('class', 'sidebar-component')
70685                   .call(component, element);
70686           };
70687
70688
70689           sidebar.hide = function() {
70690               featureListWrap
70691                   .classed('inspector-hidden', false);
70692               inspectorWrap
70693                   .classed('inspector-hidden', true);
70694
70695               if (_current) _current.remove();
70696               _current = null;
70697           };
70698
70699
70700           sidebar.expand = function(moveMap) {
70701               if (selection$$1.classed('collapsed')) {
70702                   sidebar.toggle(moveMap);
70703               }
70704           };
70705
70706
70707           sidebar.collapse = function(moveMap) {
70708               if (!selection$$1.classed('collapsed')) {
70709                   sidebar.toggle(moveMap);
70710               }
70711           };
70712
70713
70714           sidebar.toggle = function(moveMap) {
70715               var e = event;
70716               if (e && e.sourceEvent) {
70717                   e.sourceEvent.preventDefault();
70718               } else if (e) {
70719                   e.preventDefault();
70720               }
70721
70722               // Don't allow sidebar to toggle when the user is in the walkthrough.
70723               if (context.inIntro()) return;
70724
70725               var isCollapsed = selection$$1.classed('collapsed');
70726               var isCollapsing = !isCollapsed;
70727               var xMarginProperty = textDirection === 'rtl' ? 'margin-right' : 'margin-left';
70728
70729               sidebarWidth = selection$$1.node().getBoundingClientRect().width;
70730
70731               // switch from % to px
70732               selection$$1.style('width', sidebarWidth + 'px');
70733
70734               var startMargin, endMargin, lastMargin;
70735               if (isCollapsing) {
70736                   startMargin = lastMargin = 0;
70737                   endMargin = -sidebarWidth;
70738               } else {
70739                   startMargin = lastMargin = -sidebarWidth;
70740                   endMargin = 0;
70741               }
70742
70743               selection$$1.transition()
70744                   .style(xMarginProperty, endMargin + 'px')
70745                   .tween('panner', function() {
70746                       var i = interpolateNumber(startMargin, endMargin);
70747                       return function(t$$1) {
70748                           var dx = lastMargin - Math.round(i(t$$1));
70749                           lastMargin = lastMargin - dx;
70750                           context.ui().onResize(moveMap ? undefined : [dx, 0]);
70751                       };
70752                   })
70753                   .on('end', function() {
70754                       selection$$1.classed('collapsed', isCollapsing);
70755
70756                       // switch back from px to %
70757                       if (!isCollapsing) {
70758                           var containerWidth = container.node().getBoundingClientRect().width;
70759                           var widthPct = (sidebarWidth / containerWidth) * 100;
70760                           selection$$1
70761                               .style(xMarginProperty, null)
70762                               .style('width', widthPct + '%');
70763                       }
70764                   });
70765           };
70766
70767           // toggle the sidebar collapse when double-clicking the resizer
70768           resizer.on('dblclick', sidebar.toggle);
70769       }
70770
70771
70772       sidebar.hover = function() {};
70773       sidebar.hover.cancel = function() {};
70774       sidebar.intersects = function() {};
70775       sidebar.select = function() {};
70776       sidebar.show = function() {};
70777       sidebar.hide = function() {};
70778       sidebar.expand = function() {};
70779       sidebar.collapse = function() {};
70780       sidebar.toggle = function() {};
70781
70782       return sidebar;
70783   }
70784
70785   function uiSpinner(context) {
70786       var osm = context.connection();
70787
70788
70789       return function(selection) {
70790           var img = selection
70791               .append('img')
70792               .attr('src', context.imagePath('loader-black.gif'))
70793               .style('opacity', 0);
70794
70795           if (osm) {
70796               osm
70797                   .on('loading.spinner', function() {
70798                       img.transition()
70799                           .style('opacity', 1);
70800                   })
70801                   .on('loaded.spinner', function() {
70802                       img.transition()
70803                           .style('opacity', 0);
70804                   });
70805           }
70806       };
70807   }
70808
70809   function uiSplash(context) {
70810
70811       return function(selection) {
70812           if (context.storage('sawSplash'))
70813                return;
70814
70815           context.storage('sawSplash', true);
70816
70817           var modalSelection = uiModal(selection);
70818
70819           modalSelection.select('.modal')
70820               .attr('class', 'modal-splash modal col6');
70821
70822           var introModal = modalSelection.select('.content')
70823               .append('div')
70824               .attr('class', 'fillL');
70825
70826           introModal
70827               .append('div')
70828               .attr('class','modal-section cf')
70829               .append('h3').text(t('splash.welcome'));
70830
70831           introModal
70832               .append('div')
70833               .attr('class','modal-section')
70834               .append('p')
70835               .html(t('splash.text', {
70836                   version: context.version,
70837                   website: '<a href="http://ideditor.com/">ideditor.com</a>',
70838                   github: '<a href="https://github.com/openstreetmap/iD">github.com</a>'
70839               }));
70840
70841           var buttonWrap = introModal
70842               .append('div')
70843               .attr('class', 'modal-actions cf');
70844
70845           var walkthrough = buttonWrap
70846               .append('button')
70847               .attr('class', 'walkthrough col6')
70848               .on('click', function() {
70849                   context.container().call(uiIntro(context));
70850                   modalSelection.close();
70851               });
70852
70853           walkthrough
70854               .append('svg')
70855               .attr('class', 'logo logo-walkthrough')
70856               .append('use')
70857               .attr('xlink:href', '#iD-logo-walkthrough');
70858
70859           walkthrough
70860               .append('div')
70861               .text(t('splash.walkthrough'));
70862
70863           var startEditing = buttonWrap
70864               .append('button')
70865               .attr('class', 'start-editing col6')
70866               .on('click', modalSelection.close);
70867
70868           startEditing
70869               .append('svg')
70870               .attr('class', 'logo logo-features')
70871               .append('use')
70872               .attr('xlink:href', '#iD-logo-features');
70873
70874           startEditing
70875               .append('div')
70876               .text(t('splash.start'));
70877
70878
70879           modalSelection.select('button.close')
70880               .attr('class','hide');
70881
70882       };
70883   }
70884
70885   function uiStatus(context) {
70886       var osm = context.connection();
70887
70888
70889       return function(selection$$1) {
70890           if (!osm) return;
70891
70892           function update() {
70893               osm.status(function(err, apiStatus) {
70894                   selection$$1.html('');
70895
70896                   if (err) {
70897                       if (apiStatus === 'connectionSwitched') {
70898                           // if the connection was just switched, we can't rely on
70899                           // the status (we're getting the status of the previous api)
70900                           return;
70901
70902                       } else if (apiStatus === 'rateLimited') {
70903                           selection$$1
70904                               .text(t('status.rateLimit'))
70905                               .append('a')
70906                               .attr('class', 'api-status-login')
70907                               .attr('target', '_blank')
70908                               .call(svgIcon('#iD-icon-out-link', 'inline'))
70909                               .append('span')
70910                               .text(t('login'))
70911                               .on('click.login', function() {
70912                                   event.preventDefault();
70913                                   osm.authenticate();
70914                               });
70915                       } else {
70916                           // eslint-disable-next-line no-warning-comments
70917                           // TODO: nice messages for different error types
70918                           selection$$1.text(t('status.error'));
70919                       }
70920
70921                   } else if (apiStatus === 'readonly') {
70922                       selection$$1.text(t('status.readonly'));
70923                   } else if (apiStatus === 'offline') {
70924                       selection$$1.text(t('status.offline'));
70925                   }
70926
70927                   selection$$1.attr('class', 'api-status ' + (err ? 'error' : apiStatus));
70928               });
70929           }
70930
70931           osm.on('change', function() { update(selection$$1); });
70932
70933           window.setInterval(update, 90000);
70934           update(selection$$1);
70935       };
70936   }
70937
70938   function uiUndoRedo(context) {
70939       var commands = [{
70940           id: 'undo',
70941           cmd: uiCmd('⌘Z'),
70942           action: function() { if (editable()) context.undo(); },
70943           annotation: function() { return context.history().undoAnnotation(); }
70944       }, {
70945           id: 'redo',
70946           cmd: uiCmd('⌘⇧Z'),
70947           action: function() { if (editable()) context.redo(); },
70948           annotation: function() { return context.history().redoAnnotation(); }
70949       }];
70950
70951
70952       function editable() {
70953           var mode = context.mode();
70954           return context.editable() && mode && mode.id !== 'save';
70955       }
70956
70957
70958       return function(selection$$1) {
70959           var tooltipBehavior = tooltip()
70960               .placement('bottom')
70961               .html(true)
70962               .title(function (d) {
70963                   return uiTooltipHtml(d.annotation() ?
70964                       t(d.id + '.tooltip', {action: d.annotation()}) :
70965                       t(d.id + '.nothing'), d.cmd);
70966               });
70967
70968           var buttons = selection$$1.selectAll('button')
70969               .data(commands)
70970               .enter()
70971               .append('button')
70972               .attr('class', function(d) { return 'disabled ' + d.id + '-button'; })
70973               .on('click', function(d) { return d.action(); })
70974               .call(tooltipBehavior);
70975
70976           buttons.each(function(d) {
70977               var iconName = d.id;
70978               if (textDirection === 'rtl') {
70979                   if (iconName === 'undo') {
70980                       iconName = 'redo';
70981                   } else if (iconName === 'redo') {
70982                       iconName = 'undo';
70983                   }
70984               }
70985               select(this)
70986                   .call(svgIcon('#iD-icon-' + iconName));
70987           });
70988
70989           context.keybinding()
70990               .on(commands[0].cmd, function() { event.preventDefault(); commands[0].action(); })
70991               .on(commands[1].cmd, function() { event.preventDefault(); commands[1].action(); });
70992
70993
70994           var debouncedUpdate = debounce(update, 500, { leading: true, trailing: true });
70995
70996           context.map()
70997               .on('move.undo_redo', debouncedUpdate)
70998               .on('drawn.undo_redo', debouncedUpdate);
70999
71000           context.history()
71001               .on('change.undo_redo', update);
71002
71003           context
71004               .on('enter.undo_redo', update);
71005
71006
71007           function update() {
71008               buttons
71009                   .property('disabled', !editable())
71010                   .classed('disabled', function(d) { return !d.annotation(); })
71011                   .each(function() {
71012                       var selection$$1 = select(this);
71013                       if (selection$$1.property('tooltipVisible')) {
71014                           selection$$1.call(tooltipBehavior.show);
71015                       }
71016                   });
71017           }
71018       };
71019   }
71020
71021   // these are module variables so they are preserved through a ui.restart()
71022   var sawVersion = null;
71023   var isNewVersion = false;
71024   var isNewUser = false;
71025
71026
71027   function uiVersion(context) {
71028
71029       var currVersion = context.version;
71030       var matchedVersion = currVersion.match(/\d+\.\d+\.\d+.*/);
71031
71032       if (sawVersion === null && matchedVersion !== null) {
71033           isNewVersion = (context.storage('sawVersion') !== currVersion);
71034           isNewUser = !context.storage('sawSplash');
71035           context.storage('sawVersion', currVersion);
71036           sawVersion = currVersion;
71037       }
71038
71039       return function(selection) {
71040           selection
71041               .append('a')
71042               .attr('target', '_blank')
71043               .attr('tabindex', -1)
71044               .attr('href', 'https://github.com/openstreetmap/iD')
71045               .text(currVersion);
71046
71047           // only show new version indicator to users that have used iD before
71048           if (isNewVersion && !isNewUser) {
71049               selection
71050                   .append('div')
71051                   .attr('class', 'badge')
71052                   .append('a')
71053                   .attr('target', '_blank')
71054                   .attr('tabindex', -1)
71055                   .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CHANGELOG.md#whats-new')
71056                   .call(svgIcon('#maki-gift-11'))
71057                   .call(tooltip()
71058                       .title(t('version.whats_new', { version: currVersion }))
71059                       .placement('top')
71060                   );
71061           }
71062       };
71063   }
71064
71065   function uiZoom(context) {
71066       var zooms = [{
71067           id: 'zoom-in',
71068           icon: 'plus',
71069           title: t('zoom.in'),
71070           action: context.zoomIn,
71071           key: '+'
71072       }, {
71073           id: 'zoom-out',
71074           icon: 'minus',
71075           title: t('zoom.out'),
71076           action: context.zoomOut,
71077           key: '-'
71078       }];
71079
71080
71081       function zoomIn() {
71082           event.preventDefault();
71083           context.zoomIn();
71084       }
71085
71086
71087       function zoomOut() {
71088           event.preventDefault();
71089           context.zoomOut();
71090       }
71091
71092
71093       function zoomInFurther() {
71094           event.preventDefault();
71095           context.zoomInFurther();
71096       }
71097
71098
71099       function zoomOutFurther() {
71100           event.preventDefault();
71101           context.zoomOutFurther();
71102       }
71103
71104
71105       return function(selection$$1) {
71106           var button = selection$$1.selectAll('button')
71107               .data(zooms)
71108               .enter()
71109               .append('button')
71110               .attr('tabindex', -1)
71111               .attr('class', function(d) { return d.id; })
71112               .on('click.editor', function(d) { d.action(); })
71113               .call(tooltip()
71114                   .placement((textDirection === 'rtl') ? 'right' : 'left')
71115                   .html(true)
71116                   .title(function(d) {
71117                       return uiTooltipHtml(d.title, d.key);
71118                   })
71119               );
71120
71121           button.each(function(d) {
71122               select(this)
71123                   .call(svgIcon('#iD-icon-' + d.icon, 'light'));
71124           });
71125
71126           ['plus', 'ffplus', '=', 'ffequals'].forEach(function(key) {
71127               context.keybinding().on([key], zoomIn);
71128               context.keybinding().on([uiCmd('⌘' + key)], zoomInFurther);
71129           });
71130
71131           ['_', '-', 'ffminus', 'dash'].forEach(function(key) {
71132               context.keybinding().on([key], zoomOut);
71133               context.keybinding().on([uiCmd('⌘' + key)], zoomOutFurther);
71134           });
71135       };
71136   }
71137
71138   function uiInit(context) {
71139       var _initCounter = 0;
71140       var _initCallback;
71141       var _needWidth = {};
71142
71143
71144       function render(container) {
71145           container
71146               .attr('dir', textDirection);
71147
71148           var map = context.map();
71149
71150           container
71151               .append('svg')
71152               .attr('id', 'defs')
71153               .call(svgDefs(context));
71154
71155           container
71156               .append('div')
71157               .attr('id', 'sidebar')
71158               .call(ui.sidebar);
71159
71160           var content = container
71161               .append('div')
71162               .attr('id', 'content')
71163               .attr('class', 'active');
71164
71165           // Top toolbar
71166           var bar = content
71167               .append('div')
71168               .attr('id', 'bar')
71169               .attr('class', 'fillD');
71170
71171           content
71172               .append('div')
71173               .attr('id', 'map')
71174               .attr('dir', 'ltr')
71175               .call(map);
71176
71177           // Leading area button group (Sidebar toggle)
71178           var leadingArea = bar
71179               .append('div')
71180               .attr('class', 'tool-group leading-area');
71181
71182           var sidebarButton = leadingArea
71183               .append('div')
71184               .append('button')
71185               .attr('class', 'sidebar-toggle')
71186               .attr('tabindex', -1)
71187               .on('click', ui.sidebar.toggle)
71188               .call(tooltip()
71189                   .placement('bottom')
71190                   .html(true)
71191                   .title(uiTooltipHtml(t('sidebar.tooltip'), t('sidebar.key')))
71192               );
71193
71194           var iconSuffix = textDirection === 'rtl' ? 'right' : 'left';
71195           sidebarButton
71196               .call(svgIcon('#iD-icon-sidebar-' + iconSuffix));
71197
71198           leadingArea
71199               .append('div')
71200               .attr('class', 'full-screen bar-group')
71201               .call(uiFullScreen(context));
71202
71203
71204           // Center area button group (Point/Line/Area/Note mode buttons)
71205           bar
71206               .append('div')
71207               .attr('class', 'tool-group center-area')
71208               .append('div')
71209               .attr('class', 'modes joined')
71210               .call(uiModes(context), bar);
71211
71212
71213           // Trailing area button group (Undo/Redo save buttons)
71214           var trailingArea = bar
71215               .append('div')
71216               .attr('class', 'tool-group trailing-area');
71217
71218           trailingArea
71219               .append('div')
71220               .attr('class', 'joined')
71221               .call(uiUndoRedo(context));
71222
71223           trailingArea
71224               .append('div')
71225               .attr('class', 'save-wrap')
71226               .call(uiSave(context));
71227
71228
71229           // For now, just put spinner at the end of the #bar
71230           bar
71231               .append('div')
71232               .attr('class', 'spinner')
71233               .call(uiSpinner(context));
71234
71235
71236           // Map controls (appended to #bar, but absolutely positioned)
71237           var controls = bar
71238               .append('div')
71239               .attr('class', 'map-controls');
71240
71241           controls
71242               .append('div')
71243               .attr('class', 'map-control zoombuttons')
71244               .call(uiZoom(context));
71245
71246           controls
71247               .append('div')
71248               .attr('class', 'map-control geolocate-control')
71249               .call(uiGeolocate(context));
71250
71251           controls
71252               .append('div')
71253               .attr('class', 'map-control background-control')
71254               .call(uiBackground(context));
71255
71256           controls
71257               .append('div')
71258               .attr('class', 'map-control map-data-control')
71259               .call(uiMapData(context));
71260
71261           controls
71262               .append('div')
71263               .attr('class', 'map-control help-control')
71264               .call(uiHelp(context));
71265
71266
71267           // Add attribution and footer
71268           var about = content
71269               .append('div')
71270               .attr('id', 'about');
71271
71272           about
71273               .append('div')
71274               .attr('id', 'attrib')
71275               .attr('dir', 'ltr')
71276               .call(uiAttribution(context));
71277
71278           about
71279               .append('div')
71280               .attr('class', 'api-status')
71281               .call(uiStatus(context));
71282
71283
71284           var footer = about
71285               .append('div')
71286               .attr('id', 'footer')
71287               .attr('class', 'fillD');
71288
71289           footer
71290               .append('div')
71291               .attr('id', 'flash-wrap')
71292               .attr('class', 'footer-hide');
71293
71294           var footerWrap = footer
71295               .append('div')
71296               .attr('id', 'footer-wrap')
71297               .attr('class', 'footer-show');
71298
71299           footerWrap
71300               .append('div')
71301               .attr('id', 'scale-block')
71302               .call(uiScale(context));
71303
71304           var aboutList = footerWrap
71305               .append('div')
71306               .attr('id', 'info-block')
71307               .append('ul')
71308               .attr('id', 'about-list');
71309
71310           if (!context.embed()) {
71311               aboutList
71312                   .call(uiAccount(context));
71313           }
71314
71315           aboutList
71316               .append('li')
71317               .attr('class', 'version')
71318               .call(uiVersion(context));
71319
71320           var issueLinks = aboutList
71321               .append('li');
71322
71323           issueLinks
71324               .append('a')
71325               .attr('target', '_blank')
71326               .attr('tabindex', -1)
71327               .attr('href', 'https://github.com/openstreetmap/iD/issues')
71328               .call(svgIcon('#iD-icon-bug', 'light'))
71329               .call(tooltip().title(t('report_a_bug')).placement('top'));
71330
71331           issueLinks
71332               .append('a')
71333               .attr('target', '_blank')
71334               .attr('tabindex', -1)
71335               .attr('href', 'https://github.com/openstreetmap/iD/blob/master/CONTRIBUTING.md#translating')
71336               .call(svgIcon('#iD-icon-translate', 'light'))
71337               .call(tooltip().title(t('help_translate')).placement('top'));
71338
71339           aboutList
71340               .append('li')
71341               .attr('class', 'feature-warning')
71342               .attr('tabindex', -1)
71343               .call(uiFeatureInfo(context));
71344
71345           aboutList
71346               .append('li')
71347               .attr('class', 'user-list')
71348               .attr('tabindex', -1)
71349               .call(uiContributors(context));
71350
71351
71352           // Setup map dimensions and move map to initial center/zoom.
71353           // This should happen after #content and toolbars exist.
71354           ui.onResize();
71355
71356           var hash = behaviorHash(context);
71357           hash();
71358           if (!hash.hadHash) {
71359               map.centerZoom([0, 0], 2);
71360           }
71361
71362
71363           // Add absolutely-positioned elements that sit on top of the map
71364           // This should happen after the map is ready (center/zoom)
71365           content
71366               .call(uiMapInMap(context))
71367               .call(uiInfo(context))
71368               .call(uiNotice(context));
71369
71370           content
71371               .append('div')
71372               .attr('id', 'photoviewer')
71373               .classed('al', true)       // 'al'=left,  'ar'=right
71374               .classed('hide', true)
71375               .call(ui.photoviewer);
71376
71377
71378           // Bind events
71379           window.onbeforeunload = function() {
71380               return context.save();
71381           };
71382           window.onunload = function() {
71383               context.history().unlock();
71384           };
71385
71386           select(window)
71387               .on('gesturestart.editor', eventCancel)
71388               .on('gesturechange.editor', eventCancel)
71389               .on('gestureend.editor', eventCancel)
71390               .on('resize.editor', ui.onResize);
71391
71392
71393           var panPixels = 80;
71394           context.keybinding()
71395               .on('⌫', function() { event.preventDefault(); })
71396               .on(t('sidebar.key'), ui.sidebar.toggle)
71397               .on('←', pan([panPixels, 0]))
71398               .on('↑', pan([0, panPixels]))
71399               .on('→', pan([-panPixels, 0]))
71400               .on('↓', pan([0, -panPixels]))
71401               .on(['⇧←', uiCmd('⌘←')], pan([map.dimensions()[0], 0]))
71402               .on(['⇧↑', uiCmd('⌘↑')], pan([0, map.dimensions()[1]]))
71403               .on(['⇧→', uiCmd('⌘→')], pan([-map.dimensions()[0], 0]))
71404               .on(['⇧↓', uiCmd('⌘↓')], pan([0, -map.dimensions()[1]]));
71405
71406           context.enter(modeBrowse(context));
71407
71408           if (!_initCounter++) {
71409               if (!hash.startWalkthrough) {
71410                   context.container()
71411                       .call(uiSplash(context))
71412                       .call(uiRestore(context));
71413               }
71414
71415               context.container()
71416                   .call(uiShortcuts(context));
71417           }
71418
71419           var osm = context.connection();
71420           var auth = uiLoading(context).message(t('loading_auth')).blocking(true);
71421
71422           if (osm && auth) {
71423               osm
71424                   .on('authLoading.ui', function() {
71425                       context.container()
71426                           .call(auth);
71427                   })
71428                   .on('authDone.ui', function() {
71429                       auth.close();
71430                   });
71431           }
71432
71433           _initCounter++;
71434
71435           if (hash.startWalkthrough) {
71436               hash.startWalkthrough = false;
71437               context.container().call(uiIntro(context));
71438           }
71439
71440
71441           function pan(d) {
71442               return function() {
71443                   event.preventDefault();
71444                   context.pan(d, 100);
71445               };
71446           }
71447
71448           function eventCancel() {
71449               event.preventDefault();
71450           }
71451       }
71452
71453
71454       function ui(node, callback) {
71455           _initCallback = callback;
71456           var container = select(node);
71457           context.container(container);
71458           context.loadLocale(function(err) {
71459               if (!err) {
71460                   render(container);
71461               }
71462               if (callback) {
71463                   callback(err);
71464               }
71465           });
71466       }
71467
71468
71469       ui.restart = function(arg) {
71470           context.keybinding().clear();
71471           context.locale(arg);
71472           context.loadLocale(function(err) {
71473               if (!err) {
71474                   context.container().selectAll('*').remove();
71475                   render(context.container());
71476                   if (_initCallback) _initCallback();
71477               }
71478           });
71479       };
71480
71481
71482       ui.sidebar = uiSidebar$$1(context);
71483
71484       ui.photoviewer = uiPhotoviewer(context);
71485
71486       ui.onResize = function(withPan) {
71487           var map = context.map();
71488
71489           // Recalc dimensions of map and sidebar.. (`true` = force recalc)
71490           // This will call `getBoundingClientRect` and trigger reflow,
71491           //  but the values will be cached for later use.
71492           var mapDimensions = utilGetDimensions(select('#content'), true);
71493           utilGetDimensions(select('#sidebar'), true);
71494
71495           if (withPan !== undefined) {
71496               map.redrawEnable(false);
71497               map.pan(withPan);
71498               map.redrawEnable(true);
71499           }
71500           map.dimensions(mapDimensions);
71501
71502           ui.photoviewer.onMapResize();
71503
71504           // check if header or footer have overflowed
71505           ui.checkOverflow('#bar');
71506           ui.checkOverflow('#footer');
71507
71508           // Use outdated code so it works on Explorer
71509           var resizeWindowEvent = document.createEvent('Event');
71510
71511           resizeWindowEvent.initEvent('resizeWindow', true, true);
71512
71513           document.dispatchEvent(resizeWindowEvent);
71514       };
71515
71516
71517       // Call checkOverflow when resizing or whenever the contents change.
71518       ui.checkOverflow = function(selector$$1, reset) {
71519           if (reset) {
71520               delete _needWidth[selector$$1];
71521           }
71522
71523           var element = select(selector$$1);
71524           var scrollWidth = element.property('scrollWidth');
71525           var clientWidth = element.property('clientWidth');
71526           var needed = _needWidth[selector$$1] || scrollWidth;
71527
71528           if (scrollWidth > clientWidth) {    // overflow happening
71529               element.classed('narrow', true);
71530               if (!_needWidth[selector$$1]) {
71531                   _needWidth[selector$$1] = scrollWidth;
71532               }
71533
71534           } else if (scrollWidth >= needed) {
71535               element.classed('narrow', false);
71536           }
71537       };
71538
71539
71540       return ui;
71541   }
71542
71543   function d3combobox() {
71544       var dispatch$$1 = dispatch('accept');
71545       var _container = select(document.body);
71546       var _data = [];
71547       var _suggestions = [];
71548       var _minItems = 2;
71549       var _caseSensitive = false;
71550
71551       var _fetcher = function(val, cb) {
71552           cb(_data.filter(function(d) {
71553               return d.value
71554                   .toString()
71555                   .toLowerCase()
71556                   .indexOf(val.toLowerCase()) !== -1;
71557           }));
71558       };
71559
71560       var combobox = function(input, attachTo) {
71561           var idx = -1;
71562           var wrapper = _container
71563               .selectAll('div.combobox')
71564               .filter(function(d) { return d === input.node(); });
71565           var shown = !wrapper.empty();
71566           var tagName = input.node() ? input.node().tagName.toLowerCase() : '';
71567
71568           input
71569               .classed('combobox-input', true)
71570               .on('focus.typeahead', focus)
71571               .on('blur.typeahead', blur)
71572               .on('keydown.typeahead', keydown)
71573               .on('keyup.typeahead', keyup)
71574               .on('input.typeahead', change)
71575               .each(function() {
71576                   var parent = this.parentNode;
71577                   var sibling = this.nextSibling;
71578
71579                   var caret = select(parent).selectAll('.combobox-caret')
71580                       .filter(function(d) { return d === input.node(); })
71581                       .data([input.node()]);
71582
71583                   caret = caret.enter()
71584                       .insert('div', function() { return sibling; })
71585                       .attr('class', 'combobox-caret')
71586                       .merge(caret);
71587
71588                   caret
71589                       .on('mousedown', function () {
71590                           // prevent the form element from blurring. it blurs
71591                           // on mousedown
71592                           event.stopPropagation();
71593                           event.preventDefault();
71594                           if (!shown) {
71595                               input.node().focus();
71596                               fetch('', render);
71597                           } else {
71598                               hide();
71599                           }
71600                       });
71601               });
71602
71603           function focus() {
71604               fetch(value(), render);
71605           }
71606
71607           function blur() {
71608               window.setTimeout(hide, 150);
71609           }
71610
71611           function show() {
71612               if (!shown) {
71613                   wrapper = _container
71614                       .insert('div', ':first-child')
71615                       .datum(input.node())
71616                       .attr('class', 'combobox')
71617                       .style('position', 'absolute')
71618                       .style('display', 'block')
71619                       .style('left', '0px')
71620                       .on('mousedown', function () {
71621                           // prevent moving focus out of the text field
71622                           event.preventDefault();
71623                       });
71624
71625                   select('body')
71626                       .on('scroll.combobox', render, true);
71627
71628                   shown = true;
71629               }
71630           }
71631
71632           function hide() {
71633               if (shown) {
71634                   idx = -1;
71635                   wrapper.remove();
71636
71637                   select('body')
71638                       .on('scroll.combobox', null);
71639
71640                   shown = false;
71641               }
71642           }
71643
71644           function keydown() {
71645              switch (event.keyCode) {
71646                  // backspace, delete
71647                  case 8:
71648                  case 46:
71649                      input.on('input.typeahead', function() {
71650                          idx = -1;
71651                          render();
71652                          var start = input.property('selectionStart');
71653                          input.node().setSelectionRange(start, start);
71654                          input.on('input.typeahead', change);
71655                      });
71656                      break;
71657                  // tab
71658                  case 9:
71659                      wrapper.selectAll('a.selected').each(function (d) {
71660                          dispatch$$1.call('accept', this, d);
71661                      });
71662                      hide();
71663                      break;
71664                  // return
71665                  case 13:
71666                      event.preventDefault();
71667                      break;
71668                  // up arrow
71669                  case 38:
71670                      if (tagName === 'textarea' && !shown) return;
71671                      nav(-1);
71672                      event.preventDefault();
71673                      break;
71674                  // down arrow
71675                  case 40:
71676                      if (tagName === 'textarea' && !shown) return;
71677                      nav(+1);
71678                      event.preventDefault();
71679                      break;
71680              }
71681              event.stopPropagation();
71682           }
71683
71684           function keyup() {
71685               switch (event.keyCode) {
71686                   // escape
71687                   case 27:
71688                       hide();
71689                       break;
71690                   // return
71691                   case 13:
71692                       wrapper.selectAll('a.selected').each(function (d) {
71693                          dispatch$$1.call('accept', this, d);
71694                       });
71695                       hide();
71696                       break;
71697               }
71698           }
71699
71700           function change() {
71701               fetch(value(), function() {
71702                   if (input.property('selectionEnd') === input.property('value').length) {
71703                       autocomplete();
71704                   }
71705                   render();
71706               });
71707           }
71708
71709           function nav(dir) {
71710               if (!_suggestions.length) return;
71711               idx = Math.max(Math.min(idx + dir, _suggestions.length - 1), 0);
71712               input.property('value', _suggestions[idx].value);
71713               render();
71714               ensureVisible();
71715           }
71716
71717           function value() {
71718               var value = input.property('value');
71719               var start = input.property('selectionStart');
71720               var end = input.property('selectionEnd');
71721
71722               if (start && end) {
71723                   value = value.substring(0, start);
71724               }
71725
71726               return value;
71727           }
71728
71729           function fetch(v, cb) {
71730               _fetcher.call(input, v, function(_) {
71731                   _suggestions = _;
71732                   cb();
71733               });
71734           }
71735
71736           function autocomplete() {
71737               var v = _caseSensitive ? value() : value().toLowerCase();
71738               idx = -1;
71739               if (!v) return;
71740
71741               // Don't autocomplete if user is typing a number - #4935
71742               if (!isNaN(parseFloat(v)) && isFinite(v)) return;
71743
71744               var best = -1;
71745               var suggestion, compare;
71746
71747               for (var i = 0; i < _suggestions.length; i++) {
71748                   suggestion = _suggestions[i].value;
71749                   compare = _caseSensitive ? suggestion : suggestion.toLowerCase();
71750
71751                   // if search string matches suggestion exactly, pick it..
71752                   if (compare === v) {
71753                       best = i;
71754                       break;
71755
71756                   // otherwise lock in the first result that starts with the search string..
71757                   } else if (best === -1 && compare.indexOf(v) === 0) {
71758                       best = i;
71759                   }
71760               }
71761
71762               if (best !== -1) {
71763                   idx = best;
71764                   suggestion = _suggestions[best].value;
71765                   input.property('value', suggestion);
71766                   input.node().setSelectionRange(v.length, suggestion.length);
71767               }
71768           }
71769
71770           function render() {
71771               if (_suggestions.length >= _minItems &&
71772                   document.activeElement === input.node()) {
71773                   // input.attr('readonly') === null)
71774                   show();
71775               } else {
71776                   hide();
71777                   return;
71778               }
71779
71780               var options = wrapper
71781                   .selectAll('a.combobox-option')
71782                   .data(_suggestions, function(d) { return d.value; });
71783
71784               options.exit()
71785                   .remove();
71786
71787               options.enter()
71788                   .append('a')
71789                   .attr('class', 'combobox-option')
71790                   .text(function(d) { return d.value; })
71791                   .merge(options)
71792                   .attr('title', function(d) { return d.title; })
71793                   .classed('selected', function(d, i) { return i === idx; })
71794                   .on('mouseover', select$$1)
71795                   .on('click', accept)
71796                   .order();
71797
71798
71799               var node = attachTo ? attachTo.node() : input.node();
71800               var rect = node.getBoundingClientRect();
71801
71802               wrapper
71803                   .style('left', (rect.left + 5) + 'px')
71804                   .style('width', (rect.width - 10) + 'px')
71805                   .style('top', rect.height + rect.top + 'px');
71806           }
71807
71808           function select$$1(d, i) {
71809               idx = i;
71810               render();
71811           }
71812
71813           function ensureVisible() {
71814               var node = wrapper.selectAll('a.selected').node();
71815               if (node) node.scrollIntoView();
71816           }
71817
71818           function accept(d) {
71819               if (!shown) return;
71820               input.property('value', d.value);
71821               utilTriggerEvent(input, 'change');
71822               dispatch$$1.call('accept', this, d);
71823               hide();
71824           }
71825       };
71826
71827       combobox.fetcher = function(_) {
71828           if (!arguments.length) return _fetcher;
71829           _fetcher = _;
71830           return combobox;
71831       };
71832
71833       combobox.data = function(_) {
71834           if (!arguments.length) return _data;
71835           _data = _;
71836           return combobox;
71837       };
71838
71839       combobox.minItems = function(_) {
71840           if (!arguments.length) return _minItems;
71841           _minItems = _;
71842           return combobox;
71843       };
71844
71845       combobox.caseSensitive = function(_) {
71846           if (!arguments.length) return _caseSensitive;
71847           _caseSensitive = _;
71848           return combobox;
71849       };
71850
71851       combobox.container = function(_) {
71852           if (!arguments.length) return _container;
71853           _container = _;
71854           return combobox;
71855       };
71856
71857       return utilRebind(combobox, dispatch$$1, 'on');
71858   }
71859
71860
71861   d3combobox.off = function(input) {
71862       input
71863           .on('focus.typeahead', null)
71864           .on('blur.typeahead', null)
71865           .on('keydown.typeahead', null)
71866           .on('keyup.typeahead', null)
71867           .on('input.typeahead', null)
71868           .each(function() {
71869               select(this.parentNode).selectAll('.combobox-caret')
71870                   .filter(function(d) { return d === input.node(); })
71871                   .on('mousedown', null);
71872           });
71873
71874       select('body')
71875           .on('scroll.combobox', null);
71876   };
71877
71878   // This currently only works with the 'restrictions' field
71879   // It borrows some code from uiHelp
71880
71881   function uiFieldHelp(context, fieldName) {
71882       var fieldHelp = {};
71883       var _inspector = select(null);
71884       var _wrap = select(null);
71885       var _body = select(null);
71886
71887       var fieldHelpKeys = {
71888           restrictions: [
71889               ['about',[
71890                   'about',
71891                   'from_via_to',
71892                   'maxdist',
71893                   'maxvia'
71894               ]],
71895               ['inspecting',[
71896                   'about',
71897                   'from_shadow',
71898                   'allow_shadow',
71899                   'restrict_shadow',
71900                   'only_shadow',
71901                   'restricted',
71902                   'only'
71903               ]],
71904               ['modifying',[
71905                   'about',
71906                   'indicators',
71907                   'allow_turn',
71908                   'restrict_turn',
71909                   'only_turn'
71910               ]],
71911               ['tips',[
71912                   'simple',
71913                   'simple_example',
71914                   'indirect',
71915                   'indirect_example',
71916                   'indirect_noedit'
71917               ]]
71918           ]
71919       };
71920
71921       var fieldHelpHeadings = {};
71922
71923       var replacements = {
71924           distField: t('restriction.controls.distance'),
71925           viaField: t('restriction.controls.via'),
71926           fromShadow: icon('#iD-turn-shadow', 'pre-text shadow from'),
71927           allowShadow: icon('#iD-turn-shadow', 'pre-text shadow allow'),
71928           restrictShadow: icon('#iD-turn-shadow', 'pre-text shadow restrict'),
71929           onlyShadow: icon('#iD-turn-shadow', 'pre-text shadow only'),
71930           allowTurn: icon('#iD-turn-yes', 'pre-text turn'),
71931           restrictTurn: icon('#iD-turn-no', 'pre-text turn'),
71932           onlyTurn: icon('#iD-turn-only', 'pre-text turn')
71933       };
71934
71935
71936       // For each section, squash all the texts into a single markdown document
71937       var docs = fieldHelpKeys[fieldName].map(function(key) {
71938           var helpkey = 'help.field.' + fieldName + '.' + key[0];
71939           var text = key[1].reduce(function(all, part) {
71940               var subkey = helpkey + '.' + part;
71941               var depth = fieldHelpHeadings[subkey];                     // is this subkey a heading?
71942               var hhh = depth ? Array(depth + 1).join('#') + ' ' : '';   // if so, prepend with some ##'s
71943               return all + hhh + t(subkey, replacements) + '\n\n';
71944           }, '');
71945
71946           return {
71947               key: helpkey,
71948               title: t(helpkey + '.title'),
71949               html: marked(text.trim())
71950           };
71951       });
71952
71953
71954       function show() {
71955           updatePosition();
71956
71957           _body
71958               .classed('hide', false)
71959               .style('opacity', '0')
71960               .transition()
71961               .duration(200)
71962               .style('opacity', '1');
71963       }
71964
71965
71966       function hide() {
71967           _body
71968               .classed('hide', true)
71969               .transition()
71970               .duration(200)
71971               .style('opacity', '0')
71972               .on('end', function () {
71973                   _body.classed('hide', true);
71974               });
71975       }
71976
71977
71978       function clickHelp(index) {
71979           var d = docs[index];
71980           var tkeys = fieldHelpKeys[fieldName][index][1];
71981
71982           _body.selectAll('.field-help-nav-item')
71983               .classed('active', function(d, i) { return i === index; });
71984
71985           var content = _body.selectAll('.field-help-content')
71986               .html(d.html);
71987
71988           // class the paragraphs so we can find and style them
71989           content.selectAll('p')
71990               .attr('class', function(d, i) { return tkeys[i]; });
71991
71992           // insert special content for certain help sections
71993           if (d.key === 'help.field.restrictions.inspecting') {
71994               content
71995                   .insert('img', 'p.from_shadow')
71996                   .attr('class', 'field-help-image cf')
71997                   .attr('src', context.imagePath('tr_inspect.gif'));
71998
71999           } else if (d.key === 'help.field.restrictions.modifying') {
72000               content
72001                   .insert('img', 'p.allow_turn')
72002                   .attr('class', 'field-help-image cf')
72003                   .attr('src', context.imagePath('tr_modify.gif'));
72004           }
72005       }
72006
72007
72008       fieldHelp.button = function(selection$$1) {
72009           if (_body.empty()) return;
72010
72011           var button = selection$$1.selectAll('.field-help-button')
72012               .data([0]);
72013
72014           // enter/update
72015           button.enter()
72016               .append('button')
72017               .attr('class', 'field-help-button')
72018               .attr('tabindex', -1)
72019               .call(svgIcon('#iD-icon-help'))
72020               .merge(button)
72021               .on('click', function () {
72022                   event.stopPropagation();
72023                   event.preventDefault();
72024                   if (_body.classed('hide')) {
72025                       show();
72026                   } else {
72027                       hide();
72028                   }
72029               });
72030       };
72031
72032
72033       function updatePosition() {
72034           var wrap = _wrap.node();
72035           var inspector = _inspector.node();
72036           var wRect = wrap.getBoundingClientRect();
72037           var iRect = inspector.getBoundingClientRect();
72038
72039           _body
72040               .style('top', wRect.top + inspector.scrollTop - iRect.top + 'px');
72041       }
72042
72043
72044       fieldHelp.body = function(selection$$1) {
72045           // This control expects the field to have a form-field-input-wrap div
72046           _wrap = selection$$1.selectAll('.form-field-input-wrap');
72047           if (_wrap.empty()) return;
72048
72049           // absolute position relative to the inspector, so it "floats" above the fields
72050           _inspector = select('#sidebar .entity-editor-pane .inspector-body');
72051           if (_inspector.empty()) return;
72052
72053           _body = _inspector.selectAll('.field-help-body')
72054               .data([0]);
72055
72056           var enter = _body.enter()
72057               .append('div')
72058               .attr('class', 'field-help-body hide');   // initially hidden
72059
72060           var titleEnter = enter
72061               .append('div')
72062               .attr('class', 'field-help-title cf');
72063
72064           titleEnter
72065               .append('h2')
72066               .attr('class', 'fl')
72067               .text(t('help.field.' + fieldName + '.title'));
72068
72069           titleEnter
72070               .append('button')
72071               .attr('class', 'fr close')
72072               .on('click', function() {
72073                   event.stopPropagation();
72074                   event.preventDefault();
72075                   hide();
72076               })
72077               .call(svgIcon('#iD-icon-close'));
72078
72079           var navEnter = enter
72080               .append('div')
72081               .attr('class', 'field-help-nav cf');
72082
72083           var titles = docs.map(function(d) { return d.title; });
72084           navEnter.selectAll('.field-help-nav-item')
72085               .data(titles)
72086               .enter()
72087               .append('div')
72088               .attr('class', 'field-help-nav-item')
72089               .text(function(d) { return d; })
72090               .on('click', function(d, i) {
72091                   event.stopPropagation();
72092                   event.preventDefault();
72093                   clickHelp(i);
72094               });
72095
72096           enter
72097               .append('div')
72098               .attr('class', 'field-help-content');
72099
72100           _body = _body
72101               .merge(enter);
72102
72103           clickHelp(0);
72104       };
72105
72106
72107       return fieldHelp;
72108   }
72109
72110   function uiFieldCheck(field, context) {
72111       var dispatch$$1 = dispatch('change');
72112       var options = field.strings && field.strings.options;
72113       var values = [];
72114       var texts = [];
72115
72116       var input = select(null);
72117       var text = select(null);
72118       var label = select(null);
72119       var reverser = select(null);
72120
72121       var _impliedYes;
72122       var _entityID;
72123       var _value;
72124
72125
72126       if (options) {
72127           for (var k in options) {
72128               values.push(k === 'undefined' ? undefined : k);
72129               texts.push(field.t('options.' + k, { 'default': options[k] }));
72130           }
72131       } else {
72132           values = [undefined, 'yes'];
72133           texts = [t('inspector.unknown'), t('inspector.check.yes')];
72134           if (field.type !== 'defaultCheck') {
72135               values.push('no');
72136               texts.push(t('inspector.check.no'));
72137           }
72138       }
72139
72140
72141       // Checks tags to see whether an undefined value is "Assumed to be Yes"
72142       function checkImpliedYes() {
72143           _impliedYes = (field.id === 'oneway_yes');
72144
72145           // hack: pretend `oneway` field is a `oneway_yes` field
72146           // where implied oneway tag exists (e.g. `junction=roundabout`) #2220, #1841
72147           if (field.id === 'oneway') {
72148               var entity = context.entity(_entityID);
72149               for (var key in entity.tags) {
72150                   if (key in osmOneWayTags && (entity.tags[key] in osmOneWayTags[key])) {
72151                       _impliedYes = true;
72152                       texts[0] = t('presets.fields.oneway_yes.options.undefined');
72153                       break;
72154                   }
72155               }
72156           }
72157       }
72158
72159
72160       function reverserHidden() {
72161           if (!select('div.inspector-hover').empty()) return true;
72162           return !(_value === 'yes' || (_impliedYes && !_value));
72163       }
72164
72165
72166       function reverserSetText(selection$$1) {
72167           var entity = context.hasEntity(_entityID);
72168           if (reverserHidden() || !entity) return selection$$1;
72169
72170           var first = entity.first();
72171           var last = entity.isClosed() ? entity.nodes[entity.nodes.length - 2] : entity.last();
72172           var pseudoDirection = first < last;
72173           var icon = pseudoDirection ? '#iD-icon-forward' : '#iD-icon-backward';
72174
72175           selection$$1.selectAll('.reverser-span')
72176               .text(t('inspector.check.reverser'))
72177               .call(svgIcon(icon, 'inline'));
72178
72179           return selection$$1;
72180       }
72181
72182
72183       var check = function(selection$$1) {
72184           checkImpliedYes();
72185
72186           label = selection$$1.selectAll('.form-field-input-wrap')
72187               .data([0]);
72188
72189           var enter = label.enter()
72190               .append('label')
72191               .attr('class', 'form-field-input-wrap form-field-input-check');
72192
72193           enter
72194               .append('input')
72195               .property('indeterminate', field.type !== 'defaultCheck')
72196               .attr('type', 'checkbox')
72197               .attr('id', 'preset-input-' + field.safeid);
72198
72199           enter
72200               .append('span')
72201               .text(texts[0])
72202               .attr('class', 'value');
72203
72204           if (field.type === 'onewayCheck') {
72205               enter
72206                   .append('a')
72207                   .attr('id', 'preset-input-' + field.safeid + '-reverser')
72208                   .attr('class', 'reverser button' + (reverserHidden() ? ' hide' : ''))
72209                   .attr('href', '#')
72210                   .append('span')
72211                   .attr('class', 'reverser-span');
72212           }
72213
72214           label = label.merge(enter);
72215           input = label.selectAll('input');
72216           text = label.selectAll('span.value');
72217
72218           input
72219               .on('click', function() {
72220                   event.stopPropagation();
72221                   var t$$1 = {};
72222                   t$$1[field.key] = values[(values.indexOf(_value) + 1) % values.length];
72223
72224                   // Don't cycle through `alternating` or `reversible` states - #4970
72225                   // (They are supported as translated strings, but should not toggle with clicks)
72226                   if (t$$1[field.key] === 'reversible' || t$$1[field.key] === 'alternating') {
72227                       t$$1[field.key] = values[0];
72228                   }
72229
72230                   dispatch$$1.call('change', this, t$$1);
72231               });
72232
72233           if (field.type === 'onewayCheck') {
72234               reverser = label.selectAll('.reverser');
72235
72236               reverser
72237                   .call(reverserSetText)
72238                   .on('click', function() {
72239                       event.preventDefault();
72240                       event.stopPropagation();
72241                       context.perform(
72242                           actionReverse(_entityID),
72243                           t('operations.reverse.annotation')
72244                       );
72245                       select(this)
72246                           .call(reverserSetText);
72247                   });
72248           }
72249       };
72250
72251
72252       check.entity = function(_) {
72253           if (!arguments.length) return context.hasEntity(_entityID);
72254           _entityID = _.id;
72255           return check;
72256       };
72257
72258
72259       check.tags = function(tags) {
72260
72261           function isChecked(val) {
72262               return val !== 'no' && val !== '' && val !== undefined && val !== null;
72263           }
72264
72265           function textFor(val) {
72266               if (val === '') val = undefined;
72267               var index = values.indexOf(val);
72268               return (index !== -1 ? texts[index] : ('"' + val + '"'));
72269           }
72270
72271           checkImpliedYes();
72272           _value = tags[field.key] && tags[field.key].toLowerCase();
72273
72274           if (field.type === 'onewayCheck' && (_value === '1' || _value === '-1')) {
72275               _value = 'yes';
72276           }
72277
72278           input
72279               .property('indeterminate', field.type !== 'defaultCheck' && !_value)
72280               .property('checked', isChecked(_value));
72281
72282           text
72283               .text(textFor(_value));
72284
72285           label
72286               .classed('set', !!_value);
72287
72288           if (field.type === 'onewayCheck') {
72289               reverser
72290                   .classed('hide', reverserHidden())
72291                   .call(reverserSetText);
72292           }
72293       };
72294
72295
72296       check.focus = function() {
72297           input.node().focus();
72298       };
72299
72300       return utilRebind(check, dispatch$$1, 'on');
72301   }
72302
72303   /** Used for built-in method references. */
72304   var arrayProto$1 = Array.prototype;
72305
72306   /** Built-in value references. */
72307   var splice$1 = arrayProto$1.splice;
72308
72309   /**
72310    * The base implementation of `_.pullAt` without support for individual
72311    * indexes or capturing the removed elements.
72312    *
72313    * @private
72314    * @param {Array} array The array to modify.
72315    * @param {number[]} indexes The indexes of elements to remove.
72316    * @returns {Array} Returns `array`.
72317    */
72318   function basePullAt(array, indexes) {
72319     var length = array ? indexes.length : 0,
72320         lastIndex = length - 1;
72321
72322     while (length--) {
72323       var index = indexes[length];
72324       if (length == lastIndex || index !== previous) {
72325         var previous = index;
72326         if (isIndex(index)) {
72327           splice$1.call(array, index, 1);
72328         } else {
72329           baseUnset(array, index);
72330         }
72331       }
72332     }
72333     return array;
72334   }
72335
72336   /**
72337    * Removes all elements from `array` that `predicate` returns truthy for
72338    * and returns an array of the removed elements. The predicate is invoked
72339    * with three arguments: (value, index, array).
72340    *
72341    * **Note:** Unlike `_.filter`, this method mutates `array`. Use `_.pull`
72342    * to pull elements from an array by value.
72343    *
72344    * @static
72345    * @memberOf _
72346    * @since 2.0.0
72347    * @category Array
72348    * @param {Array} array The array to modify.
72349    * @param {Function} [predicate=_.identity] The function invoked per iteration.
72350    * @returns {Array} Returns the new array of removed elements.
72351    * @example
72352    *
72353    * var array = [1, 2, 3, 4];
72354    * var evens = _.remove(array, function(n) {
72355    *   return n % 2 == 0;
72356    * });
72357    *
72358    * console.log(array);
72359    * // => [1, 3]
72360    *
72361    * console.log(evens);
72362    * // => [2, 4]
72363    */
72364   function remove$8(array, predicate) {
72365     var result = [];
72366     if (!(array && array.length)) {
72367       return result;
72368     }
72369     var index = -1,
72370         indexes = [],
72371         length = array.length;
72372
72373     predicate = baseIteratee(predicate, 3);
72374     while (++index < length) {
72375       var value = array[index];
72376       if (predicate(value, index, array)) {
72377         result.push(value);
72378         indexes.push(index);
72379       }
72380     }
72381     basePullAt(array, indexes);
72382     return result;
72383   }
72384
72385   function uiFieldCombo(field, context) {
72386       var dispatch$$1 = dispatch('change');
72387       var nominatim = services.geocoder;
72388       var taginfo = services.taginfo;
72389       var isMulti = (field.type === 'multiCombo');
72390       var isNetwork = (field.type === 'networkCombo');
72391       var isSemi = (field.type === 'semiCombo');
72392       var optstrings = field.strings && field.strings.options;
72393       var optarray = field.options;
72394       var snake_case = (field.snake_case || (field.snake_case === undefined));
72395       var caseSensitive = field.caseSensitive;
72396       var combobox = d3combobox()
72397           .container(context.container())
72398           .caseSensitive(caseSensitive)
72399           .minItems(isMulti || isSemi ? 1 : 2);
72400       var container = select(null);
72401       var input = select(null);
72402       var _comboData = [];
72403       var _multiData = [];
72404       var _entity;
72405       var _country;
72406
72407       // ensure multiCombo field.key ends with a ':'
72408       if (isMulti && /[^:]$/.test(field.key)) {
72409           field.key += ':';
72410       }
72411
72412
72413       function snake(s) {
72414           return s.replace(/\s+/g, '_');
72415       }
72416
72417       function unsnake(s) {
72418           return s.replace(/_+/g, ' ');
72419       }
72420
72421       function clean(s) {
72422           return s.split(';')
72423               .map(function(s) { return s.trim(); })
72424               .join(';');
72425       }
72426
72427
72428       // returns the tag value for a display value
72429       // (for multiCombo, dval should be the key suffix, not the entire key)
72430       function tagValue(dval) {
72431           dval = clean(dval || '');
72432
72433           if (optstrings) {
72434               var found = find$1(_comboData, function(o) {
72435                   return o.key && clean(o.value) === dval;
72436               });
72437               if (found) {
72438                   return found.key;
72439               }
72440           }
72441
72442           if (field.type === 'typeCombo' && !dval) {
72443               return 'yes';
72444           }
72445
72446           return (snake_case ? snake(dval) : dval) || undefined;
72447       }
72448
72449
72450       // returns the display value for a tag value
72451       // (for multiCombo, tval should be the key suffix, not the entire key)
72452       function displayValue(tval) {
72453           tval = tval || '';
72454
72455           if (optstrings) {
72456               var found = find$1(_comboData, function(o) { return o.key === tval && o.value; });
72457               if (found) {
72458                   return found.value;
72459               }
72460           }
72461
72462           if (field.type === 'typeCombo' && tval.toLowerCase() === 'yes') {
72463               return '';
72464           }
72465
72466           return snake_case ? unsnake(tval) : tval;
72467       }
72468
72469
72470       function objectDifference(a, b) {
72471           return reject(a, function(d1) {
72472               return some(b, function(d2) { return d1.value === d2.value; });
72473           });
72474       }
72475
72476
72477       function initCombo(selection$$1, attachTo) {
72478           if (optstrings) {
72479               selection$$1.attr('readonly', 'readonly');
72480               selection$$1.call(combobox, attachTo);
72481               setStaticValues(setPlaceholder);
72482
72483           } else if (optarray) {
72484               selection$$1.call(combobox, attachTo);
72485               setStaticValues(setPlaceholder);
72486
72487           } else if (taginfo) {
72488               selection$$1.call(combobox.fetcher(setTaginfoValues), attachTo);
72489               setTaginfoValues('', setPlaceholder);
72490           }
72491       }
72492
72493
72494       function setStaticValues(callback) {
72495           if (!(optstrings || optarray)) return;
72496
72497           if (optstrings) {
72498               _comboData = Object.keys(optstrings).map(function(k) {
72499                   var v = field.t('options.' + k, { 'default': optstrings[k] });
72500                   return {
72501                       key: k,
72502                       value: v,
72503                       title: v
72504                   };
72505               });
72506
72507           } else if (optarray) {
72508               _comboData = optarray.map(function(k) {
72509                   var v = snake_case ? unsnake(k) : k;
72510                   return {
72511                       key: k,
72512                       value: v,
72513                       title: v
72514                   };
72515               });
72516           }
72517
72518           combobox.data(objectDifference(_comboData, _multiData));
72519           if (callback) callback(_comboData);
72520       }
72521
72522
72523       function setTaginfoValues(q, callback) {
72524           var fn = isMulti ? 'multikeys' : 'values';
72525           var query = (isMulti ? field.key : '') + q;
72526           var hasCountryPrefix = isNetwork && _country && _country.indexOf(q.toLowerCase()) === 0;
72527           if (hasCountryPrefix) {
72528               query = _country + ':';
72529           }
72530
72531           var params = {
72532               debounce: (q !== ''),
72533               key: field.key,
72534               query: query
72535           };
72536
72537           if (_entity) {
72538               params.geometry = context.geometry(_entity.id);
72539           }
72540
72541           taginfo[fn](params, function(err, data) {
72542               if (err) return;
72543               if (hasCountryPrefix) {
72544                   data = filter(data, function(d) {
72545                       return d.value.toLowerCase().indexOf(_country + ':') === 0;
72546                   });
72547               }
72548
72549               _comboData = map$3(data, function(d) {
72550                   var k = d.value;
72551                   if (isMulti) k = k.replace(field.key, '');
72552                   var v = snake_case ? unsnake(k) : k;
72553                   return {
72554                       key: k,
72555                       value: v,
72556                       title: isMulti ? v : d.title
72557                   };
72558               });
72559
72560               _comboData = objectDifference(_comboData, _multiData);
72561               if (callback) callback(_comboData);
72562           });
72563       }
72564
72565
72566       function setPlaceholder(d) {
72567           var ph;
72568
72569           if (isMulti || isSemi) {
72570               ph = field.placeholder() || t('inspector.add');
72571           } else {
72572               var vals = map$3(d, 'value').filter(function(s) { return s.length < 20; }),
72573                   placeholders = vals.length > 1 ? vals : map$3(d, 'key');
72574               ph = field.placeholder() || placeholders.slice(0, 3).join(', ');
72575           }
72576
72577           if (!/(…|\.\.\.)$/.test(ph)) {
72578               ph += '…';
72579           }
72580
72581           container.selectAll('input')
72582               .attr('placeholder', ph);
72583       }
72584
72585
72586       function change() {
72587           var val = tagValue(utilGetSetValue(input));
72588           var t$$1 = {};
72589
72590           if (isMulti || isSemi) {
72591               if (!val) return;
72592               container.classed('active', false);
72593               utilGetSetValue(input, '');
72594
72595               if (isMulti) {
72596                   var key = field.key + val;
72597                   if (_entity) {
72598                       // don't set a multicombo value to 'yes' if it already has a non-'no' value
72599                       // e.g. `language:de=main`
72600                       var old = _entity.tags[key] || '';
72601                       if (old && old.toLowerCase() !== 'no') return;
72602                   }
72603                   field.keys.push(key);
72604                   t$$1[key] = 'yes';
72605
72606               } else if (isSemi) {
72607                   var arr = _multiData.map(function(d) { return d.key; });
72608                   arr.push(val);
72609                   t$$1[field.key] = compact(uniq(arr)).join(';');
72610               }
72611
72612               window.setTimeout(function() { input.node().focus(); }, 10);
72613
72614           } else {
72615               t$$1[field.key] = val;
72616           }
72617
72618           dispatch$$1.call('change', this, t$$1);
72619       }
72620
72621
72622       function removeMultikey(d) {
72623           event.stopPropagation();
72624           var t$$1 = {};
72625           if (isMulti) {
72626               t$$1[d.key] = undefined;
72627           } else if (isSemi) {
72628               remove$8(_multiData, function(md) { return md.key === d.key; });
72629               var arr = _multiData.map(function(md) { return md.key; });
72630               arr = compact(uniq(arr));
72631               t$$1[field.key] = arr.length ? arr.join(';') : undefined;
72632           }
72633           dispatch$$1.call('change', this, t$$1);
72634       }
72635
72636
72637       function combo(selection$$1) {
72638           container = selection$$1.selectAll('.form-field-input-wrap')
72639               .data([0]);
72640
72641           var type = (isMulti || isSemi) ? 'multicombo': 'combo';
72642           container = container.enter()
72643               .append('div')
72644               .attr('class', 'form-field-input-wrap form-field-input-' + type)
72645               .merge(container);
72646
72647           if (isMulti || isSemi) {
72648               container = container.selectAll('.chiplist')
72649                   .data([0]);
72650
72651               container = container.enter()
72652                   .append('ul')
72653                   .attr('class', 'chiplist')
72654                   .on('click', function() {
72655                       window.setTimeout(function() { input.node().focus(); }, 10);
72656                   })
72657                   .merge(container);
72658           }
72659
72660           input = container.selectAll('input')
72661               .data([0]);
72662
72663           input = input.enter()
72664               .append('input')
72665               .attr('type', 'text')
72666               .attr('id', 'preset-input-' + field.safeid)
72667               .call(utilNoAuto)
72668               .call(initCombo, selection$$1)
72669               .merge(input);
72670
72671           if (isNetwork && nominatim && _entity) {
72672               var center = _entity.extent(context.graph()).center();
72673               nominatim.countryCode(center, function (err, code) {
72674                   _country = code;
72675               });
72676           }
72677
72678           input
72679               .on('change', change)
72680               .on('blur', change);
72681
72682           if (isMulti || isSemi) {
72683               combobox
72684                   .on('accept', function() {
72685                       input.node().blur();
72686                       input.node().focus();
72687                   });
72688
72689               input
72690                   .on('focus', function() { container.classed('active', true); });
72691           }
72692       }
72693
72694
72695       combo.tags = function(tags) {
72696           if (isMulti || isSemi) {
72697               _multiData = [];
72698
72699               if (isMulti) {
72700                   // Build _multiData array containing keys already set..
72701                   for (var k in tags) {
72702                       if (k.indexOf(field.key) !== 0) continue;
72703                       var v = (tags[k] || '').toLowerCase();
72704                       if (v === '' || v === 'no') continue;
72705
72706                       var suffix = k.substring(field.key.length);
72707                       _multiData.push({
72708                           key: k,
72709                           value: displayValue(suffix)
72710                       });
72711                   }
72712
72713                   // Set keys for form-field modified (needed for undo and reset buttons)..
72714                   field.keys = map$3(_multiData, 'key');
72715
72716               } else if (isSemi) {
72717                   var arr = compact(uniq((tags[field.key] || '').split(';')));
72718                   _multiData = arr.map(function(k) {
72719                       return {
72720                           key: k,
72721                           value: displayValue(k)
72722                       };
72723                   });
72724               }
72725
72726               // Exclude existing multikeys from combo options..
72727               var available = objectDifference(_comboData, _multiData);
72728               combobox.data(available);
72729
72730               // Hide 'Add' button if this field uses fixed set of
72731               // translateable optstrings and they're all currently used..
72732               container.selectAll('.combobox-input, .combobox-caret')
72733                   .classed('hide', optstrings && !available.length);
72734
72735
72736               // Render chips
72737               var chips = container.selectAll('.chips')
72738                   .data(_multiData);
72739
72740               chips.exit()
72741                   .remove();
72742
72743               var enter = chips.enter()
72744                   .insert('li', 'input')
72745                   .attr('class', 'chips');
72746
72747               enter.append('span');
72748               enter.append('a');
72749
72750               chips = chips.merge(enter);
72751
72752               chips.select('span')
72753                   .text(function(d) { return d.value; });
72754
72755               chips.select('a')
72756                   .on('click', removeMultikey)
72757                   .attr('class', 'remove')
72758                   .text('×');
72759
72760           } else {
72761               utilGetSetValue(input, displayValue(tags[field.key]));
72762           }
72763       };
72764
72765
72766       combo.focus = function() {
72767           input.node().focus();
72768       };
72769
72770
72771       combo.entity = function(val) {
72772           if (!arguments.length) return _entity;
72773           _entity = val;
72774           return combo;
72775       };
72776
72777
72778       return utilRebind(combo, dispatch$$1, 'on');
72779   }
72780
72781   function uiFieldText(field, context) {
72782       var dispatch$$1 = dispatch('change');
72783       var nominatim = services.geocoder;
72784       var input = select(null);
72785       var _entity;
72786       var _brandTip;
72787
72788       if (field.id === 'brand') {
72789           _brandTip = tooltip()
72790               .title(t('inspector.lock.suggestion', { label: field.label }))
72791               .placement('bottom');
72792       }
72793
72794
72795       function i(selection$$1) {
72796           var preset = _entity && context.presets().match(_entity, context.graph());
72797           var isSuggestion = preset && preset.suggestion && field.id === 'brand';
72798
72799           var wrap = selection$$1.selectAll('.form-field-input-wrap')
72800               .data([0]);
72801
72802           wrap = wrap.enter()
72803               .append('div')
72804               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
72805               .merge(wrap);
72806
72807           var fieldID = 'preset-input-' + field.safeid;
72808
72809           input = wrap.selectAll('input')
72810               .data([0]);
72811
72812           input = input.enter()
72813               .append('input')
72814               .attr('type', field.type)
72815               .attr('id', fieldID)
72816               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
72817               .classed(field.type, true)
72818               .call(utilNoAuto)
72819               .merge(input);
72820
72821           input
72822               .classed('disabled', !!isSuggestion)
72823               .attr('readonly', isSuggestion || null)
72824               .on('input', change(true))
72825               .on('blur', change())
72826               .on('change', change());
72827
72828
72829           if (field.type === 'tel' && nominatim && _entity) {
72830               var center = _entity.extent(context.graph()).center();
72831               nominatim.countryCode(center, function (err, countryCode) {
72832                   if (err || !dataPhoneFormats[countryCode]) return;
72833                   wrap.selectAll('#' + fieldID)
72834                       .attr('placeholder', dataPhoneFormats[countryCode]);
72835               });
72836
72837           } else if (field.type === 'number') {
72838               var rtl = (textDirection === 'rtl');
72839
72840               input.attr('type', 'text');
72841
72842               var buttons = wrap.selectAll('.increment, .decrement')
72843                   .data(rtl ? [1, -1] : [-1, 1]);
72844
72845               buttons.enter()
72846                   .append('button')
72847                   .attr('tabindex', -1)
72848                   .attr('class', function(d) {
72849                       var which = (d === 1 ? 'increment' : 'decrement');
72850                       return 'form-field-button ' + which;
72851                   })
72852                   .merge(buttons)
72853                   .on('click', function(d) {
72854                       event.preventDefault();
72855                       input.node().value = parsed(input.node().value) + d;
72856                       change()();
72857                   });
72858
72859           } else if (preset && field.id === 'brand') {
72860               var pTag = preset.id.split('/', 2);
72861               var pKey = pTag[0];
72862               if (isSuggestion) {
72863                   // A "suggestion" preset (brand name)
72864                   // Put suggestion keys in `field.keys` so delete button can remove them all.
72865                   field.keys = Object.keys(preset.removeTags)
72866                       .filter(function(k) { return k !== pKey && k !== 'name'; });
72867               }
72868
72869               wrap.call(isSuggestion ? _brandTip : _brandTip.destroy);
72870           }
72871       }
72872
72873
72874       // parse as a number
72875       function parsed(val) {
72876           return parseFloat(val || 0, 10) || 0;
72877       }
72878
72879
72880       // clamp number to min/max
72881       function clamped(num) {
72882           if (field.minValue !== undefined) {
72883               num = Math.max(num, field.minValue);
72884           }
72885           if (field.maxValue !== undefined) {
72886               num = Math.min(num, field.maxValue);
72887           }
72888           return num;
72889       }
72890
72891
72892       function change(onInput) {
72893           return function() {
72894               var t$$1 = {};
72895               var val = utilGetSetValue(input).trim() || undefined;
72896
72897               if (!onInput) {
72898                   if (field.type === 'number' && val !== undefined) {
72899                       val = clamped(parsed(val)) + '';
72900                   }
72901                   utilGetSetValue(input, val || '');
72902               }
72903               t$$1[field.key] = val;
72904               dispatch$$1.call('change', this, t$$1, onInput);
72905           };
72906       }
72907
72908
72909       i.entity = function(val) {
72910           if (!arguments.length) return _entity;
72911           _entity = val;
72912           return i;
72913       };
72914
72915
72916       i.tags = function(tags) {
72917           utilGetSetValue(input, tags[field.key] || '');
72918       };
72919
72920
72921       i.focus = function() {
72922           var node = input.node();
72923           if (node) node.focus();
72924       };
72925
72926       return utilRebind(i, dispatch$$1, 'on');
72927   }
72928
72929   function uiFieldAccess(field, context) {
72930       var dispatch$$1 = dispatch('change');
72931       var items = select(null);
72932
72933       function access(selection$$1) {
72934           var wrap = selection$$1.selectAll('.form-field-input-wrap')
72935               .data([0]);
72936
72937           wrap = wrap.enter()
72938               .append('div')
72939               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
72940               .merge(wrap);
72941
72942           var list = wrap.selectAll('ul')
72943               .data([0]);
72944
72945           list = list.enter()
72946               .append('ul')
72947               .attr('class', 'labeled-inputs')
72948               .merge(list);
72949
72950
72951           items = list.selectAll('li')
72952               .data(field.keys);
72953
72954           // Enter
72955           var enter = items.enter()
72956               .append('li')
72957               .attr('class', function(d) { return 'preset-access-' + d; });
72958
72959           enter
72960               .append('span')
72961               .attr('class', 'label preset-label-access')
72962               .attr('for', function(d) { return 'preset-input-access-' + d; })
72963               .text(function(d) { return field.t('types.' + d); });
72964
72965           enter
72966               .append('div')
72967               .attr('class', 'preset-input-access-wrap')
72968               .append('input')
72969               .attr('type', 'text')
72970               .attr('class', 'preset-input-access')
72971               .attr('id', function(d) { return 'preset-input-access-' + d; })
72972               .call(utilNoAuto)
72973               .each(function(d) {
72974                   select(this)
72975                       .call(d3combobox()
72976                           .container(context.container())
72977                           .data(access.options(d))
72978                       );
72979               });
72980
72981
72982           // Update
72983           items = items.merge(enter);
72984
72985           wrap.selectAll('.preset-input-access')
72986               .on('change', change)
72987               .on('blur', change);
72988       }
72989
72990
72991       function change(d) {
72992           var tag = {};
72993           tag[d] = utilGetSetValue(select(this)) || undefined;
72994           dispatch$$1.call('change', this, tag);
72995       }
72996
72997
72998       access.options = function(type) {
72999           var options = ['no', 'permissive', 'private', 'permit', 'destination'];
73000
73001           if (type !== 'access') {
73002               options.unshift('yes');
73003               options.push('designated');
73004
73005               if (type === 'bicycle') {
73006                   options.push('dismount');
73007               }
73008           }
73009
73010           return options.map(function(option) {
73011               return {
73012                   title: field.t('options.' + option + '.description'),
73013                   value: option
73014               };
73015           });
73016       };
73017
73018
73019       var placeholders = {
73020           footway: {
73021               foot: 'designated',
73022               motor_vehicle: 'no'
73023           },
73024           steps: {
73025               foot: 'yes',
73026               motor_vehicle: 'no',
73027               bicycle: 'no',
73028               horse: 'no'
73029           },
73030           pedestrian: {
73031               foot: 'yes',
73032               motor_vehicle: 'no'
73033           },
73034           cycleway: {
73035               motor_vehicle: 'no',
73036               bicycle: 'designated'
73037           },
73038           bridleway: {
73039               motor_vehicle: 'no',
73040               horse: 'designated'
73041           },
73042           path: {
73043               foot: 'yes',
73044               motor_vehicle: 'no',
73045               bicycle: 'yes',
73046               horse: 'yes'
73047           },
73048           motorway: {
73049               foot: 'no',
73050               motor_vehicle: 'yes',
73051               bicycle: 'no',
73052               horse: 'no'
73053           },
73054           trunk: {
73055               motor_vehicle: 'yes'
73056           },
73057           primary: {
73058               foot: 'yes',
73059               motor_vehicle: 'yes',
73060               bicycle: 'yes',
73061               horse: 'yes'
73062           },
73063           secondary: {
73064               foot: 'yes',
73065               motor_vehicle: 'yes',
73066               bicycle: 'yes',
73067               horse: 'yes'
73068           },
73069           tertiary: {
73070               foot: 'yes',
73071               motor_vehicle: 'yes',
73072               bicycle: 'yes',
73073               horse: 'yes'
73074           },
73075           residential: {
73076               foot: 'yes',
73077               motor_vehicle: 'yes',
73078               bicycle: 'yes',
73079               horse: 'yes'
73080           },
73081           unclassified: {
73082               foot: 'yes',
73083               motor_vehicle: 'yes',
73084               bicycle: 'yes',
73085               horse: 'yes'
73086           },
73087           service: {
73088               foot: 'yes',
73089               motor_vehicle: 'yes',
73090               bicycle: 'yes',
73091               horse: 'yes'
73092           },
73093           motorway_link: {
73094               foot: 'no',
73095               motor_vehicle: 'yes',
73096               bicycle: 'no',
73097               horse: 'no'
73098           },
73099           trunk_link: {
73100               motor_vehicle: 'yes'
73101           },
73102           primary_link: {
73103               foot: 'yes',
73104               motor_vehicle: 'yes',
73105               bicycle: 'yes',
73106               horse: 'yes'
73107           },
73108           secondary_link: {
73109               foot: 'yes',
73110               motor_vehicle: 'yes',
73111               bicycle: 'yes',
73112               horse: 'yes'
73113           },
73114           tertiary_link: {
73115               foot: 'yes',
73116               motor_vehicle: 'yes',
73117               bicycle: 'yes',
73118               horse: 'yes'
73119           }
73120       };
73121
73122
73123       access.tags = function(tags) {
73124           utilGetSetValue(items.selectAll('.preset-input-access'),
73125               function(d) { return tags[d] || ''; })
73126               .attr('placeholder', function() {
73127                   return tags.access ? tags.access : field.placeholder();
73128               });
73129
73130           items.selectAll('#preset-input-access-access')
73131               .attr('placeholder', 'yes');
73132
73133           var which = tags.highway;
73134           if (!placeholders[which]) return;
73135
73136           var keys = Object.keys(placeholders[which]);
73137           keys.forEach(function(k) {
73138               var v = placeholders[which][k];
73139               items.selectAll('#preset-input-access-' + k)
73140                   .attr('placeholder', tags.access || v);
73141           });
73142       };
73143
73144
73145       access.focus = function() {
73146           items.selectAll('.preset-input-access')
73147               .node().focus();
73148       };
73149
73150
73151       return utilRebind(access, dispatch$$1, 'on');
73152   }
73153
73154   function uiFieldAddress(field, context) {
73155       var dispatch$$1 = dispatch('init', 'change');
73156       var nominatim = services.geocoder;
73157       var wrap = select(null);
73158       var _isInitialized = false;
73159       var _entity;
73160
73161       function getNearStreets() {
73162           var extent = _entity.extent(context.graph());
73163           var l = extent.center();
73164           var box = geoExtent$$1(l).padByMeters(200);
73165
73166           var streets = context.intersects(box)
73167               .filter(isAddressable)
73168               .map(function(d) {
73169                   var loc = context.projection([
73170                       (extent[0][0] + extent[1][0]) / 2,
73171                       (extent[0][1] + extent[1][1]) / 2
73172                   ]);
73173                   var choice = geoChooseEdge(context.childNodes(d), loc, context.projection);
73174
73175                   return {
73176                       title: d.tags.name,
73177                       value: d.tags.name,
73178                       dist: choice.distance
73179                   };
73180               })
73181               .sort(function(a, b) {
73182                   return a.dist - b.dist;
73183               });
73184
73185           return uniqBy(streets, 'value');
73186
73187           function isAddressable(d) {
73188               return d.tags.highway && d.tags.name && d.type === 'way';
73189           }
73190       }
73191
73192
73193       function getNearCities() {
73194           var extent = _entity.extent(context.graph());
73195           var l = extent.center();
73196           var box = geoExtent$$1(l).padByMeters(200);
73197
73198           var cities = context.intersects(box)
73199               .filter(isAddressable)
73200               .map(function(d) {
73201                   return {
73202                       title: d.tags['addr:city'] || d.tags.name,
73203                       value: d.tags['addr:city'] || d.tags.name,
73204                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
73205                   };
73206               })
73207               .sort(function(a, b) {
73208                   return a.dist - b.dist;
73209               });
73210
73211           return uniqBy(cities, 'value');
73212
73213
73214           function isAddressable(d) {
73215               if (d.tags.name) {
73216                   if (d.tags.admin_level === '8' && d.tags.boundary === 'administrative')
73217                       return true;
73218                   if (d.tags.border_type === 'city')
73219                       return true;
73220                   if (d.tags.place === 'city' || d.tags.place === 'town' || d.tags.place === 'village')
73221                       return true;
73222               }
73223
73224               if (d.tags['addr:city'])
73225                   return true;
73226
73227               return false;
73228           }
73229       }
73230
73231       function getNearValues(key) {
73232           var extent = _entity.extent(context.graph());
73233           var l = extent.center();
73234           var box = geoExtent$$1(l).padByMeters(200);
73235
73236           var results = context.intersects(box)
73237               .filter(function hasTag(d) { return d.tags[key]; })
73238               .map(function(d) {
73239                   return {
73240                       title: d.tags[key],
73241                       value: d.tags[key],
73242                       dist: geoSphericalDistance(d.extent(context.graph()).center(), l)
73243                   };
73244               })
73245               .sort(function(a, b) {
73246                   return a.dist - b.dist;
73247               });
73248
73249           return uniqBy(results, 'value');
73250       }
73251
73252
73253       function initCallback(err, countryCode) {
73254           if (err) return;
73255
73256           var addressFormat = find$1(dataAddressFormats, function (a) {
73257               return a && a.countryCodes && includes(a.countryCodes, countryCode.toLowerCase());
73258           }) || dataAddressFormats[0];
73259
73260           var widths = addressFormat.widths || {
73261               housenumber: 1/3, street: 2/3,
73262               city: 2/3, state: 1/4, postcode: 1/3
73263           };
73264
73265           function row(r) {
73266               // Normalize widths.
73267               var total = reduce(r, function(sum, field) {
73268                   return sum + (widths[field] || 0.5);
73269               }, 0);
73270
73271               return r.map(function (field) {
73272                   return {
73273                       id: field,
73274                       width: (widths[field] || 0.5) / total
73275                   };
73276               });
73277           }
73278
73279           wrap.selectAll('.addr-row')
73280               .data(addressFormat.format)
73281               .enter()
73282               .append('div')
73283               .attr('class', 'addr-row')
73284               .selectAll('input')
73285               .data(row)
73286               .enter()
73287               .append('input')
73288               .property('type', 'text')
73289               .attr('placeholder', function (d) {
73290                   var localkey = d.id + '!' + countryCode.toLowerCase();
73291                   var tkey = field.strings.placeholders[localkey] ? localkey : d.id;
73292                   return field.t('placeholders.' + tkey);
73293               })
73294               .attr('class', function (d) { return 'addr-' + d.id; })
73295               .call(utilNoAuto)
73296               .style('width', function (d) { return d.width * 100 + '%'; });
73297
73298           // Update
73299
73300           // setup dropdowns for common address tags
73301           var dropdowns = addressFormat.dropdowns || [
73302               'city', 'county', 'country', 'district', 'hamlet',
73303               'neighbourhood', 'place', 'postcode', 'province',
73304               'quarter', 'state', 'street', 'subdistrict', 'suburb'
73305           ];
73306
73307           // If fields exist for any of these tags, create dropdowns to pick nearby values..
73308           dropdowns.forEach(function(tag) {
73309               var nearValues = (tag === 'street') ? getNearStreets
73310                       : (tag === 'city') ? getNearCities
73311                       : getNearValues;
73312
73313               wrap.selectAll('input.addr-' + tag)
73314                   .call(d3combobox()
73315                       .container(context.container())
73316                       .minItems(1)
73317                       .fetcher(function(value, callback) {
73318                           callback(nearValues('addr:' + tag));
73319                       })
73320                   );
73321           });
73322
73323           wrap.selectAll('input')
73324               .on('blur', change())
73325               .on('change', change());
73326
73327           wrap.selectAll('input:not(.combobox-input)')
73328               .on('input', change(true));
73329
73330           dispatch$$1.call('init');
73331           _isInitialized = true;
73332       }
73333
73334
73335       function address(selection$$1) {
73336           _isInitialized = false;
73337
73338           wrap = selection$$1.selectAll('.form-field-input-wrap')
73339               .data([0]);
73340
73341           wrap = wrap.enter()
73342               .append('div')
73343               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
73344               .merge(wrap);
73345
73346           if (nominatim && _entity) {
73347               var center = _entity.extent(context.graph()).center();
73348               nominatim.countryCode(center, initCallback);
73349           }
73350       }
73351
73352
73353       function change(onInput) {
73354           return function() {
73355               var tags = {};
73356
73357               wrap.selectAll('input')
73358                   .each(function (field) {
73359                       tags['addr:' + field.id] = this.value || undefined;
73360                   });
73361
73362               dispatch$$1.call('change', this, tags, onInput);
73363           };
73364       }
73365
73366
73367       function updateTags(tags) {
73368           utilGetSetValue(wrap.selectAll('input'), function (field) {
73369               return tags['addr:' + field.id] || '';
73370           });
73371       }
73372
73373
73374       address.entity = function(val) {
73375           if (!arguments.length) return _entity;
73376           _entity = val;
73377           return address;
73378       };
73379
73380
73381       address.tags = function(tags) {
73382           if (_isInitialized) {
73383               updateTags(tags);
73384           } else {
73385               dispatch$$1.on('init', function () {
73386                   dispatch$$1.on('init', null);
73387                   updateTags(tags);
73388               });
73389           }
73390       };
73391
73392
73393       address.focus = function() {
73394           var node = wrap.selectAll('input').node();
73395           if (node) node.focus();
73396       };
73397
73398
73399       return utilRebind(address, dispatch$$1, 'on');
73400   }
73401
73402   function uiFieldCycleway(field, context) {
73403       var dispatch$$1 = dispatch('change');
73404       var items = select(null);
73405
73406
73407       function cycleway(selection$$1) {
73408
73409           function stripcolon(s) {
73410               return s.replace(':', '');
73411           }
73412
73413
73414           var wrap = selection$$1.selectAll('.form-field-input-wrap')
73415               .data([0]);
73416
73417           wrap = wrap.enter()
73418               .append('div')
73419               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
73420               .merge(wrap);
73421
73422
73423           var div = wrap.selectAll('ul')
73424               .data([0]);
73425
73426           div = div.enter()
73427               .append('ul')
73428               .attr('class', 'labeled-inputs')
73429               .merge(div);
73430
73431
73432           items = div.selectAll('li')
73433               .data(field.keys);
73434
73435           var enter = items.enter()
73436               .append('li')
73437               .attr('class', function(d) { return 'preset-cycleway-' + stripcolon(d); });
73438
73439           enter
73440               .append('span')
73441               .attr('class', 'label preset-label-cycleway')
73442               .attr('for', function(d) { return 'preset-input-cycleway-' + stripcolon(d); })
73443               .text(function(d) { return field.t('types.' + d); });
73444
73445           enter
73446               .append('div')
73447               .attr('class', 'preset-input-cycleway-wrap')
73448               .append('input')
73449               .attr('type', 'text')
73450               .attr('class', function(d) { return 'preset-input-cycleway preset-input-' + stripcolon(d); })
73451               .call(utilNoAuto)
73452               .each(function(d) {
73453                   select(this)
73454                       .call(d3combobox()
73455                           .container(context.container())
73456                           .data(cycleway.options(d))
73457                       );
73458               });
73459
73460
73461           // Update
73462           wrap.selectAll('.preset-input-cycleway')
73463               .on('change', change)
73464               .on('blur', change);
73465       }
73466
73467
73468       function change() {
73469           var left = utilGetSetValue(select('.preset-input-cyclewayleft'));
73470           var right = utilGetSetValue(select('.preset-input-cyclewayright'));
73471           var tag = {};
73472
73473           if (left === 'none' || left === '') { left = undefined; }
73474           if (right === 'none' || right === '') { right = undefined; }
73475
73476           // Always set both left and right as changing one can affect the other
73477           tag = {
73478               cycleway: undefined,
73479               'cycleway:left': left,
73480               'cycleway:right': right
73481           };
73482
73483           // If the left and right tags match, use the cycleway tag to tag both
73484           // sides the same way
73485           if (left === right) {
73486               tag = {
73487                   cycleway: left,
73488                   'cycleway:left': undefined,
73489                   'cycleway:right': undefined
73490               };
73491           }
73492
73493           dispatch$$1.call('change', this, tag);
73494       }
73495
73496
73497       cycleway.options = function() {
73498           return Object.keys(field.strings.options).map(function(option) {
73499               return {
73500                   title: field.t('options.' + option + '.description'),
73501                   value: option
73502               };
73503           });
73504       };
73505
73506
73507       cycleway.tags = function(tags) {
73508           utilGetSetValue(items.selectAll('.preset-input-cycleway'), function(d) {
73509                   // If cycleway is set, always return that
73510                   if (tags.cycleway) {
73511                       return tags.cycleway;
73512                   }
73513                   return tags[d] || '';
73514               })
73515               .attr('placeholder', field.placeholder());
73516       };
73517
73518
73519       cycleway.focus = function() {
73520           items.selectAll('.preset-input-cycleway')
73521               .node().focus();
73522       };
73523
73524
73525       return utilRebind(cycleway, dispatch$$1, 'on');
73526   }
73527
73528   function uiFieldLanes(field, context) {
73529       var dispatch$$1 = dispatch('change');
73530       var LANE_WIDTH = 40;
73531       var LANE_HEIGHT = 200;
73532       var _entityID;
73533
73534       function lanes(selection$$1) {
73535           var lanesData = context.entity(_entityID).lanes();
73536
73537           if (!select('.inspector-wrap.inspector-hidden').empty() || !selection$$1.node().parentNode) {
73538               selection$$1.call(lanes.off);
73539               return;
73540           }
73541
73542           var wrap = selection$$1.selectAll('.form-field-input-wrap')
73543               .data([0]);
73544
73545           wrap = wrap.enter()
73546               .append('div')
73547               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
73548               .merge(wrap);
73549
73550           var surface =  wrap.selectAll('.surface')
73551               .data([0]);
73552
73553           var d = utilGetDimensions(wrap);
73554           var freeSpace = d[0] - lanesData.lanes.length * LANE_WIDTH * 1.5 + LANE_WIDTH * 0.5;
73555
73556           surface = surface.enter()
73557               .append('svg')
73558               .attr('width', d[0])
73559               .attr('height', 300)
73560               .attr('class', 'surface')
73561               .merge(surface);
73562
73563
73564           var lanesSelection = surface.selectAll('.lanes')
73565               .data([0]);
73566
73567           lanesSelection = lanesSelection.enter()
73568               .append('g')
73569               .attr('class', 'lanes')
73570               .merge(lanesSelection);
73571
73572           lanesSelection
73573               .attr('transform', function () {
73574                   return 'translate(' + (freeSpace / 2) + ', 0)';
73575               });
73576
73577
73578           var lane = lanesSelection.selectAll('.lane')
73579              .data(lanesData.lanes);
73580
73581           lane.exit()
73582               .remove();
73583
73584           var enter = lane.enter()
73585               .append('g')
73586               .attr('class', 'lane');
73587
73588           enter
73589               .append('g')
73590               .append('rect')
73591               .attr('y', 50)
73592               .attr('width', LANE_WIDTH)
73593               .attr('height', LANE_HEIGHT);
73594
73595           enter
73596               .append('g')
73597               .attr('class', 'forward')
73598               .append('text')
73599               .attr('y', 40)
73600               .attr('x', 14)
73601               .text('▲');
73602
73603           enter
73604               .append('g')
73605               .attr('class', 'bothways')
73606               .append('text')
73607               .attr('y', 40)
73608               .attr('x', 14)
73609               .text('▲▼');
73610
73611           enter
73612               .append('g')
73613               .attr('class', 'backward')
73614               .append('text')
73615               .attr('y', 40)
73616               .attr('x', 14)
73617               .text('▼');
73618
73619
73620           lane = lane
73621               .merge(enter);
73622
73623           lane
73624               .attr('transform', function(d) {
73625                   return 'translate(' + (LANE_WIDTH * d.index * 1.5) + ', 0)';
73626               });
73627
73628           lane.select('.forward')
73629               .style('visibility', function(d) {
73630                   return d.direction === 'forward' ? 'visible' : 'hidden';
73631               });
73632
73633           lane.select('.bothways')
73634               .style('visibility', function(d) {
73635                   return d.direction === 'bothways' ? 'visible' : 'hidden';
73636               });
73637
73638           lane.select('.backward')
73639               .style('visibility', function(d) {
73640                   return d.direction === 'backward' ? 'visible' : 'hidden';
73641               });
73642       }
73643
73644
73645       lanes.entity = function(val) {
73646           if (!_entityID || _entityID !== val.id) {
73647               _entityID = val.id;
73648           }
73649       };
73650
73651       lanes.tags = function() {};
73652       lanes.focus = function() {};
73653       lanes.off = function() {};
73654
73655       return utilRebind(lanes, dispatch$$1, 'on');
73656   }
73657
73658   function uiFieldLocalized(field, context) {
73659       var dispatch$$1 = dispatch('change', 'input');
73660       var wikipedia = services.wikipedia;
73661       var input = select(null);
73662       var localizedInputs = select(null);
73663       var _selection = select(null);
73664       var _multilingual = [];
73665       var _isLocked = false;
73666       var _brandTip = tooltip()
73667           .title(t('inspector.lock.suggestion', { label: field.label }))
73668           .placement('bottom');
73669       var _buttonTip = tooltip()
73670           .title(t('translate.translate'))
73671           .placement('left');
73672       var _wikiTitles;
73673       var _entity;
73674
73675
73676       function calcLocked() {
73677           if (!_entity) {    // the original entity
73678               _isLocked = false;
73679               return;
73680           }
73681
73682           var latest = context.hasEntity(_entity.id);
73683           if (!latest) {    // get current entity, possibly edited
73684               _isLocked = false;
73685               return;
73686           }
73687
73688           var hasOriginalName = (latest.tags.name && latest.tags.name === _entity.tags.name);
73689           var hasWikidata = latest.tags.wikidata;
73690           var preset = context.presets().match(latest, context.graph());
73691           var isSuggestion = preset && preset.suggestion;
73692           var showsBrand = preset && preset.fields
73693               .filter(function(d) { return d.id === 'brand'; }).length;
73694
73695           _isLocked = !!(field.id === 'name' && hasOriginalName &&
73696               (hasWikidata || (isSuggestion && !showsBrand)));
73697       }
73698
73699
73700       function calcMultilingual(tags) {
73701           _multilingual = [];
73702           for (var k in tags) {
73703               var m = k.match(/^(.*):([a-zA-Z_-]+)$/);
73704               if (m && m[1] === field.key && m[2]) {
73705                   _multilingual.push({ lang: m[2], value: tags[k] });
73706               }
73707           }
73708           _multilingual.reverse();
73709       }
73710
73711
73712       function localized(selection$$1) {
73713           _selection = selection$$1;
73714           calcLocked();
73715           var entity = _entity && context.hasEntity(_entity.id);  // get latest
73716           var preset = entity && context.presets().match(entity, context.graph());
73717
73718           var wrap = selection$$1.selectAll('.form-field-input-wrap')
73719               .data([0]);
73720
73721           // enter/update
73722           wrap = wrap.enter()
73723               .append('div')
73724               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
73725               .merge(wrap)
73726               .call(_isLocked ? _brandTip : _brandTip.destroy);
73727
73728
73729           input = wrap.selectAll('.localized-main')
73730               .data([0]);
73731
73732           // enter/update
73733           input = input.enter()
73734               .append('input')
73735               .attr('type', 'text')
73736               .attr('id', 'preset-input-' + field.safeid)
73737               .attr('class', 'localized-main')
73738               .attr('placeholder', field.placeholder())
73739               .call(utilNoAuto)
73740               .merge(input);
73741
73742           if (preset && field.id === 'name') {
73743               var pTag = preset.id.split('/', 2);
73744               var pKey = pTag[0];
73745               var pValue = pTag[1];
73746
73747               if (preset.suggestion) {
73748                   // A "suggestion" preset (brand name)
73749                   // Put suggestion keys in `field.keys` so delete button can remove them all.
73750                   field.keys = Object.keys(preset.removeTags)
73751                       .filter(function(k) { return k !== pKey; });
73752
73753               } else {
73754                   // Not a suggestion preset - Add a suggestions dropdown if it makes sense to.
73755                   var allSuggestions = context.presets().collection.filter(function(p) {
73756                       return p.suggestion === true;
73757                   });
73758
73759                   // This code attempts to determine if the matched preset is the
73760                   // kind of preset that even can benefit from name suggestions..
73761                   // - true = shops, cafes, hotels, etc. (also generic and fallback presets)
73762                   // - false = churches, parks, hospitals, etc. (things not in the index)
73763                   var isFallback = preset.isFallback();
73764                   var goodSuggestions = allSuggestions.filter(function(s) {
73765                       if (isFallback) return true;
73766                       var sTag = s.id.split('/', 2);
73767                       var sKey = sTag[0];
73768                       var sValue = sTag[1];
73769                       return pKey === sKey && (!pValue || pValue === sValue);
73770                   });
73771
73772                   // Show the suggestions.. If the user picks one, change the tags..
73773                   if (allSuggestions.length && goodSuggestions.length) {
73774                       input
73775                           .call(d3combobox()
73776                               .container(context.container())
73777                               .fetcher(suggestNames(preset, allSuggestions))
73778                               .minItems(1)
73779                               .on('accept', function(d) {
73780                                   var entity = context.entity(_entity.id);  // get latest
73781                                   var tags = entity.tags;
73782                                   var geometry = entity.geometry(context.graph());
73783                                   var removed = preset.unsetTags(tags, geometry);
73784                                   for (var k in tags) {
73785                                       tags[k] = removed[k];  // set removed tags to `undefined`
73786                                   }
73787                                   tags = d.suggestion.setTags(tags, geometry);
73788                                   utilGetSetValue(input, tags.name);
73789                                   dispatch$$1.call('change', this, tags);
73790                               })
73791                           );
73792                   }
73793               }
73794           }
73795
73796           input
73797               .classed('disabled', !!_isLocked)
73798               .attr('readonly', _isLocked || null)
73799               .on('input', change(true))
73800               .on('blur', change())
73801               .on('change', change());
73802
73803
73804           var translateButton = wrap.selectAll('.localized-add')
73805               .data([0]);
73806
73807           translateButton = translateButton.enter()
73808               .append('button')
73809               .attr('class', 'localized-add form-field-button')
73810               .attr('tabindex', -1)
73811               .call(svgIcon('#iD-icon-plus'))
73812               .merge(translateButton);
73813
73814           translateButton
73815               .classed('disabled', !!_isLocked)
73816               .call(_isLocked ? _buttonTip.destroy : _buttonTip)
73817               .on('click', addNew);
73818
73819
73820           if (entity && !_multilingual.length) {
73821               calcMultilingual(entity.tags);
73822           }
73823
73824           localizedInputs = selection$$1.selectAll('.localized-multilingual')
73825               .data([0]);
73826
73827           localizedInputs = localizedInputs.enter()
73828               .append('div')
73829               .attr('class', 'localized-multilingual')
73830               .merge(localizedInputs);
73831
73832           localizedInputs
73833               .call(renderMultilingual);
73834
73835           localizedInputs.selectAll('button, input')
73836               .classed('disabled', !!_isLocked)
73837               .attr('readonly', _isLocked || null);
73838
73839
73840
73841           function suggestNames(preset, suggestions) {
73842               var pTag = preset.id.split('/', 2);
73843               var pKey = pTag[0];
73844               var pValue = pTag[1];
73845
73846               return function(value, callback) {
73847                   var results = [];
73848                   if (value && value.length > 2) {
73849                       for (var i = 0; i < suggestions.length; i++) {
73850                           var s = suggestions[i];
73851                           var sTag = s.id.split('/', 2);
73852                           var sKey = sTag[0];
73853                           var sValue = sTag[1];
73854                           var name = s.name();
73855                           var dist = utilEditDistance(value, name.substring(0, value.length));
73856                           var matchesPreset = (pKey === sKey && (!pValue || pValue === sValue));
73857
73858                           if (dist < 1 || (matchesPreset && dist < 3)) {
73859                               var obj = {
73860                                   title: name,
73861                                   value: name,
73862                                   suggestion: s,
73863                                   dist: dist + (matchesPreset ? 0 : 1)  // penalize if not matched preset
73864                               };
73865                               results.push(obj);
73866                           }
73867                       }
73868                       results.sort(function(a, b) { return a.dist - b.dist; });
73869                   }
73870                   results = results.slice(0, 10);
73871                   callback(results);
73872               };
73873           }
73874
73875
73876           function addNew() {
73877               event.preventDefault();
73878               if (_isLocked) return;
73879
73880               var defaultLang = utilDetect().locale.toLowerCase().split('-')[0];
73881               var langExists = find$1(_multilingual, function(datum) { return datum.lang === defaultLang;});
73882               var isLangEn = defaultLang.indexOf('en') > -1;
73883               if (isLangEn || langExists) {
73884                   defaultLang = '';
73885               }
73886               _multilingual.push({ lang: defaultLang, value: '' });
73887
73888               localizedInputs
73889                   .call(renderMultilingual);
73890           }
73891
73892
73893           function change(onInput) {
73894               return function() {
73895                   if (_isLocked) {
73896                       event.preventDefault();
73897                       return;
73898                   }
73899                   var t$$1 = {};
73900                   t$$1[field.key] = utilGetSetValue(select(this)) || undefined;
73901                   dispatch$$1.call('change', this, t$$1, onInput);
73902               };
73903           }
73904       }
73905
73906
73907       function key(lang) {
73908           return field.key + ':' + lang;
73909       }
73910
73911
73912       function changeLang(d) {
73913           var lang = utilGetSetValue(select(this));
73914           var t$$1 = {};
73915           var language = find$1(wikipedia$2, function(d) {
73916               return d[0].toLowerCase() === lang.toLowerCase() ||
73917                   d[1].toLowerCase() === lang.toLowerCase();
73918           });
73919
73920           if (language) lang = language[2];
73921
73922           if (d.lang && d.lang !== lang) {
73923               t$$1[key(d.lang)] = undefined;
73924           }
73925
73926           var value = utilGetSetValue(select(this.parentNode)
73927               .selectAll('.localized-value'));
73928
73929           if (lang && value) {
73930               t$$1[key(lang)] = value;
73931           } else if (lang && _wikiTitles && _wikiTitles[d.lang]) {
73932               t$$1[key(lang)] = _wikiTitles[d.lang];
73933           }
73934
73935           d.lang = lang;
73936           dispatch$$1.call('change', this, t$$1);
73937       }
73938
73939
73940       function changeValue(d) {
73941           if (!d.lang) return;
73942           var t$$1 = {};
73943           t$$1[key(d.lang)] = utilGetSetValue(select(this)) || undefined;
73944           dispatch$$1.call('change', this, t$$1);
73945       }
73946
73947
73948       function fetcher(value, cb) {
73949           var v = value.toLowerCase();
73950
73951           cb(wikipedia$2.filter(function(d) {
73952               return d[0].toLowerCase().indexOf(v) >= 0 ||
73953               d[1].toLowerCase().indexOf(v) >= 0 ||
73954               d[2].toLowerCase().indexOf(v) >= 0;
73955           }).map(function(d) {
73956               return { value: d[1] };
73957           }));
73958       }
73959
73960
73961       function renderMultilingual(selection$$1) {
73962           var wraps = selection$$1.selectAll('div.entry')
73963               .data(_multilingual, function(d) { return d.lang; });
73964
73965           wraps.exit()
73966               .transition()
73967               .duration(200)
73968               .style('max-height', '0px')
73969               .style('opacity', '0')
73970               .style('top', '-10px')
73971               .remove();
73972
73973           var innerWrap = wraps.enter()
73974               .insert('div', ':first-child');
73975
73976           innerWrap
73977               .attr('class', 'entry')
73978               .each(function() {
73979                   var wrap = select(this);
73980                   var langcombo = d3combobox()
73981                       .container(context.container())
73982                       .fetcher(fetcher)
73983                       .minItems(0);
73984
73985                   var label = wrap
73986                       .append('label')
73987                       .attr('class', 'form-field-label');
73988
73989                   label
73990                       .append('span')
73991                       .attr('class', 'label-text')
73992                       .text(t('translate.localized_translation_label'));
73993
73994                   label
73995                       .append('button')
73996                       .attr('class', 'remove-icon-multilingual')
73997                       .on('click', function(d){
73998                           if (_isLocked) return;
73999                           event.preventDefault();
74000                           var t$$1 = {};
74001                           t$$1[key(d.lang)] = undefined;
74002                           dispatch$$1.call('change', this, t$$1);
74003                           select(this.parentNode.parentNode.parentNode)
74004                               .style('top', '0')
74005                               .style('max-height', '240px')
74006                               .transition()
74007                               .style('opacity', '0')
74008                               .style('max-height', '0px')
74009                               .remove();
74010                       })
74011                       .call(svgIcon('#iD-operation-delete'));
74012
74013                   wrap
74014                       .append('input')
74015                       .attr('class', 'localized-lang')
74016                       .attr('type', 'text')
74017                       .attr('placeholder', t('translate.localized_translation_language'))
74018                       .on('blur', changeLang)
74019                       .on('change', changeLang)
74020                       .call(langcombo);
74021
74022                   wrap
74023                       .append('input')
74024                       .attr('type', 'text')
74025                       .attr('placeholder', t('translate.localized_translation_name'))
74026                       .attr('class', 'localized-value')
74027                       .on('blur', changeValue)
74028                       .on('change', changeValue);
74029               });
74030
74031           innerWrap
74032               .style('margin-top', '0px')
74033               .style('max-height', '0px')
74034               .style('opacity', '0')
74035               .transition()
74036               .duration(200)
74037               .style('margin-top', '10px')
74038               .style('max-height', '240px')
74039               .style('opacity', '1')
74040               .on('end', function() {
74041                   select(this)
74042                       .style('max-height', '')
74043                       .style('overflow', 'visible');
74044               });
74045
74046
74047           var entry = selection$$1.selectAll('.entry');
74048
74049           utilGetSetValue(entry.select('.localized-lang'), function(d) {
74050               var lang = find$1(wikipedia$2, function(lang) { return lang[2] === d.lang; });
74051               return lang ? lang[1] : d.lang;
74052           });
74053
74054           utilGetSetValue(entry.select('.localized-value'),
74055               function(d) { return d.value; });
74056       }
74057
74058
74059       localized.tags = function(tags) {
74060           // Fetch translations from wikipedia
74061           if (tags.wikipedia && !_wikiTitles) {
74062               _wikiTitles = {};
74063               var wm = tags.wikipedia.match(/([^:]+):(.+)/);
74064               if (wm && wm[0] && wm[1]) {
74065                   wikipedia.translations(wm[1], wm[2], function(d) { _wikiTitles = d; });
74066               }
74067           }
74068
74069           utilGetSetValue(input, tags[field.key] || '');
74070
74071           calcMultilingual(tags);
74072
74073           _selection
74074               .call(localized);
74075       };
74076
74077
74078       localized.focus = function() {
74079           input.node().focus();
74080       };
74081
74082
74083       localized.entity = function(val) {
74084           if (!arguments.length) return _entity;
74085           _entity = val;
74086           _multilingual = [];
74087           return localized;
74088       };
74089
74090       return utilRebind(localized, dispatch$$1, 'on');
74091   }
74092
74093   function uiFieldMaxspeed(field, context) {
74094       var dispatch$$1 = dispatch('change');
74095       var unitInput = select(null);
74096       var input = select(null);
74097       var combobox;
74098       var _entity;
74099       var _isImperial;
74100
74101       var metricValues = [20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120];
74102       var imperialValues = [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70, 75, 80];
74103
74104
74105       function maxspeed(selection$$1) {
74106           combobox = d3combobox()
74107               .container(context.container());
74108
74109           var unitCombobox = d3combobox()
74110               .container(context.container())
74111               .data(['km/h', 'mph'].map(comboValues));
74112
74113           var wrap = selection$$1.selectAll('.form-field-input-wrap')
74114               .data([0]);
74115
74116           wrap = wrap.enter()
74117               .append('div')
74118               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
74119               .merge(wrap);
74120
74121
74122           input = wrap.selectAll('#preset-input-' + field.safeid)
74123               .data([0]);
74124
74125           input = input.enter()
74126               .append('input')
74127               .attr('type', 'text')
74128               .attr('id', 'preset-input-' + field.safeid)
74129               .attr('placeholder', field.placeholder())
74130               .call(utilNoAuto)
74131               .call(combobox)
74132               .merge(input);
74133
74134           input
74135               .on('change', change)
74136               .on('blur', change);
74137
74138           var loc;
74139           if (_entity.type === 'node') {
74140               loc = _entity.loc;
74141           } else {
74142               var childNodes = context.graph().childNodes(context.entity(_entity.id));
74143               loc = childNodes[~~(childNodes.length/2)].loc;
74144           }
74145
74146           _isImperial = some(dataImperial.features, function(f) {
74147               return some(f.geometry.coordinates, function(d) {
74148                   return geoPointInPolygon(loc, d);
74149               });
74150           });
74151
74152           unitInput = wrap.selectAll('input.maxspeed-unit')
74153               .data([0]);
74154
74155           unitInput = unitInput.enter()
74156               .append('input')
74157               .attr('type', 'text')
74158               .attr('class', 'maxspeed-unit')
74159               .call(unitCombobox)
74160               .merge(unitInput);
74161
74162           unitInput
74163               .on('blur', changeUnits)
74164               .on('change', changeUnits);
74165
74166
74167           function changeUnits() {
74168               _isImperial = utilGetSetValue(unitInput) === 'mph';
74169               utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
74170               setSuggestions();
74171               change();
74172           }
74173       }
74174
74175
74176       function setSuggestions() {
74177           combobox.data((_isImperial ? imperialValues : metricValues).map(comboValues));
74178           utilGetSetValue(unitInput, _isImperial ? 'mph' : 'km/h');
74179       }
74180
74181
74182       function comboValues(d) {
74183           return {
74184               value: d.toString(),
74185               title: d.toString()
74186           };
74187       }
74188
74189
74190       function change() {
74191           var tag = {};
74192           var value = utilGetSetValue(input);
74193
74194           if (!value) {
74195               tag[field.key] = undefined;
74196           } else if (isNaN(value) || !_isImperial) {
74197               tag[field.key] = value;
74198           } else {
74199               tag[field.key] = value + ' mph';
74200           }
74201
74202           dispatch$$1.call('change', this, tag);
74203       }
74204
74205
74206       maxspeed.tags = function(tags) {
74207           var value = tags[field.key];
74208
74209           if (value && value.indexOf('mph') >= 0) {
74210               value = parseInt(value, 10);
74211               _isImperial = true;
74212           } else if (value) {
74213               _isImperial = false;
74214           }
74215
74216           setSuggestions();
74217           utilGetSetValue(input, value || '');
74218       };
74219
74220
74221       maxspeed.focus = function() {
74222           input.node().focus();
74223       };
74224
74225
74226       maxspeed.entity = function(val) {
74227           _entity = val;
74228       };
74229
74230
74231       return utilRebind(maxspeed, dispatch$$1, 'on');
74232   }
74233
74234   /**
74235    * This function is like `baseIndexOf` except that it accepts a comparator.
74236    *
74237    * @private
74238    * @param {Array} array The array to inspect.
74239    * @param {*} value The value to search for.
74240    * @param {number} fromIndex The index to search from.
74241    * @param {Function} comparator The comparator invoked per element.
74242    * @returns {number} Returns the index of the matched value, else `-1`.
74243    */
74244   function baseIndexOfWith(array, value, fromIndex, comparator) {
74245     var index = fromIndex - 1,
74246         length = array.length;
74247
74248     while (++index < length) {
74249       if (comparator(array[index], value)) {
74250         return index;
74251       }
74252     }
74253     return -1;
74254   }
74255
74256   /** Used for built-in method references. */
74257   var arrayProto$2 = Array.prototype;
74258
74259   /** Built-in value references. */
74260   var splice$2 = arrayProto$2.splice;
74261
74262   /**
74263    * The base implementation of `_.pullAllBy` without support for iteratee
74264    * shorthands.
74265    *
74266    * @private
74267    * @param {Array} array The array to modify.
74268    * @param {Array} values The values to remove.
74269    * @param {Function} [iteratee] The iteratee invoked per element.
74270    * @param {Function} [comparator] The comparator invoked per element.
74271    * @returns {Array} Returns `array`.
74272    */
74273   function basePullAll(array, values, iteratee, comparator) {
74274     var indexOf = comparator ? baseIndexOfWith : baseIndexOf,
74275         index = -1,
74276         length = values.length,
74277         seen = array;
74278
74279     if (array === values) {
74280       values = copyArray(values);
74281     }
74282     if (iteratee) {
74283       seen = arrayMap(array, baseUnary(iteratee));
74284     }
74285     while (++index < length) {
74286       var fromIndex = 0,
74287           value = values[index],
74288           computed = iteratee ? iteratee(value) : value;
74289
74290       while ((fromIndex = indexOf(seen, computed, fromIndex, comparator)) > -1) {
74291         if (seen !== array) {
74292           splice$2.call(seen, fromIndex, 1);
74293         }
74294         splice$2.call(array, fromIndex, 1);
74295       }
74296     }
74297     return array;
74298   }
74299
74300   /**
74301    * This method is like `_.pull` except that it accepts an array of values to remove.
74302    *
74303    * **Note:** Unlike `_.difference`, this method mutates `array`.
74304    *
74305    * @static
74306    * @memberOf _
74307    * @since 4.0.0
74308    * @category Array
74309    * @param {Array} array The array to modify.
74310    * @param {Array} values The values to remove.
74311    * @returns {Array} Returns `array`.
74312    * @example
74313    *
74314    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
74315    *
74316    * _.pullAll(array, ['a', 'c']);
74317    * console.log(array);
74318    * // => ['b', 'b']
74319    */
74320   function pullAll(array, values) {
74321     return (array && array.length && values && values.length)
74322       ? basePullAll(array, values)
74323       : array;
74324   }
74325
74326   /**
74327    * Removes all given values from `array` using
74328    * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
74329    * for equality comparisons.
74330    *
74331    * **Note:** Unlike `_.without`, this method mutates `array`. Use `_.remove`
74332    * to remove elements from an array by predicate.
74333    *
74334    * @static
74335    * @memberOf _
74336    * @since 2.0.0
74337    * @category Array
74338    * @param {Array} array The array to modify.
74339    * @param {...*} [values] The values to remove.
74340    * @returns {Array} Returns `array`.
74341    * @example
74342    *
74343    * var array = ['a', 'b', 'c', 'a', 'b', 'c'];
74344    *
74345    * _.pull(array, 'a', 'c');
74346    * console.log(array);
74347    * // => ['b', 'b']
74348    */
74349   var pull = baseRest(pullAll);
74350
74351   function uiFieldRadio(field, context) {
74352       var dispatch$$1 = dispatch('change');
74353       var placeholder = select(null);
74354       var wrap = select(null);
74355       var labels = select(null);
74356       var radios = select(null);
74357       var radioData = clone(field.options || field.keys);
74358       var typeField;
74359       var layerField;
74360       var _oldType = {};
74361       var _entity;
74362
74363
74364       function selectedKey() {
74365           var node = wrap.selectAll('.form-field-input-radio label.active input');
74366           return !node.empty() && node.datum();
74367       }
74368
74369
74370       function radio(selection$$1) {
74371           selection$$1.classed('preset-radio', true);
74372
74373           wrap = selection$$1.selectAll('.form-field-input-wrap')
74374               .data([0]);
74375
74376           var enter = wrap.enter()
74377               .append('div')
74378               .attr('class', 'form-field-input-wrap form-field-input-radio');
74379
74380           enter
74381               .append('span')
74382               .attr('class', 'placeholder');
74383
74384           wrap = wrap
74385               .merge(enter);
74386
74387
74388           placeholder = wrap.selectAll('.placeholder');
74389
74390           labels = wrap.selectAll('label')
74391               .data(radioData);
74392
74393           enter = labels.enter()
74394               .append('label');
74395
74396           enter
74397               .append('input')
74398               .attr('type', 'radio')
74399               .attr('name', field.id)
74400               .attr('value', function(d) { return field.t('options.' + d, { 'default': d }); })
74401               .attr('checked', false);
74402
74403           enter
74404               .append('span')
74405               .text(function(d) { return field.t('options.' + d, { 'default': d }); });
74406
74407           labels = labels
74408               .merge(enter);
74409
74410           radios = labels.selectAll('input')
74411               .on('change', changeRadio);
74412
74413       }
74414
74415
74416       function structureExtras(selection$$1, tags) {
74417           var selected = selectedKey();
74418           var type = context.presets().field(selected);
74419           var layer = context.presets().field('layer');
74420           var showLayer = (selected === 'bridge' || selected === 'tunnel');
74421
74422
74423           var extrasWrap = selection$$1.selectAll('.structure-extras-wrap')
74424               .data(selected ? [0] : []);
74425
74426           extrasWrap.exit()
74427               .remove();
74428
74429           extrasWrap = extrasWrap.enter()
74430               .append('div')
74431               .attr('class', 'structure-extras-wrap')
74432               .merge(extrasWrap);
74433
74434           var list = extrasWrap.selectAll('ul')
74435               .data([0]);
74436
74437           list = list.enter()
74438               .append('ul')
74439               .attr('class', 'labeled-inputs')
74440               .merge(list);
74441
74442
74443           // Type
74444           if (type) {
74445               if (!typeField || typeField.id !== selected) {
74446                   typeField = uiField(context, type, _entity, { wrap: false })
74447                       .on('change', changeType);
74448               }
74449               typeField.tags(tags);
74450           } else {
74451               typeField = null;
74452           }
74453
74454           var typeItem = list.selectAll('.structure-type-item')
74455               .data(typeField ? [typeField] : [], function(d) { return d.id; });
74456
74457           // Exit
74458           typeItem.exit()
74459               .remove();
74460
74461           // Enter
74462           var typeEnter = typeItem.enter()
74463               .insert('li', ':first-child')
74464               .attr('class', 'structure-type-item');
74465
74466           typeEnter
74467               .append('span')
74468               .attr('class', 'label structure-label-type')
74469               .attr('for', 'preset-input-' + selected)
74470               .text(t('inspector.radio.structure.type'));
74471
74472           typeEnter
74473               .append('div')
74474               .attr('class', 'structure-input-type-wrap');
74475
74476           // Update
74477           typeItem = typeItem
74478               .merge(typeEnter);
74479
74480           if (typeField) {
74481               typeItem.selectAll('.structure-input-type-wrap')
74482                   .call(typeField.render);
74483           }
74484
74485
74486           // Layer
74487           if (layer && showLayer) {
74488               if (!layerField) {
74489                   layerField = uiField(context, layer, _entity, { wrap: false })
74490                       .on('change', changeLayer);
74491               }
74492               layerField.tags(tags);
74493               field.keys = union(field.keys, ['layer']);
74494           } else {
74495               layerField = null;
74496               pull(field.keys, 'layer');
74497           }
74498
74499           var layerItem = list.selectAll('.structure-layer-item')
74500               .data(layerField ? [layerField] : []);
74501
74502           // Exit
74503           layerItem.exit()
74504               .remove();
74505
74506           // Enter
74507           var layerEnter = layerItem.enter()
74508               .append('li')
74509               .attr('class', 'structure-layer-item');
74510
74511           layerEnter
74512               .append('span')
74513               .attr('class', 'label structure-label-layer')
74514               .attr('for', 'preset-input-layer')
74515               .text(t('inspector.radio.structure.layer'));
74516
74517           layerEnter
74518               .append('div')
74519               .attr('class', 'structure-input-layer-wrap');
74520
74521           // Update
74522           layerItem = layerItem
74523               .merge(layerEnter);
74524
74525           if (layerField) {
74526               layerItem.selectAll('.structure-input-layer-wrap')
74527                   .call(layerField.render);
74528           }
74529       }
74530
74531
74532       function changeType(t$$1, onInput) {
74533           var key = selectedKey();
74534           if (!key) return;
74535
74536           var val = t$$1[key];
74537           if (val !== 'no') {
74538               _oldType[key] = val;
74539           }
74540
74541           if (field.type === 'structureRadio') {
74542               // remove layer if it should not be set
74543               if (val === 'no' ||
74544                   (key !== 'bridge' && key !== 'tunnel') ||
74545                   (key === 'tunnel' && val === 'building_passage')) {
74546                   t$$1.layer = undefined;
74547               }
74548               // add layer if it should be set
74549               if (t$$1.layer === undefined) {
74550                   if (key === 'bridge' && val !== 'no') {
74551                       t$$1.layer = '1';
74552                   }
74553                   if (key === 'tunnel' && val !== 'no' && val !== 'building_passage') {
74554                       t$$1.layer = '-1';
74555                   }
74556               }
74557            }
74558
74559           dispatch$$1.call('change', this, t$$1, onInput);
74560       }
74561
74562
74563       function changeLayer(t$$1, onInput) {
74564           if (t$$1.layer === '0') {
74565               t$$1.layer = undefined;
74566           }
74567           dispatch$$1.call('change', this, t$$1, onInput);
74568       }
74569
74570
74571       function changeRadio() {
74572           var t$$1 = {};
74573           var activeKey;
74574
74575           if (field.key) {
74576               t$$1[field.key] = undefined;
74577           }
74578
74579           radios.each(function(d) {
74580               var active = select(this).property('checked');
74581               if (active) activeKey = d;
74582
74583               if (field.key) {
74584                   if (active) t$$1[field.key] = d;
74585               } else {
74586                   var val = _oldType[activeKey] || 'yes';
74587                   t$$1[d] = active ? val : undefined;
74588               }
74589           });
74590
74591           if (field.type === 'structureRadio') {
74592               if (activeKey === 'bridge') {
74593                   t$$1.layer = '1';
74594               } else if (activeKey === 'tunnel' && t$$1.tunnel !== 'building_passage') {
74595                   t$$1.layer = '-1';
74596               } else {
74597                   t$$1.layer = undefined;
74598               }
74599           }
74600
74601           dispatch$$1.call('change', this, t$$1);
74602       }
74603
74604
74605       radio.tags = function(tags) {
74606           function checked(d) {
74607               if (field.key) {
74608                   return tags[field.key] === d;
74609               } else {
74610                   return !!(tags[d] && tags[d].toLowerCase() !== 'no');
74611               }
74612           }
74613
74614           labels.classed('active', checked);
74615           radios.property('checked', checked);
74616
74617           var selection$$1 = radios.filter(function() { return this.checked; });
74618
74619           if (selection$$1.empty()) {
74620               placeholder.text(t('inspector.none'));
74621           } else {
74622               placeholder.text(selection$$1.attr('value'));
74623               _oldType[selection$$1.datum()] = tags[selection$$1.datum()];
74624           }
74625
74626           if (field.type === 'structureRadio') {
74627               // For waterways without a tunnel tag, set 'culvert' as
74628               // the _oldType to default to if the user picks 'tunnel'
74629               if (!!tags.waterway && !_oldType.tunnel) {
74630                   _oldType.tunnel = 'culvert';
74631               }
74632
74633               wrap.call(structureExtras, tags);
74634           }
74635       };
74636
74637
74638       radio.focus = function() {
74639           radios.node().focus();
74640       };
74641
74642
74643       radio.entity = function(val) {
74644           if (!arguments.length) return _entity;
74645           _entity = val;
74646           _oldType = {};
74647           return radio;
74648       };
74649
74650
74651       return utilRebind(radio, dispatch$$1, 'on');
74652   }
74653
74654   function uiFieldRestrictions(field, context) {
74655       var dispatch$$1 = dispatch('change');
74656       var breathe = behaviorBreathe(context);
74657       var storedViaWay = context.storage('turn-restriction-via-way');
74658       var storedDistance = context.storage('turn-restriction-distance');
74659
74660       var _maxViaWay = storedViaWay !== null ? (+storedViaWay) : 1;
74661       var _maxDistance = storedDistance ? (+storedDistance) : 30;
74662       var _initialized = false;
74663       var _parent = select(null);       // the entire field
74664       var _container = select(null);    // just the map
74665       var _oldTurns;
74666       var _graph;
74667       var _vertexID;
74668       var _intersection;
74669       var _fromWayID;
74670
74671       var _lastXPos;
74672
74673
74674       function restrictions(selection$$1) {
74675           _parent = selection$$1;
74676
74677           // try to reuse the intersection, but always rebuild it if the graph has changed
74678           if (_vertexID && (context.graph() !== _graph || !_intersection)) {
74679               _graph = context.graph();
74680               _intersection = osmIntersection(_graph, _vertexID, _maxDistance);
74681           }
74682
74683           // It's possible for there to be no actual intersection here.
74684           // for example, a vertex of two `highway=path`
74685           // In this case, hide the field.
74686           var isOK = (
74687               _intersection &&
74688               _intersection.vertices.length &&           // has vertices
74689               _intersection.vertices                     // has the vertex that the user selected
74690                   .filter(function(vertex) { return vertex.id === _vertexID; }).length &&
74691               _intersection.ways.length > 2 &&           // has more than 2 ways
74692               _intersection.ways                         // has more than 1 TO way
74693                   .filter(function(way) { return way.__to; }).length > 1
74694           );
74695
74696           // Also hide in the case where
74697           select(selection$$1.node().parentNode).classed('hide', !isOK);
74698
74699           // if form field is hidden or has detached from dom, clean up.
74700           if (!isOK ||
74701               !select('.inspector-wrap.inspector-hidden').empty() ||
74702               !selection$$1.node().parentNode ||
74703               !selection$$1.node().parentNode.parentNode) {
74704               selection$$1.call(restrictions.off);
74705               return;
74706           }
74707
74708
74709           var wrap = selection$$1.selectAll('.form-field-input-wrap')
74710               .data([0]);
74711
74712           wrap = wrap.enter()
74713               .append('div')
74714               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
74715               .merge(wrap);
74716
74717           var container = wrap.selectAll('.restriction-container')
74718               .data([0]);
74719
74720           // enter
74721           var containerEnter = container.enter()
74722               .append('div')
74723               .attr('class', 'restriction-container');
74724
74725           containerEnter
74726               .append('div')
74727               .attr('class', 'restriction-help');
74728
74729           // update
74730           _container = containerEnter
74731               .merge(container)
74732               .call(renderViewer);
74733
74734           var controls = wrap.selectAll('.restriction-controls')
74735               .data([0]);
74736
74737           // enter/update
74738           controls.enter()
74739               .append('div')
74740               .attr('class', 'restriction-controls-container')
74741               .append('div')
74742               .attr('class', 'restriction-controls')
74743               .merge(controls)
74744               .call(renderControls);
74745       }
74746
74747
74748       function renderControls(selection$$1) {
74749           var distControl = selection$$1.selectAll('.restriction-distance')
74750               .data([0]);
74751
74752           distControl.exit()
74753               .remove();
74754
74755           var distControlEnter = distControl.enter()
74756               .append('div')
74757               .attr('class', 'restriction-control restriction-distance');
74758
74759           distControlEnter
74760               .append('span')
74761               .attr('class', 'restriction-control-label restriction-distance-label')
74762               .text(t('restriction.controls.distance') + ':');
74763
74764           distControlEnter
74765               .append('input')
74766               .attr('class', 'restriction-distance-input')
74767               .attr('type', 'range')
74768               .attr('min', '20')
74769               .attr('max', '50')
74770               .attr('step', '5');
74771
74772           distControlEnter
74773               .append('span')
74774               .attr('class', 'restriction-distance-text');
74775
74776           // update
74777           selection$$1.selectAll('.restriction-distance-input')
74778               .property('value', _maxDistance)
74779               .on('input', function() {
74780                   var val = select(this).property('value');
74781                   _maxDistance = +val;
74782                   _intersection = null;
74783                   _container.selectAll('.layer-osm .layer-turns *').remove();
74784                   context.storage('turn-restriction-distance', _maxDistance);
74785                   _parent.call(restrictions);
74786               });
74787
74788           selection$$1.selectAll('.restriction-distance-text')
74789               .text(displayMaxDistance(_maxDistance));
74790
74791
74792           var viaControl = selection$$1.selectAll('.restriction-via-way')
74793               .data([0]);
74794
74795           viaControl.exit()
74796               .remove();
74797
74798           var viaControlEnter = viaControl.enter()
74799               .append('div')
74800               .attr('class', 'restriction-control restriction-via-way');
74801
74802           viaControlEnter
74803               .append('span')
74804               .attr('class', 'restriction-control-label restriction-via-way-label')
74805               .text(t('restriction.controls.via') + ':');
74806
74807           viaControlEnter
74808               .append('input')
74809               .attr('class', 'restriction-via-way-input')
74810               .attr('type', 'range')
74811               .attr('min', '0')
74812               .attr('max', '2')
74813               .attr('step', '1');
74814
74815           viaControlEnter
74816               .append('span')
74817               .attr('class', 'restriction-via-way-text');
74818
74819           // update
74820           selection$$1.selectAll('.restriction-via-way-input')
74821               .property('value', _maxViaWay)
74822               .on('input', function() {
74823                   var val = select(this).property('value');
74824                   _maxViaWay = +val;
74825                   _container.selectAll('.layer-osm .layer-turns *').remove();
74826                   context.storage('turn-restriction-via-way', _maxViaWay);
74827                   _parent.call(restrictions);
74828               });
74829
74830           selection$$1.selectAll('.restriction-via-way-text')
74831               .text(displayMaxVia(_maxViaWay));
74832       }
74833
74834
74835       function renderViewer(selection$$1) {
74836           if (!_intersection) return;
74837
74838           var vgraph = _intersection.graph;
74839           var filter = utilFunctor(true);
74840           var projection = geoRawMercator();
74841
74842           // Reflow warning: `utilGetDimensions` calls `getBoundingClientRect`
74843           // Instead of asking the restriction-container for its dimensions,
74844           //  we can ask the #sidebar, which can have its dimensions cached.
74845           // width: calc as sidebar - padding
74846           // height: hardcoded (from `80_app.css`)
74847           // var d = utilGetDimensions(selection);
74848           var sdims = utilGetDimensions(select('#sidebar'));
74849           var d = [ sdims[0] - 50, 370 ];
74850           var c = geoVecScale(d, 0.5);
74851           var z = 22;
74852
74853           projection.scale(geoZoomToScale(z));
74854
74855           // Calculate extent of all key vertices
74856           var extent = geoExtent$$1();
74857           for (var i = 0; i < _intersection.vertices.length; i++) {
74858               extent._extend(_intersection.vertices[i].extent());
74859           }
74860
74861           // If this is a large intersection, adjust zoom to fit extent
74862           if (_intersection.vertices.length > 1) {
74863               var padding = 180;   // in z22 pixels
74864               var tl = projection([extent[0][0], extent[1][1]]);
74865               var br = projection([extent[1][0], extent[0][1]]);
74866               var hFactor = (br[0] - tl[0]) / (d[0] - padding);
74867               var vFactor = (br[1] - tl[1]) / (d[1] - padding);
74868               var hZoomDiff = Math.log(Math.abs(hFactor)) / Math.LN2;
74869               var vZoomDiff = Math.log(Math.abs(vFactor)) / Math.LN2;
74870               z = z - Math.max(hZoomDiff, vZoomDiff);
74871               projection.scale(geoZoomToScale(z));
74872           }
74873
74874           var padTop = 35;   // reserve top space for hint text
74875           var extentCenter = projection(extent.center());
74876           extentCenter[1] = extentCenter[1] - padTop;
74877
74878           projection
74879               .translate(geoVecSubtract(c, extentCenter))
74880               .clipExtent([[0, 0], d]);
74881
74882           var drawLayers = svgLayers(projection, context).only(['osm','touch']).dimensions(d);
74883           var drawVertices = svgVertices$$1(projection, context);
74884           var drawLines = svgLines$$1(projection, context);
74885           var drawTurns = svgTurns(projection, context);
74886
74887           var firstTime = selection$$1.selectAll('.surface').empty();
74888
74889           selection$$1
74890               .call(drawLayers);
74891
74892           var surface = selection$$1.selectAll('.surface')
74893               .classed('tr', true);
74894
74895           if (firstTime) {
74896               _initialized = true;
74897
74898               surface
74899                   .call(breathe);
74900           }
74901
74902           // This can happen if we've lowered the detail while a FROM way
74903           // is selected, and that way is no longer part of the intersection.
74904           if (_fromWayID && !vgraph.hasEntity(_fromWayID)) {
74905               _fromWayID = null;
74906               _oldTurns = null;
74907           }
74908
74909           surface
74910               .call(utilSetDimensions, d)
74911               .call(drawVertices, vgraph, _intersection.vertices, filter, extent, z)
74912               .call(drawLines, vgraph, _intersection.ways, filter)
74913               .call(drawTurns, vgraph, _intersection.turns(_fromWayID, _maxViaWay));
74914
74915           surface
74916               .on('click.restrictions', click)
74917               .on('mouseover.restrictions', mouseover);
74918
74919           surface
74920               .selectAll('.selected')
74921               .classed('selected', false);
74922
74923           surface
74924               .selectAll('.related')
74925               .classed('related', false);
74926
74927           if (_fromWayID) {
74928               var way = vgraph.entity(_fromWayID);
74929               surface
74930                   .selectAll('.' + _fromWayID)
74931                   .classed('selected', true)
74932                   .classed('related', true);
74933           }
74934
74935           document.addEventListener('resizeWindow', function () {
74936               utilSetDimensions(_container, null);
74937               redraw(1);
74938           }, false);
74939
74940           updateHints(null);
74941
74942
74943           function click() {
74944               surface
74945                   .call(breathe.off)
74946                   .call(breathe);
74947
74948               var datum = event.target.__data__;
74949               var entity = datum && datum.properties && datum.properties.entity;
74950               if (entity) {
74951                   datum = entity;
74952               }
74953
74954               if (datum instanceof osmWay && (datum.__from || datum.__via)) {
74955                   _fromWayID = datum.id;
74956                   _oldTurns = null;
74957                   redraw();
74958
74959               } else if (datum instanceof osmTurn) {
74960                   var actions, extraActions, turns, i;
74961                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
74962
74963                   if (datum.restrictionID && !datum.direct) {
74964                       return;
74965
74966                   } else if (datum.restrictionID && !datum.only) {    // NO -> ONLY
74967                       var seen = {};
74968                       var datumOnly = cloneDeep(datum);
74969                       datumOnly.only = true;
74970                       restrictionType = restrictionType.replace(/^no/, 'only');
74971
74972                       // Adding an ONLY restriction should destroy all other direct restrictions from the FROM towards the VIA.
74973                       // We will remember them in _oldTurns, and restore them if the user clicks again.
74974                       turns = _intersection.turns(_fromWayID, 2);
74975                       extraActions = [];
74976                       _oldTurns = [];
74977                       for (i = 0; i < turns.length; i++) {
74978                           var turn = turns[i];
74979                           if (seen[turn.restrictionID]) continue;  // avoid deleting the turn twice (#4968, #4928)
74980
74981                           if (turn.direct && turn.path[1] === datum.path[1]) {
74982                               seen[turns[i].restrictionID] = true;
74983                               turn.restrictionType = osmInferRestriction(vgraph, turn, projection);
74984                               _oldTurns.push(turn);
74985                               extraActions.push(actionUnrestrictTurn(turn));
74986                           }
74987                       }
74988
74989                       actions = _intersection.actions.concat(extraActions, [
74990                           actionRestrictTurn(datumOnly, restrictionType),
74991                           t('operations.restriction.annotation.create')
74992                       ]);
74993
74994                   } else if (datum.restrictionID) {   // ONLY -> Allowed
74995                       // Restore whatever restrictions we might have destroyed by cycling thru the ONLY state.
74996                       // This relies on the assumption that the intersection was already split up when we
74997                       // performed the previous action (NO -> ONLY), so the IDs in _oldTurns shouldn't have changed.
74998                       turns = _oldTurns || [];
74999                       extraActions = [];
75000                       for (i = 0; i < turns.length; i++) {
75001                           if (turns[i].key !== datum.key) {
75002                               extraActions.push(actionRestrictTurn(turns[i], turns[i].restrictionType));
75003                           }
75004                       }
75005                       _oldTurns = null;
75006
75007                       actions = _intersection.actions.concat(extraActions, [
75008                           actionUnrestrictTurn(datum),
75009                           t('operations.restriction.annotation.delete')
75010                       ]);
75011
75012                   } else {    // Allowed -> NO
75013                       actions = _intersection.actions.concat([
75014                           actionRestrictTurn(datum, restrictionType),
75015                           t('operations.restriction.annotation.create')
75016                       ]);
75017                   }
75018
75019                   context.perform.apply(context, actions);
75020
75021                   // At this point the datum will be changed, but will have same key..
75022                   // Refresh it and update the help..
75023                   var s = surface.selectAll('.' + datum.key);
75024                   datum = s.empty() ? null : s.datum();
75025                   updateHints(datum);
75026
75027               } else {
75028                   _fromWayID = null;
75029                   _oldTurns = null;
75030                   redraw();
75031               }
75032           }
75033
75034
75035           function mouseover() {
75036               var datum = event.target.__data__;
75037               updateHints(datum);
75038           }
75039
75040           _lastXPos = _lastXPos || sdims[0];
75041
75042           function redraw(minChange) {
75043               var xPos = -1;
75044
75045               if (minChange) {
75046                   xPos = utilGetDimensions(select('#sidebar'))[0];
75047               }
75048
75049               if (!minChange || (minChange && Math.abs(xPos - _lastXPos) >= minChange)) {
75050                   if (context.hasEntity(_vertexID)) {
75051                       _lastXPos = xPos;
75052                       _container.call(renderViewer);
75053                   }
75054               }
75055           }
75056
75057
75058           function highlightPathsFrom(wayID) {
75059               surface.selectAll('.related')
75060                   .classed('related', false)
75061                   .classed('allow', false)
75062                   .classed('restrict', false)
75063                   .classed('only', false);
75064
75065               surface.selectAll('.' + wayID)
75066                   .classed('related', true);
75067
75068               if (wayID) {
75069                   var turns = _intersection.turns(wayID, _maxViaWay);
75070                   for (var i = 0; i < turns.length; i++) {
75071                       var turn = turns[i];
75072                       var ids = [turn.to.way];
75073                       var klass = (turn.no ? 'restrict' : (turn.only ? 'only' : 'allow'));
75074
75075                       if (turn.only || turns.length === 1) {
75076                           if (turn.via.ways) {
75077                               ids = ids.concat(turn.via.ways);
75078                           }
75079                       } else if (turn.to.way === wayID) {
75080                           continue;
75081                       }
75082
75083                       surface.selectAll(utilEntitySelector(ids))
75084                           .classed('related', true)
75085                           .classed('allow', (klass === 'allow'))
75086                           .classed('restrict', (klass === 'restrict'))
75087                           .classed('only', (klass === 'only'));
75088                   }
75089               }
75090           }
75091
75092
75093           function updateHints(datum) {
75094               var help = _container.selectAll('.restriction-help').html('');
75095
75096               var placeholders = {};
75097               ['from', 'via', 'to'].forEach(function(k) {
75098                   placeholders[k] = '<span class="qualifier">' + t('restriction.help.' + k) + '</span>';
75099               });
75100
75101               var entity = datum && datum.properties && datum.properties.entity;
75102               if (entity) {
75103                   datum = entity;
75104               }
75105
75106               if (_fromWayID) {
75107                   way = vgraph.entity(_fromWayID);
75108                   surface
75109                       .selectAll('.' + _fromWayID)
75110                       .classed('selected', true)
75111                       .classed('related', true);
75112               }
75113
75114               // Hovering a way
75115               if (datum instanceof osmWay && datum.__from) {
75116                   way = datum;
75117
75118                   highlightPathsFrom(_fromWayID ? null : way.id);
75119                   surface.selectAll('.' + way.id)
75120                       .classed('related', true);
75121
75122                   var clickSelect = (!_fromWayID || _fromWayID !== way.id);
75123                   help
75124                       .append('div')      // "Click to select FROM {fromName}." / "FROM {fromName}"
75125                       .html(t('restriction.help.' + (clickSelect ? 'select_from_name' : 'from_name'), {
75126                           from: placeholders.from,
75127                           fromName: displayName(way.id, vgraph)
75128                       }));
75129
75130
75131               // Hovering a turn arrow
75132               } else if (datum instanceof osmTurn) {
75133                   var restrictionType = osmInferRestriction(vgraph, datum, projection);
75134                   var turnType = restrictionType.replace(/^(only|no)\_/, '');
75135                   var indirect = (datum.direct === false ? t('restriction.help.indirect') : '');
75136                   var klass, turnText, nextText;
75137
75138                   if (datum.no) {
75139                       klass = 'restrict';
75140                       turnText = t('restriction.help.turn.no_' + turnType, { indirect: indirect });
75141                       nextText = t('restriction.help.turn.only_' + turnType, { indirect: '' });
75142                   } else if (datum.only) {
75143                       klass = 'only';
75144                       turnText = t('restriction.help.turn.only_' + turnType, { indirect: indirect });
75145                       nextText = t('restriction.help.turn.allowed_' + turnType, { indirect: '' });
75146                   } else {
75147                       klass = 'allow';
75148                       turnText = t('restriction.help.turn.allowed_' + turnType, { indirect: indirect });
75149                       nextText = t('restriction.help.turn.no_' + turnType, { indirect: '' });
75150                   }
75151
75152                   help
75153                       .append('div')      // "NO Right Turn (indirect)"
75154                       .attr('class', 'qualifier ' + klass)
75155                       .text(turnText);
75156
75157                   help
75158                       .append('div')      // "FROM {fromName} TO {toName}"
75159                       .html(t('restriction.help.from_name_to_name', {
75160                           from: placeholders.from,
75161                           fromName: displayName(datum.from.way, vgraph),
75162                           to: placeholders.to,
75163                           toName: displayName(datum.to.way, vgraph)
75164                       }));
75165
75166                   if (datum.via.ways && datum.via.ways.length) {
75167                       var names = [];
75168                       for (var i = 0; i < datum.via.ways.length; i++) {
75169                           var prev = names[names.length - 1];
75170                           var curr = displayName(datum.via.ways[i], vgraph);
75171                           if (!prev || curr !== prev)   // collapse identical names
75172                               names.push(curr);
75173                       }
75174
75175                       help
75176                           .append('div')      // "VIA {viaNames}"
75177                           .html(t('restriction.help.via_names', {
75178                               via: placeholders.via,
75179                               viaNames: names.join(', ')
75180                           }));
75181                   }
75182
75183                   if (!indirect) {
75184                       help
75185                           .append('div')      // Click for "No Right Turn"
75186                           .text(t('restriction.help.toggle', { turn: nextText.trim() }));
75187                   }
75188
75189                   highlightPathsFrom(null);
75190                   var alongIDs = datum.path.slice();
75191                   surface.selectAll(utilEntitySelector(alongIDs))
75192                       .classed('related', true)
75193                       .classed('allow', (klass === 'allow'))
75194                       .classed('restrict', (klass === 'restrict'))
75195                       .classed('only', (klass === 'only'));
75196
75197
75198               // Hovering empty surface
75199               } else {
75200                   highlightPathsFrom(null);
75201                   if (_fromWayID) {
75202                       help
75203                           .append('div')      // "FROM {fromName}"
75204                           .html(t('restriction.help.from_name', {
75205                               from: placeholders.from,
75206                               fromName: displayName(_fromWayID, vgraph)
75207                           }));
75208
75209                   } else {
75210                       help
75211                           .append('div')      // "Click to select a FROM segment."
75212                           .html(t('restriction.help.select_from', {
75213                               from: placeholders.from
75214                           }));
75215                   }
75216               }
75217           }
75218       }
75219
75220
75221       function displayMaxDistance(maxDist) {
75222           var isImperial = (utilDetect().locale.toLowerCase() === 'en-us');
75223           var opts;
75224
75225           if (isImperial) {
75226               var distToFeet = {   // imprecise conversion for prettier display
75227                   20: 70, 25: 85, 30: 100, 35: 115, 40: 130, 45: 145, 50: 160
75228               }[maxDist];
75229               opts = { distance: t('units.feet', { quantity: distToFeet }) };
75230           } else {
75231               opts = { distance: t('units.meters', { quantity: maxDist }) };
75232           }
75233
75234           return t('restriction.controls.distance_up_to', opts);
75235       }
75236
75237
75238       function displayMaxVia(maxVia) {
75239           return maxVia === 0 ? t('restriction.controls.via_node_only')
75240               : maxVia === 1 ? t('restriction.controls.via_up_to_one')
75241               : t('restriction.controls.via_up_to_two');
75242       }
75243
75244
75245       function displayName(entityID, graph) {
75246           var entity = graph.entity(entityID);
75247           var name = utilDisplayName(entity) || '';
75248           var matched = context.presets().match(entity, graph);
75249           var type = (matched && matched.name()) || utilDisplayType(entity.id);
75250           return name || type;
75251       }
75252
75253
75254       restrictions.entity = function(_) {
75255           _intersection = null;
75256           _fromWayID = null;
75257           _oldTurns = null;
75258           _vertexID = _.id;
75259       };
75260
75261
75262       restrictions.tags = function() {};
75263       restrictions.focus = function() {};
75264
75265
75266       restrictions.off = function(selection$$1) {
75267           if (!_initialized) return;
75268
75269           selection$$1.selectAll('.surface')
75270               .call(breathe.off)
75271               .on('click.restrictions', null)
75272               .on('mouseover.restrictions', null);
75273
75274           select(window)
75275               .on('resize.restrictions', null);
75276       };
75277
75278
75279       return utilRebind(restrictions, dispatch$$1, 'on');
75280   }
75281
75282   function uiFieldTextarea(field) {
75283       var dispatch$$1 = dispatch('change');
75284       var input = select(null);
75285
75286
75287       function textarea(selection$$1) {
75288           var wrap = selection$$1.selectAll('.form-field-input-wrap')
75289               .data([0]);
75290
75291           wrap = wrap.enter()
75292               .append('div')
75293               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
75294               .merge(wrap);
75295
75296           input = wrap.selectAll('textarea')
75297               .data([0]);
75298
75299           input = input.enter()
75300               .append('textarea')
75301               .attr('id', 'preset-input-' + field.safeid)
75302               .attr('placeholder', field.placeholder() || t('inspector.unknown'))
75303               .attr('maxlength', 255)
75304               .call(utilNoAuto)
75305               .on('input', change(true))
75306               .on('blur', change())
75307               .on('change', change())
75308               .merge(input);
75309       }
75310
75311
75312       function change(onInput) {
75313           return function() {
75314               var t$$1 = {};
75315               t$$1[field.key] = utilGetSetValue(input) || undefined;
75316               dispatch$$1.call('change', this, t$$1, onInput);
75317           };
75318       }
75319
75320
75321       textarea.tags = function(tags) {
75322           utilGetSetValue(input, tags[field.key] || '');
75323       };
75324
75325
75326       textarea.focus = function() {
75327           input.node().focus();
75328       };
75329
75330
75331       return utilRebind(textarea, dispatch$$1, 'on');
75332   }
75333
75334   function uiFieldWikidata(field) {
75335       var wikidata = services.wikidata;
75336       var dispatch$$1 = dispatch('change');
75337       var link = select(null);
75338       var title = select(null);
75339       var _wikiURL = '';
75340
75341
75342       function wiki(selection$$1) {
75343
75344           var wrap = selection$$1.selectAll('.form-field-input-wrap')
75345               .data([0]);
75346
75347           wrap = wrap.enter()
75348               .append('div')
75349               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
75350               .merge(wrap);
75351
75352
75353           var list = wrap.selectAll('ul')
75354               .data([0]);
75355
75356           list = list.enter()
75357               .append('ul')
75358               .attr('class', 'labeled-inputs')
75359               .merge(list);
75360
75361           var wikidataProperties = ['identifier', 'label', 'description'];
75362
75363           var items = list.selectAll('li')
75364               .data(wikidataProperties);
75365
75366           // Enter
75367           var enter = items.enter()
75368               .append('li')
75369               .attr('class', function(d) { return 'preset-wikidata-' + d; });
75370
75371           enter
75372               .append('span')
75373               .attr('class', 'label')
75374               .attr('for', function(d) { return 'preset-input-wikidata-' + d; })
75375               .text(function(d) { return t('wikidata.' + d); });
75376
75377           var inputWrap = enter
75378               .append('div')
75379               .attr('class', 'input-wrap');
75380
75381           inputWrap
75382               .append('input')
75383               .attr('type', 'text')
75384               .attr('class', 'preset-input-wikidata')
75385               .attr('id', function(d) { return 'preset-input-wikidata-' + d; });
75386
75387
75388           title = wrap.select('.preset-wikidata-identifier input')
75389               .call(utilNoAuto)
75390               .merge(title);
75391
75392           title
75393               .on('blur', blur)
75394               .on('change', change);
75395
75396           var idItem = wrap.select('.preset-wikidata-identifier');
75397
75398           idItem.select('button')
75399               .remove();
75400
75401           link = idItem
75402               .append('button')
75403               .attr('class', 'form-field-button wiki-link')
75404               .attr('title', t('icons.open_wikidata'))
75405               .attr('tabindex', -1)
75406               .call(svgIcon('#iD-icon-out-link'))
75407               .merge(link);
75408
75409           link
75410               .on('click', function() {
75411                   event.preventDefault();
75412                   if (_wikiURL) window.open(_wikiURL, '_blank');
75413               });
75414
75415           var readOnlyItems = wrap.selectAll('li:not(.preset-wikidata-identifier)');
75416
75417           readOnlyItems.select('input')
75418               .classed('disabled', 'true')
75419               .attr('readonly', 'true');
75420
75421           readOnlyItems.select('button')
75422               .remove();
75423
75424           readOnlyItems.append('button')
75425               .attr('class', 'form-field-button wiki-link')
75426               .attr('title', t('icons.copy'))
75427               .attr('tabindex', -1)
75428               .call(svgIcon('#iD-operation-copy'))
75429               .on('click', function() {
75430                   event.preventDefault();
75431                   select(this.parentNode)
75432                       .select('input')
75433                       .node()
75434                       .select();
75435                   document.execCommand('copy');
75436               });
75437       }
75438
75439
75440       function blur() {
75441           change();
75442       }
75443
75444
75445       function change() {
75446           var syncTags = {
75447               wikidata: utilGetSetValue(title)
75448           };
75449           dispatch$$1.call('change', this, syncTags);
75450       }
75451
75452
75453       wiki.tags = function(tags) {
75454           var value = tags[field.key] || '';
75455           var matches = value.match(/^Q[0-9]*$/);
75456
75457           utilGetSetValue(title, value);
75458
75459           // value in correct format
75460           if (matches) {
75461               _wikiURL = 'https://wikidata.org/wiki/' + value;
75462               wikidata.entityByQID(value, function(qid, entity) {
75463                   var label = '';
75464                   var description = '';
75465
75466                   if (entity.labels && Object.keys(entity.labels).length > 0) {
75467                       label = entity.labels[Object.keys(entity.labels)[0]].value;
75468                   }
75469                   if (entity.descriptions && Object.keys(entity.descriptions).length > 0) {
75470                       description = entity.descriptions[Object.keys(entity.descriptions)[0]].value;
75471                   }
75472
75473                   select('.preset-wikidata-label')
75474                       .style('display', function(){
75475                           return label.length > 0 ? 'flex' : 'none';
75476                       })
75477                       .select('input')
75478                       .attr('value', label);
75479
75480                   select('.preset-wikidata-description')
75481                       .style('display', function(){
75482                           return description.length > 0 ? 'flex' : 'none';
75483                       })
75484                       .select('input')
75485                       .attr('value', description);
75486               });
75487
75488           // unrecognized value format
75489           } else {
75490               select('.preset-wikidata-label').style('display', 'none');
75491               select('.preset-wikidata-description').style('display', 'none');
75492               if (value && value !== '') {
75493                   _wikiURL = 'https://wikidata.org/wiki/Special:Search?search=' + value;
75494               } else {
75495                   _wikiURL = '';
75496               }
75497           }
75498       };
75499
75500
75501       wiki.focus = function() {
75502           title.node().focus();
75503       };
75504
75505
75506       return utilRebind(wiki, dispatch$$1, 'on');
75507   }
75508
75509   function uiFieldWikipedia(field, context) {
75510       var dispatch$$1 = dispatch('change');
75511       var wikipedia = services.wikipedia;
75512       var wikidata = services.wikidata;
75513       var lang = select(null);
75514       var title = select(null);
75515       var _wikiURL = '';
75516       var _entity;
75517
75518
75519       function wiki(selection$$1) {
75520           var langcombo = d3combobox()
75521               .container(context.container())
75522               .fetcher(function(value, cb) {
75523                   var v = value.toLowerCase();
75524
75525                   cb(wikipedia$2.filter(function(d) {
75526                       return d[0].toLowerCase().indexOf(v) >= 0 ||
75527                           d[1].toLowerCase().indexOf(v) >= 0 ||
75528                           d[2].toLowerCase().indexOf(v) >= 0;
75529                   }).map(function(d) {
75530                       return { value: d[1] };
75531                   }));
75532               });
75533
75534           var titlecombo = d3combobox()
75535               .container(context.container())
75536               .fetcher(function(value, cb) {
75537                   if (!value) {
75538                       value = context.entity(_entity.id).tags.name || '';
75539                   }
75540
75541                   var searchfn = value.length > 7 ? wikipedia.search : wikipedia.suggestions;
75542                   searchfn(language()[2], value, function(query, data$$1) {
75543                       cb(data$$1.map(function(d) {
75544                           return { value: d };
75545                       }));
75546                   });
75547               });
75548
75549
75550           var wrap = selection$$1.selectAll('.form-field-input-wrap')
75551               .data([0]);
75552
75553           wrap = wrap.enter()
75554               .append('div')
75555               .attr('class', 'form-field-input-wrap form-field-input-' + field.type)
75556               .merge(wrap);
75557
75558
75559           var langRow = wrap.selectAll('.wiki-lang-container')
75560               .data([0]);
75561
75562           langRow = langRow.enter()
75563               .append('div')
75564               .attr('class', 'wiki-lang-container')
75565               .merge(langRow);
75566
75567
75568           lang = langRow.selectAll('input.wiki-lang')
75569               .data([0]);
75570
75571           lang = lang.enter()
75572               .append('input')
75573               .attr('type', 'text')
75574               .attr('class', 'wiki-lang')
75575               .attr('placeholder', t('translate.localized_translation_language'))
75576               .call(utilNoAuto)
75577               .merge(lang);
75578
75579           utilGetSetValue(lang, language()[1]);
75580
75581           lang
75582               .call(langcombo)
75583               .on('blur', changeLang)
75584               .on('change', changeLang);
75585
75586
75587           var titleRow = wrap.selectAll('.wiki-title-container')
75588               .data([0]);
75589
75590           titleRow = titleRow.enter()
75591               .append('div')
75592               .attr('class', 'wiki-title-container')
75593               .merge(titleRow);
75594
75595           title = titleRow.selectAll('input.wiki-title')
75596               .data([0]);
75597
75598           title = title.enter()
75599               .append('input')
75600               .attr('type', 'text')
75601               .attr('class', 'wiki-title')
75602               .attr('id', 'preset-input-' + field.safeid)
75603               .call(utilNoAuto)
75604               .merge(title);
75605
75606           title
75607               .call(titlecombo)
75608               .on('blur', blur)
75609               .on('change', change);
75610
75611
75612           var link = titleRow.selectAll('.wiki-link')
75613               .data([0]);
75614
75615           link = link.enter()
75616               .append('button')
75617               .attr('class', 'form-field-button wiki-link')
75618               .attr('tabindex', -1)
75619               .call(svgIcon('#iD-icon-out-link'))
75620               .merge(link);
75621
75622           link
75623               .on('click', function() {
75624                   event.preventDefault();
75625                   if (_wikiURL) window.open(_wikiURL, '_blank');
75626               });
75627       }
75628
75629
75630       function language() {
75631           var value = utilGetSetValue(lang).toLowerCase();
75632           var locale = utilDetect().locale.toLowerCase();
75633           var localeLanguage;
75634           return find$1(wikipedia$2, function(d) {
75635               if (d[2] === locale) localeLanguage = d;
75636               return d[0].toLowerCase() === value ||
75637                   d[1].toLowerCase() === value ||
75638                   d[2] === value;
75639           }) || localeLanguage || ['English', 'English', 'en'];
75640       }
75641
75642
75643       function changeLang() {
75644           utilGetSetValue(lang, language()[1]);
75645           change(true);
75646       }
75647
75648
75649       function blur() {
75650           change(true);
75651       }
75652
75653
75654       function change(skipWikidata) {
75655           var value = utilGetSetValue(title);
75656           var m = value.match(/https?:\/\/([-a-z]+)\.wikipedia\.org\/(?:wiki|\1-[-a-z]+)\/([^#]+)(?:#(.+))?/);
75657           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
75658           var syncTags = {};
75659
75660           if (l) {
75661               // Normalize title http://www.mediawiki.org/wiki/API:Query#Title_normalization
75662               value = decodeURIComponent(m[2]).replace(/_/g, ' ');
75663               if (m[3]) {
75664                   var anchor;
75665                   try {
75666                       // Best-effort `anchordecode:` implementation
75667                       anchor = decodeURIComponent(m[3].replace(/\.([0-9A-F]{2})/g, '%$1'));
75668                   } catch (e) {
75669                       anchor = decodeURIComponent(m[3]);
75670                   }
75671                   value += '#' + anchor.replace(/_/g, ' ');
75672               }
75673               value = value.slice(0, 1).toUpperCase() + value.slice(1);
75674               utilGetSetValue(lang, l[1]);
75675               utilGetSetValue(title, value);
75676           }
75677
75678           if (value) {
75679               syncTags.wikipedia = language()[2] + ':' + value;
75680           } else {
75681               syncTags.wikipedia = undefined;
75682               syncTags.wikidata = undefined;
75683           }
75684
75685           dispatch$$1.call('change', this, syncTags);
75686
75687
75688           if (skipWikidata || !value || !language()[2]) return;
75689
75690           // attempt asynchronous update of wikidata tag..
75691           var initGraph = context.graph();
75692           var initEntityID = _entity.id;
75693
75694           wikidata.itemsByTitle(language()[2], value, function(title, data$$1) {
75695               // If graph has changed, we can't apply this update.
75696               if (context.graph() !== initGraph) return;
75697
75698               if (!data$$1 || !Object.keys(data$$1).length) return;
75699
75700               var qids = Object.keys(data$$1);
75701               var value = qids && find$1(qids, function(id) { return id.match(/^Q\d+$/); });
75702               var currTags = clone(context.entity(initEntityID).tags);
75703
75704               currTags.wikidata = value;
75705
75706               // Coalesce the update of wikidata tag into the previous tag change
75707               context.overwrite(
75708                   actionChangeTags(initEntityID, currTags),
75709                   context.history().undoAnnotation()
75710               );
75711
75712               // do not dispatch.call('change') here, because entity_editor
75713               // changeTags() is not intended to be called asynchronously
75714           });
75715       }
75716
75717
75718       wiki.tags = function(tags) {
75719           var value = tags[field.key] || '';
75720           var m = value.match(/([^:]+):([^#]+)(?:#(.+))?/);
75721           var l = m && find$1(wikipedia$2, function(d) { return m[1] === d[2]; });
75722           var anchor = m && m[3];
75723
75724           // value in correct format
75725           if (l) {
75726               utilGetSetValue(lang, l[1]);
75727               utilGetSetValue(title, m[2] + (anchor ? ('#' + anchor) : ''));
75728               if (anchor) {
75729                   try {
75730                       // Best-effort `anchorencode:` implementation
75731                       anchor = encodeURIComponent(anchor.replace(/ /g, '_')).replace(/%/g, '.');
75732                   } catch (e) {
75733                       anchor = anchor.replace(/ /g, '_');
75734                   }
75735               }
75736               _wikiURL = 'https://' + m[1] + '.wikipedia.org/wiki/' +
75737                   m[2].replace(/ /g, '_') + (anchor ? ('#' + anchor) : '');
75738
75739           // unrecognized value format
75740           } else {
75741               utilGetSetValue(title, value);
75742               if (value && value !== '') {
75743                   utilGetSetValue(lang, '');
75744                   _wikiURL = 'https://en.wikipedia.org/wiki/Special:Search?search=' + value;
75745               } else {
75746                   _wikiURL = '';
75747               }
75748           }
75749       };
75750
75751
75752       wiki.entity = function(val) {
75753           if (!arguments.length) return _entity;
75754           _entity = val;
75755           return wiki;
75756       };
75757
75758
75759       wiki.focus = function() {
75760           title.node().focus();
75761       };
75762
75763
75764       return utilRebind(wiki, dispatch$$1, 'on');
75765   }
75766
75767   var uiFields = {
75768       access: uiFieldAccess,
75769       address: uiFieldAddress,
75770       check: uiFieldCheck,
75771       combo: uiFieldCombo,
75772       cycleway: uiFieldCycleway,
75773       defaultCheck: uiFieldCheck,
75774       email: uiFieldText,
75775       lanes: uiFieldLanes,
75776       localized: uiFieldLocalized,
75777       maxspeed: uiFieldMaxspeed,
75778       multiCombo: uiFieldCombo,
75779       networkCombo: uiFieldCombo,
75780       number: uiFieldText,
75781       onewayCheck: uiFieldCheck,
75782       radio: uiFieldRadio,
75783       restrictions: uiFieldRestrictions,
75784       semiCombo: uiFieldCombo,
75785       structureRadio: uiFieldRadio,
75786       tel: uiFieldText,
75787       text: uiFieldText,
75788       textarea: uiFieldTextarea,
75789       typeCombo: uiFieldCombo,
75790       url: uiFieldText,
75791       wikidata: uiFieldWikidata,
75792       wikipedia: uiFieldWikipedia
75793   };
75794
75795   function uiTagReference(tag) {
75796       var taginfo = services.taginfo;
75797       var tagReference = {};
75798
75799       var _button = select(null);
75800       var _body = select(null);
75801       var _loaded;
75802       var _showing;
75803
75804
75805       function findLocal(data) {
75806           var locale = utilDetect().locale.toLowerCase();
75807           var localized;
75808
75809           if (locale !== 'pt-br') {  // see #3776, prefer 'pt' over 'pt-br'
75810               localized = find$1(data, function(d) {
75811                   return d.lang.toLowerCase() === locale;
75812               });
75813               if (localized) return localized;
75814           }
75815
75816           // try the non-regional version of a language, like
75817           // 'en' if the language is 'en-US'
75818           if (locale.indexOf('-') !== -1) {
75819               var first = locale.split('-')[0];
75820               localized = find$1(data, function(d) {
75821                   return d.lang.toLowerCase() === first;
75822               });
75823               if (localized) return localized;
75824           }
75825
75826           // finally fall back to english
75827           return find$1(data, function(d) {
75828               return d.lang.toLowerCase() === 'en';
75829           });
75830       }
75831
75832
75833       function load(param) {
75834           if (!taginfo) return;
75835
75836           _button
75837               .classed('tag-reference-loading', true);
75838
75839           taginfo.docs(param, function show(err, data) {
75840               var docs;
75841               if (!err && data) {
75842                   docs = findLocal(data);
75843               }
75844
75845               _body.html('');
75846
75847               if (!docs || !docs.title) {
75848                   if (param.hasOwnProperty('value')) {
75849                       load(omit(param, 'value'));   // retry with key only
75850                   } else {
75851                       _body
75852                           .append('p')
75853                           .attr('class', 'tag-reference-description')
75854                           .text(t('inspector.no_documentation_key'));
75855                       done();
75856                   }
75857                   return;
75858               }
75859
75860               if (docs.image && docs.image.thumb_url_prefix) {
75861                   _body
75862                       .append('img')
75863                       .attr('class', 'tag-reference-wiki-image')
75864                       .attr('src', docs.image.thumb_url_prefix + '100' + docs.image.thumb_url_suffix)
75865                       .on('load', function() { done(); })
75866                       .on('error', function() { select(this).remove(); done(); });
75867               } else {
75868                   done();
75869               }
75870
75871               _body
75872                   .append('p')
75873                   .attr('class', 'tag-reference-description')
75874                   .text(docs.description || t('inspector.documentation_redirect'));
75875
75876               _body
75877                   .append('a')
75878                   .attr('class', 'tag-reference-link')
75879                   .attr('target', '_blank')
75880                   .attr('tabindex', -1)
75881                   .attr('href', 'https://wiki.openstreetmap.org/wiki/' + docs.title)
75882                   .call(svgIcon('#iD-icon-out-link', 'inline'))
75883                   .append('span')
75884                   .text(t('inspector.reference'));
75885
75886               // Add link to info about "good changeset comments" - #2923
75887               if (param.key === 'comment') {
75888                   _body
75889                       .append('a')
75890                       .attr('class', 'tag-reference-comment-link')
75891                       .attr('target', '_blank')
75892                       .attr('tabindex', -1)
75893                       .call(svgIcon('#iD-icon-out-link', 'inline'))
75894                       .attr('href', t('commit.about_changeset_comments_link'))
75895                       .append('span')
75896                       .text(t('commit.about_changeset_comments'));
75897               }
75898           });
75899       }
75900
75901
75902       function done() {
75903           _loaded = true;
75904
75905           _button
75906               .classed('tag-reference-loading', false);
75907
75908           _body
75909               .classed('expanded', true)
75910               .transition()
75911               .duration(200)
75912               .style('max-height', '200px')
75913               .style('opacity', '1');
75914
75915           _showing = true;
75916       }
75917
75918
75919       function hide() {
75920           _body
75921               .transition()
75922               .duration(200)
75923               .style('max-height', '0px')
75924               .style('opacity', '0')
75925               .on('end', function () {
75926                   _body.classed('expanded', false);
75927               });
75928
75929           _showing = false;
75930       }
75931
75932
75933       tagReference.button = function(selection$$1) {
75934           _button = selection$$1.selectAll('.tag-reference-button')
75935               .data([0]);
75936
75937           _button = _button.enter()
75938               .append('button')
75939               .attr('class', 'tag-reference-button')
75940               .attr('title', t('icons.information'))
75941               .attr('tabindex', -1)
75942               .call(svgIcon('#iD-icon-inspect'))
75943               .merge(_button);
75944
75945           _button
75946               .on('click', function () {
75947                   event.stopPropagation();
75948                   event.preventDefault();
75949                   if (_showing) {
75950                       hide();
75951                   } else if (_loaded) {
75952                       done();
75953                   } else {
75954                       load(tag);
75955                   }
75956               });
75957       };
75958
75959
75960       tagReference.body = function(selection$$1) {
75961           var tagid = tag.rtype || (tag.key + '-' + tag.value);
75962           _body = selection$$1.selectAll('.tag-reference-body')
75963               .data([tagid], function(d) { return d; });
75964
75965           _body.exit()
75966               .remove();
75967
75968           _body = _body.enter()
75969               .append('div')
75970               .attr('class', 'tag-reference-body')
75971               .style('max-height', '0')
75972               .style('opacity', '0')
75973               .merge(_body);
75974
75975           if (_showing === false) {
75976               hide();
75977           }
75978       };
75979
75980
75981       tagReference.showing = function(_) {
75982           if (!arguments.length) return _showing;
75983           _showing = _;
75984           return tagReference;
75985       };
75986
75987
75988       return tagReference;
75989   }
75990
75991   function uiField(context, presetField, entity, options) {
75992       options = assignIn({
75993           show: true,
75994           wrap: true,
75995           remove: true,
75996           revert: true,
75997           info: true
75998       }, options);
75999
76000       var dispatch$$1 = dispatch('change');
76001       var field = clone(presetField);
76002       var _show = options.show;
76003       var _state = '';
76004       var _tags = {};
76005
76006
76007       // field implementation
76008       field.impl = uiFields[field.type](field, context)
76009           .on('change', function(t$$1, onInput) {
76010               dispatch$$1.call('change', field, t$$1, onInput);
76011           });
76012
76013       // if this field cares about the entity, pass it along
76014       if (entity && field.impl.entity) {
76015           field.entityID = entity.id;
76016           field.impl.entity(entity);
76017       }
76018
76019       field.keys = field.keys || [field.key];
76020
76021
76022       function isModified() {
76023           if (!entity) return false;
76024           var original = context.graph().base().entities[entity.id];
76025           return some(field.keys, function(key) {
76026               return original ? _tags[key] !== original.tags[key] : _tags[key];
76027           });
76028       }
76029
76030
76031       function isPresent() {
76032           return some(field.keys, function(key) {
76033               return _tags[key];
76034           });
76035       }
76036
76037
76038       function revert(d) {
76039           event.stopPropagation();
76040           event.preventDefault();
76041           if (!entity) return false;
76042
76043           var original = context.graph().base().entities[entity.id];
76044           var t$$1 = {};
76045           d.keys.forEach(function(key) {
76046               t$$1[key] = original ? original.tags[key] : undefined;
76047           });
76048
76049           dispatch$$1.call('change', d, t$$1);
76050       }
76051
76052
76053       function remove(d) {
76054           event.stopPropagation();
76055           event.preventDefault();
76056
76057           var t$$1 = {};
76058           d.keys.forEach(function(key) {
76059               t$$1[key] = undefined;
76060           });
76061
76062           dispatch$$1.call('change', d, t$$1);
76063       }
76064
76065
76066       field.render = function(selection$$1) {
76067           var container = selection$$1.selectAll('.form-field')
76068               .data([field]);
76069
76070           // Enter
76071           var enter = container.enter()
76072               .append('div')
76073               .attr('class', function(d) { return 'form-field form-field-' + d.safeid; })
76074               .classed('nowrap', !options.wrap);
76075
76076           if (options.wrap) {
76077               var label = enter
76078                   .append('label')
76079                   .attr('class', 'form-field-label')
76080                   .attr('for', function(d) { return 'preset-input-' + d.safeid; });
76081
76082               label
76083                   .append('span')
76084                   .attr('class', 'label-text')
76085                   .text(function(d) { return d.label(); });
76086
76087               if (options.remove) {
76088                   label
76089                       .append('button')
76090                       .attr('class', 'remove-icon')
76091                       .attr('title', t('icons.remove'))
76092                       .attr('tabindex', -1)
76093                       .call(svgIcon('#iD-operation-delete'));
76094               }
76095
76096               if (options.revert) {
76097                   label
76098                       .append('button')
76099                       .attr('class', 'modified-icon')
76100                       .attr('title', t('icons.undo'))
76101                       .attr('tabindex', -1)
76102                       .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-redo' : '#iD-icon-undo'));
76103               }
76104           }
76105
76106
76107           // Update
76108           container = container
76109               .merge(enter);
76110
76111           container.selectAll('.form-field-label > .remove-icon')
76112               .on('click', remove);
76113
76114           container.selectAll('.form-field-label > .modified-icon')
76115               .on('click', revert);
76116
76117           container
76118               .classed('modified', isModified())
76119               .classed('present', isPresent())
76120               .each(function(d) {
76121                   var reference, help;
76122
76123                   // instantiate field help
76124                   if (options.wrap && field.type === 'restrictions') {
76125                       help = uiFieldHelp(context, 'restrictions');
76126                   }
76127
76128                   // instantiate tag reference
76129                   if (options.wrap && options.info) {
76130                       var referenceKey = d.key;
76131                       if (d.type === 'multiCombo') {   // lookup key without the trailing ':'
76132                           referenceKey = referenceKey.replace(/:$/, '');
76133                       }
76134
76135                       reference = uiTagReference(d.reference || { key: referenceKey }, context);
76136                       if (_state === 'hover') {
76137                           reference.showing(false);
76138                       }
76139                   }
76140
76141                   select(this)
76142                       .call(d.impl);
76143
76144                   // add field help components
76145                   if (help) {
76146                       select(this)
76147                           .call(help.body)
76148                           .select('.form-field-label')
76149                           .call(help.button);
76150                   }
76151
76152                   // add tag reference components
76153                   if (reference) {
76154                       select(this)
76155                           .call(reference.body)
76156                           .select('.form-field-label')
76157                           .call(reference.button);
76158                   }
76159
76160                   d.impl.tags(_tags);
76161               });
76162       };
76163
76164
76165       field.state = function(_) {
76166           if (!arguments.length) return _state;
76167           _state = _;
76168           return field;
76169       };
76170
76171
76172       field.tags = function(_) {
76173           if (!arguments.length) return _tags;
76174           _tags = _;
76175           return field;
76176       };
76177
76178
76179       field.show = function() {
76180           _show = true;
76181           if (field.default && field.key && _tags[field.key] !== field.default) {
76182               var t$$1 = {};
76183               t$$1[field.key] = field.default;
76184               dispatch$$1.call('change', this, t$$1);
76185           }
76186       };
76187
76188
76189       field.isShown = function() {
76190           return _show || some(field.keys, function(key) { return !!_tags[key]; });
76191       };
76192
76193
76194       field.focus = function() {
76195           field.impl.focus();
76196       };
76197
76198
76199       return utilRebind(field, dispatch$$1, 'on');
76200   }
76201
76202   function uiFormFields(context) {
76203       var _fieldsArr;
76204
76205
76206       function formFields(selection$$1, klass) {
76207           render(selection$$1, klass);
76208       }
76209
76210
76211       function render(selection$$1, klass) {
76212           var shown = _fieldsArr.filter(function(field) { return field.isShown(); });
76213           var notShown = _fieldsArr.filter(function(field) { return !field.isShown(); });
76214
76215           var container = selection$$1.selectAll('.form-fields-container')
76216               .data([0]);
76217
76218           container = container.enter()
76219               .append('div')
76220               .attr('class', 'form-fields-container ' + (klass || ''))
76221               .merge(container);
76222
76223
76224           var fields = container.selectAll('.wrap-form-field')
76225               .data(shown, function(d) { return d.id + (d.entityID || ''); });
76226
76227           fields.exit()
76228               .remove();
76229
76230           // Enter
76231           var enter = fields.enter()
76232               .append('div')
76233               .attr('class', function(d) { return 'wrap-form-field wrap-form-field-' + d.safeid; });
76234
76235           // Update
76236           fields = fields
76237               .merge(enter);
76238
76239           fields
76240               .order()
76241               .each(function(d) {
76242                   select(this)
76243                       .call(d.render);
76244               });
76245
76246
76247           notShown = notShown.map(function(field) {
76248               return {
76249                   title: field.label(),
76250                   value: field.label(),
76251                   field: field
76252               };
76253           });
76254
76255
76256           var more = selection$$1.selectAll('.more-fields')
76257               .data((notShown.length > 0) ? [0] : []);
76258
76259           more.exit()
76260               .remove();
76261
76262           more = more.enter()
76263               .append('div')
76264               .attr('class', 'more-fields')
76265               .append('label')
76266               .text(t('inspector.add_fields'))
76267               .merge(more);
76268
76269
76270           var input = more.selectAll('.value')
76271               .data([0]);
76272
76273           input.exit()
76274               .remove();
76275
76276           input = input.enter()
76277               .append('input')
76278               .attr('class', 'value')
76279               .attr('type', 'text')
76280               .call(utilNoAuto)
76281               .merge(input);
76282
76283           input
76284               .call(utilGetSetValue, '')
76285               .attr('placeholder', function() {
76286                   var placeholder = [];
76287                   for (var field in notShown) {
76288                       placeholder.push(notShown[field].title);
76289                   }
76290                   return placeholder.slice(0,3).join(', ') + ((placeholder.length > 3) ? '…' : '');
76291               })
76292               .call(d3combobox()
76293                   .container(context.container())
76294                   .data(notShown)
76295                   .minItems(1)
76296                   .on('accept', function (d) {
76297                       var field = d.field;
76298                       field.show();
76299                       render(selection$$1);
76300                       if (field.type !== 'semiCombo' && field.type !== 'multiCombo') {
76301                           field.focus();
76302                       }
76303                   })
76304               );
76305       }
76306
76307
76308       formFields.fieldsArr = function(val) {
76309           if (!arguments.length) return _fieldsArr;
76310           _fieldsArr = val;
76311           return formFields;
76312       };
76313
76314
76315       return formFields;
76316   }
76317
76318   function uiChangesetEditor(context) {
76319       var dispatch$$1 = dispatch('change');
76320       var formFields = uiFormFields(context);
76321       var _fieldsArr;
76322       var _tags;
76323       var _changesetID;
76324
76325
76326       function changesetEditor(selection) {
76327           render(selection);
76328       }
76329
76330
76331       function render(selection) {
76332           var initial = false;
76333
76334           if (!_fieldsArr) {
76335               initial = true;
76336               var presets = context.presets();
76337
76338               _fieldsArr = [
76339                   uiField(context, presets.field('comment'), null, { show: true, revert: false }),
76340                   uiField(context, presets.field('source'), null, { show: false, revert: false }),
76341                   uiField(context, presets.field('hashtags'), null, { show: false, revert: false }),
76342               ];
76343
76344               _fieldsArr.forEach(function(field) {
76345                   field
76346                       .on('change', function(t$$1, onInput) {
76347                           dispatch$$1.call('change', field, t$$1, onInput);
76348                       });
76349               });
76350           }
76351
76352           _fieldsArr.forEach(function(field) {
76353               field
76354                   .tags(_tags);
76355           });
76356
76357
76358           selection
76359               .call(formFields.fieldsArr(_fieldsArr));
76360
76361
76362           if (initial) {
76363               var commentField = selection.select('#preset-input-comment');
76364               var commentNode = commentField.node();
76365
76366               if (commentNode) {
76367                   commentNode.focus();
76368                   commentNode.select();
76369               }
76370
76371               // trigger a 'blur' event so that comment field can be cleaned
76372               // and checked for hashtags, even if retrieved from localstorage
76373               utilTriggerEvent(commentField, 'blur');
76374
76375               var osm = context.connection();
76376               if (osm) {
76377                   osm.userChangesets(function (err, changesets) {
76378                       if (err) return;
76379
76380                       var comments = changesets.map(function(changeset) {
76381                           return {
76382                               title: changeset.tags.comment,
76383                               value: changeset.tags.comment
76384                           };
76385                       });
76386
76387                       commentField
76388                           .call(d3combobox()
76389                               .container(context.container())
76390                               .caseSensitive(true)
76391                               .data(uniqBy(comments, 'title'))
76392                           );
76393                   });
76394               }
76395           }
76396
76397           // Add warning if comment mentions Google
76398           var hasGoogle = _tags.comment.match(/google/i);
76399           var commentWarning = selection.select('.form-field-comment').selectAll('.comment-warning')
76400               .data(hasGoogle ? [0] : []);
76401
76402           commentWarning.exit()
76403               .transition()
76404               .duration(200)
76405               .style('opacity', 0)
76406               .remove();
76407
76408           var commentEnter = commentWarning.enter()
76409               .insert('div', '.tag-reference-body')
76410               .attr('class', 'field-warning comment-warning')
76411               .style('opacity', 0);
76412
76413           commentEnter
76414               .append('a')
76415               .attr('target', '_blank')
76416               .attr('tabindex', -1)
76417               .call(svgIcon('#iD-icon-alert', 'inline'))
76418               .attr('href', t('commit.google_warning_link'))
76419               .append('span')
76420               .text(t('commit.google_warning'));
76421
76422           commentEnter
76423               .transition()
76424               .duration(200)
76425               .style('opacity', 1);
76426       }
76427
76428
76429       changesetEditor.tags = function(_) {
76430           if (!arguments.length) return _tags;
76431           _tags = _;
76432           // Don't reset _fieldsArr here.
76433           return changesetEditor;
76434       };
76435
76436
76437       changesetEditor.changesetID = function(_) {
76438           if (!arguments.length) return _changesetID;
76439           if (_changesetID === _) return changesetEditor;
76440           _changesetID = _;
76441           _fieldsArr = null;
76442           return changesetEditor;
76443       };
76444
76445
76446       return utilRebind(changesetEditor, dispatch$$1, 'on');
76447   }
76448
76449   /**
76450    * This method is like `_.union` except that it accepts `iteratee` which is
76451    * invoked for each element of each `arrays` to generate the criterion by
76452    * which uniqueness is computed. Result values are chosen from the first
76453    * array in which the value occurs. The iteratee is invoked with one argument:
76454    * (value).
76455    *
76456    * @static
76457    * @memberOf _
76458    * @since 4.0.0
76459    * @category Array
76460    * @param {...Array} [arrays] The arrays to inspect.
76461    * @param {Function} [iteratee=_.identity] The iteratee invoked per element.
76462    * @returns {Array} Returns the new array of combined values.
76463    * @example
76464    *
76465    * _.unionBy([2.1], [1.2, 2.3], Math.floor);
76466    * // => [2.1, 1.2]
76467    *
76468    * // The `_.property` iteratee shorthand.
76469    * _.unionBy([{ 'x': 1 }], [{ 'x': 2 }, { 'x': 1 }], 'x');
76470    * // => [{ 'x': 1 }, { 'x': 2 }]
76471    */
76472   var unionBy = baseRest(function(arrays) {
76473     var iteratee = last(arrays);
76474     if (isArrayLikeObject(iteratee)) {
76475       iteratee = undefined;
76476     }
76477     return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true), baseIteratee(iteratee, 2));
76478   });
76479
76480   function uiCommitChanges(context) {
76481       var detected = utilDetect();
76482       var _entityID;
76483
76484
76485       function commitChanges(selection$$1) {
76486           var history = context.history();
76487           var summary = history.difference().summary();
76488
76489           var container = selection$$1.selectAll('.modal-section.commit-section')
76490               .data([0]);
76491
76492           var containerEnter = container.enter()
76493               .append('div')
76494               .attr('class', 'commit-section modal-section fillL2');
76495
76496           containerEnter
76497               .append('h3')
76498               .text(t('commit.changes', { count: summary.length }));
76499
76500           containerEnter
76501               .append('ul')
76502               .attr('class', 'changeset-list');
76503
76504           container = containerEnter
76505               .merge(container);
76506
76507
76508           var items = container.select('ul').selectAll('li')
76509               .data(summary);
76510
76511           var itemsEnter = items.enter()
76512               .append('li')
76513               .attr('class', 'change-item');
76514
76515           itemsEnter
76516               .each(function(d) {
76517                   select(this)
76518                       .call(svgIcon('#iD-icon-' + d.entity.geometry(d.graph), 'pre-text ' + d.changeType));
76519               });
76520
76521           itemsEnter
76522               .append('span')
76523               .attr('class', 'change-type')
76524               .text(function(d) { return t('commit.' + d.changeType) + ' '; });
76525
76526           itemsEnter
76527               .append('strong')
76528               .attr('class', 'entity-type')
76529               .text(function(d) {
76530                   var matched = context.presets().match(d.entity, d.graph);
76531                   return (matched && matched.name()) || utilDisplayType(d.entity.id);
76532               });
76533
76534           itemsEnter
76535               .append('span')
76536               .attr('class', 'entity-name')
76537               .text(function(d) {
76538                   var name = utilDisplayName(d.entity) || '',
76539                       string = '';
76540                   if (name !== '') {
76541                       string += ':';
76542                   }
76543                   return string += ' ' + name;
76544               });
76545
76546           itemsEnter
76547               .style('opacity', 0)
76548               .transition()
76549               .style('opacity', 1);
76550
76551           items = itemsEnter
76552               .merge(items);
76553
76554           items
76555               .on('mouseover', mouseover)
76556               .on('mouseout', mouseout)
76557               .on('click', click);
76558
76559
76560           // Download changeset link
76561           var changeset = new osmChangeset().update({ id: undefined });
76562           var changes = history.changes(actionDiscardTags(history.difference()));
76563
76564           delete changeset.id;  // Export without chnageset_id
76565
76566           var data = JXON.stringify(changeset.osmChangeJXON(changes));
76567           var blob = new Blob([data], {type: 'text/xml;charset=utf-8;'});
76568           var fileName = 'changes.osc';
76569
76570           var linkEnter = container.selectAll('.download-changes')
76571               .data([0])
76572               .enter()
76573               .append('a')
76574               .attr('class', 'download-changes');
76575
76576           if (detected.download) {      // All except IE11 and Edge
76577               linkEnter                 // download the data as a file
76578                   .attr('href', window.URL.createObjectURL(blob))
76579                   .attr('download', fileName);
76580
76581           } else {                      // IE11 and Edge
76582               linkEnter                 // open data uri in a new tab
76583                   .attr('target', '_blank')
76584                   .on('click.download', function() {
76585                       navigator.msSaveBlob(blob, fileName);
76586                   });
76587           }
76588
76589           linkEnter
76590               .call(svgIcon('#iD-icon-load', 'inline'))
76591               .append('span')
76592               .text(t('commit.download_changes'));
76593
76594
76595           function mouseover(d) {
76596               if (d.entity) {
76597                   context.surface().selectAll(
76598                       utilEntityOrMemberSelector([d.entity.id], context.graph())
76599                   ).classed('hover', true);
76600               }
76601           }
76602
76603
76604           function mouseout() {
76605               context.surface().selectAll('.hover')
76606                   .classed('hover', false);
76607           }
76608
76609
76610           function click(change) {
76611               if (change.changeType === 'deleted') {
76612                   _entityID = null;
76613               } else {
76614                   var entity = change.entity;
76615                   _entityID = change.entity.id;
76616                   context.map().zoomTo(entity);
76617                   context.surface().selectAll(utilEntityOrMemberSelector([_entityID], context.graph()))
76618                       .classed('hover', true);
76619               }
76620           }
76621       }
76622
76623
76624       commitChanges.entityID = function(_) {
76625           if (!arguments.length) return _entityID;
76626           _entityID = _;
76627           return commitChanges;
76628       };
76629
76630
76631       return commitChanges;
76632   }
76633
76634   function uiCommitWarnings(context) {
76635
76636       function commitWarnings(selection) {
76637
76638           var changes = context.history().changes();
76639           var warnings = context.history().validate(changes);
76640
76641           var container = selection.selectAll('.warning-section')
76642               .data(warnings.length ? [0] : []);
76643
76644           container.exit()
76645               .remove();
76646
76647           var containerEnter = container.enter()
76648               .append('div')
76649               .attr('class', 'modal-section warning-section fillL2');
76650
76651           containerEnter
76652               .append('h3')
76653               .text(t('commit.warnings'));
76654
76655           containerEnter
76656               .append('ul')
76657               .attr('class', 'changeset-list');
76658
76659           container = containerEnter
76660               .merge(container);
76661
76662
76663           var items = container.select('ul').selectAll('li')
76664               .data(warnings);
76665
76666           items.exit()
76667               .remove();
76668
76669           var itemsEnter = items.enter()
76670               .append('li')
76671               .attr('class', 'warning-item');
76672
76673           itemsEnter
76674               .call(svgIcon('#iD-icon-alert', 'pre-text'));
76675
76676           itemsEnter
76677               .append('strong')
76678               .text(function(d) { return d.message; });
76679
76680           itemsEnter.filter(function(d) { return d.tooltip; })
76681               .call(tooltip()
76682                   .title(function(d) { return d.tooltip; })
76683                   .placement('top')
76684               );
76685
76686           items = itemsEnter
76687               .merge(items);
76688
76689           items
76690               .on('mouseover', mouseover)
76691               .on('mouseout', mouseout)
76692               .on('click', warningClick);
76693
76694
76695           function mouseover(d) {
76696               if (d.entity) {
76697                   context.surface().selectAll(
76698                       utilEntityOrMemberSelector([d.entity.id], context.graph())
76699                   ).classed('hover', true);
76700               }
76701           }
76702
76703
76704           function mouseout() {
76705               context.surface().selectAll('.hover')
76706                   .classed('hover', false);
76707           }
76708
76709
76710           function warningClick(d) {
76711               if (d.entity) {
76712                   context.map().zoomTo(d.entity);
76713                   context.enter(modeSelect(context, [d.entity.id]));
76714               }
76715           }
76716
76717       }
76718
76719
76720       return commitWarnings;
76721   }
76722
76723   function uiRawTagEditor(context) {
76724       var taginfo = services.taginfo;
76725       var dispatch$$1 = dispatch('change');
76726       var _readOnlyTags = [];
76727       var _showBlank = false;
76728       var _updatePreference = true;
76729       var _expanded = false;
76730       var _newRow;
76731       var _state;
76732       var _preset;
76733       var _tags;
76734       var _entityID;
76735
76736
76737       function rawTagEditor(selection$$1) {
76738           var count = Object.keys(_tags).filter(function(d) { return d; }).length;
76739
76740           var disclosure = uiDisclosure(context, 'raw_tag_editor', false)
76741               .title(t('inspector.all_tags') + ' (' + count + ')')
76742               .on('toggled', toggled)
76743               .updatePreference(_updatePreference)
76744               .content(content);
76745
76746           // Sometimes we want to force the raw_tag_editor to be opened/closed..
76747           // When undefined, uiDisclosure will use the user's stored preference.
76748           if (_expanded !== undefined) {
76749               disclosure.expanded(_expanded);
76750           }
76751
76752           selection$$1.call(disclosure);
76753
76754           function toggled(expanded) {
76755               _expanded = expanded;
76756               if (expanded) {
76757                   selection$$1.node().parentNode.scrollTop += 200;
76758               }
76759           }
76760       }
76761
76762
76763       function content(wrap) {
76764           var entries = map$3(_tags, function(v, k) {
76765               return { key: k, value: v };
76766           });
76767
76768           if (!entries.length || _showBlank) {
76769               _showBlank = false;
76770               entries.push({key: '', value: ''});
76771               _newRow = '';
76772           }
76773
76774           var list = wrap.selectAll('.tag-list')
76775               .data([0]);
76776
76777           list = list.enter()
76778               .append('ul')
76779               .attr('class', 'tag-list')
76780               .merge(list);
76781
76782           var newTag = wrap.selectAll('.add-tag')
76783               .data([0]);
76784
76785           newTag.enter()
76786               .append('button')
76787               .attr('class', 'add-tag')
76788               .on('click', addTag)
76789               .call(svgIcon('#iD-icon-plus', 'light'));
76790
76791
76792           var items = list.selectAll('.tag-row')
76793               .data(entries, function(d) { return d.key; });
76794
76795           items.exit()
76796               .each(unbind)
76797               .remove();
76798
76799           // Enter
76800
76801           var enter = items.enter()
76802               .append('li')
76803               .attr('class', 'tag-row')
76804               .classed('readonly', isReadOnly);
76805
76806           var innerWrap = enter.append('div')
76807               .attr('class', 'inner-wrap');
76808
76809           innerWrap
76810               .append('div')
76811               .attr('class', 'key-wrap')
76812               .append('input')
76813               .property('type', 'text')
76814               .attr('class', 'key')
76815               .attr('maxlength', 255)
76816               .call(utilNoAuto)
76817               .on('blur', keyChange)
76818               .on('change', keyChange);
76819
76820           innerWrap
76821               .append('div')
76822               .attr('class', 'value-wrap')
76823               .append('input')
76824               .property('type', 'text')
76825               .attr('class', 'value')
76826               .attr('maxlength', 255)
76827               .call(utilNoAuto)
76828               .on('blur', valueChange)
76829               .on('change', valueChange)
76830               .on('keydown.push-more', pushMore);
76831
76832           innerWrap
76833               .append('button')
76834               .attr('tabindex', -1)
76835               .attr('class', 'form-field-button remove')
76836               .call(svgIcon('#iD-operation-delete'));
76837
76838
76839           // Update
76840
76841           items = items
76842               .merge(enter)
76843               .sort(function(a, b) {
76844                   return (a.key === _newRow && b.key !== _newRow) ? 1
76845                       : (a.key !== _newRow && b.key === _newRow) ? -1
76846                       : ascending(a.key, b.key);
76847               });
76848
76849           items
76850               .each(function(tag) {
76851                   var row = select(this);
76852                   var key = row.select('input.key');      // propagate bound data to child
76853                   var value = row.select('input.value');  // propagate bound data to child
76854
76855                   if (_entityID && taginfo) {
76856                       bindTypeahead(key, value);
76857                   }
76858
76859                   var isRelation = (_entityID && context.entity(_entityID).type === 'relation');
76860                   var reference;
76861
76862                   if (isRelation && tag.key === 'type') {
76863                       reference = uiTagReference({ rtype: tag.value }, context);
76864                   } else {
76865                       reference = uiTagReference({ key: tag.key, value: tag.value }, context);
76866                   }
76867
76868                   if (_state === 'hover') {
76869                       reference.showing(false);
76870                   }
76871
76872                   row.select('.inner-wrap')
76873                       .call(reference.button);
76874
76875                   row.call(reference.body);
76876               });
76877
76878           items.selectAll('input.key')
76879               .attr('title', function(d) { return d.key; })
76880               .call(utilGetSetValue, function(d) { return d.key; })
76881               .property('disabled', isReadOnly);
76882
76883           items.selectAll('input.value')
76884               .attr('title', function(d) { return d.value; })
76885               .call(utilGetSetValue, function(d) { return d.value; })
76886               .property('disabled', isReadOnly);
76887
76888           items.selectAll('button.remove')
76889               .on('click', removeTag);
76890
76891
76892
76893           function isReadOnly(d) {
76894               for (var i = 0; i < _readOnlyTags.length; i++) {
76895                   if (d.key.match(_readOnlyTags[i]) !== null) {
76896                       return true;
76897                   }
76898               }
76899               return false;
76900           }
76901
76902
76903           function pushMore() {
76904               if (event.keyCode === 9 && !event.shiftKey &&
76905                   list.selectAll('li:last-child input.value').node() === this) {
76906                   addTag();
76907               }
76908           }
76909
76910
76911           function bindTypeahead(key, value) {
76912               if (isReadOnly(key.datum())) return;
76913
76914               var geometry = context.geometry(_entityID);
76915
76916               key.call(d3combobox()
76917                   .container(context.container())
76918                   .fetcher(function(value, callback) {
76919                       taginfo.keys({
76920                           debounce: true,
76921                           geometry: geometry,
76922                           query: value
76923                       }, function(err, data) {
76924                           if (!err) callback(sort(value, data));
76925                       });
76926                   }));
76927
76928               value.call(d3combobox()
76929                   .container(context.container())
76930                   .fetcher(function(value, callback) {
76931                       taginfo.values({
76932                           debounce: true,
76933                           key: utilGetSetValue(key),
76934                           geometry: geometry,
76935                           query: value
76936                       }, function(err, data) {
76937                           if (!err) callback(sort(value, data));
76938                       });
76939                   }));
76940
76941
76942               function sort(value, data) {
76943                   var sameletter = [];
76944                   var other = [];
76945                   for (var i = 0; i < data.length; i++) {
76946                       if (data[i].value.substring(0, value.length) === value) {
76947                           sameletter.push(data[i]);
76948                       } else {
76949                           other.push(data[i]);
76950                       }
76951                   }
76952                   return sameletter.concat(other);
76953               }
76954           }
76955
76956
76957           function unbind() {
76958               var row = select(this);
76959
76960               row.selectAll('input.key')
76961                   .call(d3combobox.off);
76962
76963               row.selectAll('input.value')
76964                   .call(d3combobox.off);
76965           }
76966
76967
76968           function keyChange(d) {
76969               var kOld = d.key;
76970               var kNew = this.value.trim();
76971               var tag = {};
76972
76973               if (isReadOnly({ key: kNew })) {
76974                   this.value = kOld;
76975                   return;
76976               }
76977
76978               if (kNew && kNew !== kOld) {
76979                   var match = kNew.match(/^(.*?)(?:_(\d+))?$/);
76980                   var base = match[1];
76981                   var suffix = +(match[2] || 1);
76982                   while (_tags[kNew]) {  // rename key if already in use
76983                       kNew = base + '_' + suffix++;
76984                   }
76985
76986                   if (includes(kNew, '=')) {
76987                       var splitStr = kNew.split('=').map(function(str) { return str.trim(); });
76988                       var key = splitStr[0];
76989                       var value = splitStr[1];
76990
76991                       kNew = key;
76992                       d.value = value;
76993                   }
76994               }
76995               tag[kOld] = undefined;
76996               tag[kNew] = d.value;
76997
76998               d.key = kNew;  // Maintain DOM identity through the subsequent update.
76999
77000               if (_newRow === kOld) {   // see if this row is still a new row
77001                   _newRow = ((d.value === '' || kNew === '') ? kNew : undefined);
77002               }
77003
77004               this.value = kNew;
77005               dispatch$$1.call('change', this, tag);
77006           }
77007
77008
77009           function valueChange(d) {
77010               if (isReadOnly(d)) return;
77011               var tag = {};
77012               tag[d.key] = this.value;
77013
77014               if (_newRow === d.key && d.key !== '' && d.value !== '') {   // not a new row anymore
77015                   _newRow = undefined;
77016               }
77017
77018               dispatch$$1.call('change', this, tag);
77019           }
77020
77021
77022           function removeTag(d) {
77023               if (isReadOnly(d)) return;
77024               var tag = {};
77025               tag[d.key] = undefined;
77026               dispatch$$1.call('change', this, tag);
77027               select(this.parentNode).remove();
77028           }
77029
77030
77031           function addTag() {
77032               // Wrapped in a setTimeout in case it's being called from a blur
77033               // handler. Without the setTimeout, the call to `content` would
77034               // wipe out the pending value change.
77035               window.setTimeout(function() {
77036                   _showBlank = true;
77037                   content(wrap);
77038                   list.selectAll('li:last-child input.key').node().focus();
77039               }, 1);
77040           }
77041       }
77042
77043
77044       rawTagEditor.state = function(_) {
77045           if (!arguments.length) return _state;
77046           _state = _;
77047           return rawTagEditor;
77048       };
77049
77050
77051       rawTagEditor.preset = function(_) {
77052           if (!arguments.length) return _preset;
77053           _preset = _;
77054           if (_preset.isFallback()) {
77055               _expanded = true;
77056               _updatePreference = false;
77057           } else {
77058               _expanded = undefined;
77059               _updatePreference = true;
77060           }
77061           return rawTagEditor;
77062       };
77063
77064
77065       rawTagEditor.tags = function(_) {
77066           if (!arguments.length) return _tags;
77067           _tags = _;
77068           return rawTagEditor;
77069       };
77070
77071
77072       rawTagEditor.entityID = function(_) {
77073           if (!arguments.length) return _entityID;
77074           _entityID = _;
77075           return rawTagEditor;
77076       };
77077
77078
77079       rawTagEditor.expanded = function(_) {
77080           if (!arguments.length) return _expanded;
77081           _expanded = _;
77082           _updatePreference = false;
77083           return rawTagEditor;
77084       };
77085
77086
77087       rawTagEditor.readOnlyTags = function(_) {
77088           if (!arguments.length) return _readOnlyTags;
77089           _readOnlyTags = _;
77090           return rawTagEditor;
77091       };
77092
77093
77094       return utilRebind(rawTagEditor, dispatch$$1, 'on');
77095   }
77096
77097   var _changeset$1;
77098   var readOnlyTags = [
77099       /^changesets_count$/,
77100       /^created_by$/,
77101       /^ideditor:/,
77102       /^imagery_used$/,
77103       /^host$/,
77104       /^locale$/
77105   ];
77106
77107   // treat most punctuation (except -, _, +, &) as hashtag delimiters - #4398
77108   // from https://stackoverflow.com/a/25575009
77109   var hashtagRegex = /(#[^\u2000-\u206F\u2E00-\u2E7F\s\\'!"#$%()*,.\/:;<=>?@\[\]^`{|}~]+)/g;
77110
77111
77112   function uiCommit(context) {
77113       var dispatch$$1 = dispatch('cancel', 'save');
77114       var _userDetails;
77115       var _selection;
77116
77117       var changesetEditor = uiChangesetEditor(context)
77118           .on('change', changeTags);
77119       var rawTagEditor = uiRawTagEditor(context)
77120           .on('change', changeTags);
77121       var commitChanges = uiCommitChanges(context);
77122       var commitWarnings = uiCommitWarnings(context);
77123
77124
77125       function commit(selection$$1) {
77126           _selection = selection$$1;
77127
77128           var osm = context.connection();
77129           if (!osm) return;
77130
77131           // expire stored comment, hashtags, source after cutoff datetime - #3947 #4899
77132           var commentDate = +context.storage('commentDate') || 0;
77133           var currDate = Date.now();
77134           var cutoff = 2 * 86400 * 1000;   // 2 days
77135           if (commentDate > currDate || currDate - commentDate > cutoff) {
77136               context.storage('comment', null);
77137               context.storage('hashtags', null);
77138               context.storage('source', null);
77139           }
77140
77141           var tags;
77142           if (!_changeset$1) {
77143               var detected = utilDetect();
77144               tags = {
77145                   comment: context.storage('comment') || '',
77146                   created_by: ('iD ' + context.version).substr(0, 255),
77147                   host: detected.host.substr(0, 255),
77148                   locale: detected.locale.substr(0, 255)
77149               };
77150
77151               // call findHashtags initially - this will remove stored
77152               // hashtags if any hashtags are found in the comment - #4304
77153               findHashtags(tags, true);
77154
77155               var hashtags = context.storage('hashtags');
77156               if (hashtags) {
77157                   tags.hashtags = hashtags;
77158               }
77159
77160               // iD 2.8.1 could write a literal 'undefined' here.. see #5021
77161               // (old source values expire after 2 days, so 'undefined' checks can go away in v2.9)
77162               var source = context.storage('source');
77163               if (source && source !== 'undefined') {
77164                   tags.source = source;
77165               } else if (source === 'undefined') {
77166                   context.storage('source', null);
77167               }
77168
77169               _changeset$1 = new osmChangeset({ tags: tags });
77170           }
77171
77172           tags = clone(_changeset$1.tags);
77173           tags.imagery_used = context.history().imageryUsed().join(';').substr(0, 255);
77174           _changeset$1 = _changeset$1.update({ tags: tags });
77175
77176           var header = selection$$1.selectAll('.header')
77177               .data([0]);
77178
77179           header.enter()
77180               .append('div')
77181               .attr('class', 'header fillL')
77182               .append('h3')
77183               .text(t('commit.title'));
77184
77185           var body = selection$$1.selectAll('.body')
77186               .data([0]);
77187
77188           body = body.enter()
77189               .append('div')
77190               .attr('class', 'body')
77191               .merge(body);
77192
77193
77194           // Changeset Section
77195           var changesetSection = body.selectAll('.changeset-editor')
77196               .data([0]);
77197
77198           changesetSection = changesetSection.enter()
77199               .append('div')
77200               .attr('class', 'modal-section changeset-editor')
77201               .merge(changesetSection);
77202
77203           changesetSection
77204               .call(changesetEditor
77205                   .changesetID(_changeset$1.id)
77206                   .tags(tags)
77207               );
77208
77209
77210           // Warnings
77211           body.call(commitWarnings);
77212
77213
77214           // Upload Explanation
77215           var saveSection = body.selectAll('.save-section')
77216               .data([0]);
77217
77218           saveSection = saveSection.enter()
77219               .append('div')
77220               .attr('class','modal-section save-section fillL cf')
77221               .merge(saveSection);
77222
77223           var prose = saveSection.selectAll('.commit-info')
77224               .data([0]);
77225
77226           prose = prose.enter()
77227               .append('p')
77228               .attr('class', 'commit-info')
77229               .text(t('commit.upload_explanation'))
77230               .merge(prose);
77231
77232           osm.userDetails(function(err, user) {
77233               if (err) return;
77234
77235               var userLink = select(document.createElement('div'));
77236
77237               _userDetails = user;
77238
77239               if (user.image_url) {
77240                   userLink
77241                       .append('img')
77242                       .attr('src', user.image_url)
77243                       .attr('class', 'icon pre-text user-icon');
77244               }
77245
77246               userLink
77247                   .append('a')
77248                   .attr('class', 'user-info')
77249                   .text(user.display_name)
77250                   .attr('href', osm.userURL(user.display_name))
77251                   .attr('tabindex', -1)
77252                   .attr('target', '_blank');
77253
77254               prose
77255                   .html(t('commit.upload_explanation_with_user', { user: userLink.html() }));
77256           });
77257
77258
77259           // Request Review
77260           var requestReview = saveSection.selectAll('.request-review')
77261               .data([0]);
77262
77263           // Enter
77264           var requestReviewEnter = requestReview.enter()
77265               .append('div')
77266               .attr('class', 'request-review');
77267
77268           var labelEnter = requestReviewEnter
77269               .append('label')
77270               .attr('for', 'commit-input-request-review');
77271
77272           labelEnter
77273               .append('input')
77274               .attr('type', 'checkbox')
77275               .attr('id', 'commit-input-request-review');
77276
77277           labelEnter
77278               .append('span')
77279               .text(t('commit.request_review'));
77280
77281           // Update
77282           requestReview = requestReview
77283               .merge(requestReviewEnter);
77284
77285           var requestReviewInput = requestReview.selectAll('input')
77286               .property('checked', isReviewRequested(_changeset$1.tags))
77287               .on('change', toggleRequestReview);
77288
77289
77290           // Buttons
77291           var buttonSection = saveSection.selectAll('.buttons')
77292               .data([0]);
77293
77294           // enter
77295           var buttonEnter = buttonSection.enter()
77296               .append('div')
77297               .attr('class', 'buttons fillL cf');
77298
77299           buttonEnter
77300               .append('button')
77301               .attr('class', 'secondary-action button cancel-button')
77302               .append('span')
77303               .attr('class', 'label')
77304               .text(t('commit.cancel'));
77305
77306           buttonEnter
77307               .append('button')
77308               .attr('class', 'action button save-button')
77309               .append('span')
77310               .attr('class', 'label')
77311               .text(t('commit.save'));
77312
77313           // update
77314           buttonSection = buttonSection
77315               .merge(buttonEnter);
77316
77317           buttonSection.selectAll('.cancel-button')
77318               .on('click.cancel', function() {
77319                   var selectedID = commitChanges.entityID();
77320                   dispatch$$1.call('cancel', this, selectedID);
77321               });
77322
77323           buttonSection.selectAll('.save-button')
77324               .attr('disabled', function() {
77325                   var n = select('#preset-input-comment').node();
77326                   return (n && n.value.length) ? null : true;
77327               })
77328               .on('click.save', function() {
77329                   this.blur();    // avoid keeping focus on the button - #4641
77330                   dispatch$$1.call('save', this, _changeset$1);
77331               });
77332
77333
77334           // Raw Tag Editor
77335           var tagSection = body.selectAll('.tag-section.raw-tag-editor')
77336               .data([0]);
77337
77338           tagSection = tagSection.enter()
77339               .append('div')
77340               .attr('class', 'modal-section tag-section raw-tag-editor')
77341               .merge(tagSection);
77342
77343           var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
77344           tagSection
77345               .call(rawTagEditor
77346                   .expanded(expanded)
77347                   .readOnlyTags(readOnlyTags)
77348                   .tags(clone(_changeset$1.tags))
77349               );
77350
77351
77352           // Change summary
77353           body.call(commitChanges);
77354
77355
77356           function toggleRequestReview() {
77357               var rr = requestReviewInput.property('checked');
77358               updateChangeset({ review_requested: (rr ? 'yes' : undefined) });
77359
77360               var expanded = !tagSection.selectAll('a.hide-toggle.expanded').empty();
77361               tagSection
77362                   .call(rawTagEditor
77363                       .expanded(expanded)
77364                       .readOnlyTags(readOnlyTags)
77365                       .tags(clone(_changeset$1.tags))
77366                   );
77367           }
77368       }
77369
77370
77371       function changeTags(changed, onInput) {
77372           if (changed.hasOwnProperty('comment')) {
77373               if (changed.comment === undefined) {
77374                   changed.comment = '';
77375               }
77376               if (!onInput) {
77377                   context.storage('comment', changed.comment);
77378                   context.storage('commentDate', Date.now());
77379               }
77380           }
77381           if (changed.hasOwnProperty('source')) {
77382               if (changed.source === undefined) {
77383                   context.storage('source', null);
77384               } else if (!onInput) {
77385                   context.storage('source', changed.source);
77386                   context.storage('commentDate', Date.now());
77387               }
77388           }
77389
77390           updateChangeset(changed, onInput);
77391
77392           if (_selection) {
77393               _selection.call(commit);
77394           }
77395       }
77396
77397
77398       function findHashtags(tags, commentOnly) {
77399           var inComment = commentTags();
77400           var inHashTags = hashTags();
77401
77402           if (inComment !== null) {                    // when hashtags are detected in comment...
77403               context.storage('hashtags', null);       // always remove stored hashtags - #4304
77404               if (commentOnly) { inHashTags = null; }  // optionally override hashtags field
77405           }
77406           return unionBy(inComment, inHashTags, function (s) {
77407               return s.toLowerCase();
77408           });
77409
77410           // Extract hashtags from `comment`
77411           function commentTags() {
77412               return tags.comment
77413                   .replace(/http\S*/g, '')  // drop anything that looks like a URL - #4289
77414                   .match(hashtagRegex);
77415           }
77416
77417           // Extract and clean hashtags from `hashtags`
77418           function hashTags() {
77419               var t$$1 = tags.hashtags || '';
77420               return t$$1
77421                   .split(/[,;\s]+/)
77422                   .map(function (s) {
77423                       if (s[0] !== '#') { s = '#' + s; }    // prepend '#'
77424                       var matched = s.match(hashtagRegex);
77425                       return matched && matched[0];
77426                   }).filter(Boolean);                       // exclude falsey
77427           }
77428       }
77429
77430
77431       function isReviewRequested(tags) {
77432           var rr = tags.review_requested;
77433           if (rr === undefined) return false;
77434           rr = rr.trim().toLowerCase();
77435           return !(rr === '' || rr === 'no');
77436       }
77437
77438
77439       function updateChangeset(changed, onInput) {
77440           var tags = clone(_changeset$1.tags);
77441
77442           forEach(changed, function(v, k) {
77443               k = k.trim().substr(0, 255);
77444               if (readOnlyTags.indexOf(k) !== -1) return;
77445
77446               if (k !== '' && v !== undefined) {
77447                   if (onInput) {
77448                       tags[k] = v;
77449                   } else {
77450                       tags[k] = v.trim().substr(0, 255);
77451                   }
77452               } else {
77453                   delete tags[k];
77454               }
77455           });
77456
77457           if (!onInput) {
77458               // when changing the comment, override hashtags with any found in comment.
77459               var commentOnly = changed.hasOwnProperty('comment') && (changed.comment !== '');
77460               var arr = findHashtags(tags, commentOnly);
77461               if (arr.length) {
77462                   tags.hashtags = arr.join(';').substr(0, 255);
77463                   context.storage('hashtags', tags.hashtags);
77464               } else {
77465                   delete tags.hashtags;
77466                   context.storage('hashtags', null);
77467               }
77468           }
77469
77470           // always update userdetails, just in case user reauthenticates as someone else
77471           if (_userDetails && _userDetails.changesets_count !== undefined) {
77472               var changesetsCount = parseInt(_userDetails.changesets_count, 10) + 1;  // #4283
77473               tags.changesets_count = String(changesetsCount);
77474
77475               // first 100 edits - new user
77476               if (changesetsCount <= 100) {
77477                   var s;
77478                   s = context.storage('walkthrough_completed');
77479                   if (s) {
77480                       tags['ideditor:walkthrough_completed'] = s;
77481                   }
77482
77483                   s = context.storage('walkthrough_progress');
77484                   if (s) {
77485                       tags['ideditor:walkthrough_progress'] = s;
77486                   }
77487
77488                   s = context.storage('walkthrough_started');
77489                   if (s) {
77490                       tags['ideditor:walkthrough_started'] = s;
77491                   }
77492               }
77493           } else {
77494               delete tags.changesets_count;
77495           }
77496
77497           if (!isEqual(_changeset$1.tags, tags)) {
77498               _changeset$1 = _changeset$1.update({ tags: tags });
77499           }
77500       }
77501
77502
77503       commit.reset = function() {
77504           _changeset$1 = null;
77505       };
77506
77507
77508       return utilRebind(commit, dispatch$$1, 'on');
77509   }
77510
77511   function uiConflicts(context) {
77512       var dispatch$$1 = dispatch('cancel', 'save');
77513       var keybinding = utilKeybinding('conflicts');
77514       var _origChanges;
77515       var _conflictList;
77516
77517
77518       function keybindingOn() {
77519           select(document)
77520               .call(keybinding.on('⎋', cancel, true));
77521       }
77522
77523       function keybindingOff() {
77524           select(document)
77525               .call(keybinding.unbind);
77526       }
77527
77528       function tryAgain() {
77529           keybindingOff();
77530           dispatch$$1.call('save');
77531       }
77532
77533       function cancel() {
77534           keybindingOff();
77535           dispatch$$1.call('cancel');
77536       }
77537
77538
77539       function conflicts(selection$$1) {
77540           keybindingOn();
77541
77542           var headerEnter = selection$$1.selectAll('.header')
77543               .data([0])
77544               .enter()
77545               .append('div')
77546               .attr('class', 'header fillL');
77547
77548           headerEnter
77549               .append('button')
77550               .attr('class', 'fr')
77551               .on('click', cancel)
77552               .call(svgIcon('#iD-icon-close'));
77553
77554           headerEnter
77555               .append('h3')
77556               .text(t('save.conflict.header'));
77557
77558           var bodyEnter = selection$$1.selectAll('.body')
77559               .data([0])
77560               .enter()
77561               .append('div')
77562               .attr('class', 'body fillL');
77563
77564           var conflictsHelpEnter = bodyEnter
77565               .append('div')
77566               .attr('class', 'conflicts-help')
77567               .text(t('save.conflict.help'));
77568
77569
77570           // Download changes link
77571           var detected = utilDetect();
77572           var changeset = new osmChangeset();
77573
77574           delete changeset.id;  // Export without changeset_id
77575
77576           var data = JXON.stringify(changeset.osmChangeJXON(_origChanges));
77577           var blob = new Blob([data], { type: 'text/xml;charset=utf-8;' });
77578           var fileName = 'changes.osc';
77579
77580           var linkEnter = conflictsHelpEnter.selectAll('.download-changes')
77581               .append('a')
77582               .attr('class', 'download-changes');
77583
77584           if (detected.download) {      // All except IE11 and Edge
77585               linkEnter                 // download the data as a file
77586                   .attr('href', window.URL.createObjectURL(blob))
77587                   .attr('download', fileName);
77588
77589           } else {                      // IE11 and Edge
77590               linkEnter                 // open data uri in a new tab
77591                   .attr('target', '_blank')
77592                   .on('click.download', function() {
77593                       navigator.msSaveBlob(blob, fileName);
77594                   });
77595           }
77596
77597           linkEnter
77598               .call(svgIcon('#iD-icon-load', 'inline'))
77599               .append('span')
77600               .text(t('save.conflict.download_changes'));
77601
77602
77603           bodyEnter
77604               .append('div')
77605               .attr('class', 'conflict-container fillL3')
77606               .call(showConflict, 0);
77607
77608           bodyEnter
77609               .append('div')
77610               .attr('class', 'conflicts-done')
77611               .attr('opacity', 0)
77612               .style('display', 'none')
77613               .text(t('save.conflict.done'));
77614
77615           var buttonsEnter = bodyEnter
77616               .append('div')
77617               .attr('class','buttons col12 joined conflicts-buttons');
77618
77619           buttonsEnter
77620               .append('button')
77621               .attr('disabled', _conflictList.length > 1)
77622               .attr('class', 'action conflicts-button col6')
77623               .text(t('save.title'))
77624               .on('click.try_again', tryAgain);
77625
77626           buttonsEnter
77627               .append('button')
77628               .attr('class', 'secondary-action conflicts-button col6')
77629               .text(t('confirm.cancel'))
77630               .on('click.cancel', cancel);
77631       }
77632
77633
77634       function showConflict(selection$$1, index) {
77635           index = utilWrap(index, _conflictList.length);
77636
77637           var parent = select(selection$$1.node().parentNode);
77638
77639           // enable save button if this is the last conflict being reviewed..
77640           if (index === _conflictList.length - 1) {
77641               window.setTimeout(function() {
77642                   parent.select('.conflicts-button')
77643                       .attr('disabled', null);
77644
77645                   parent.select('.conflicts-done')
77646                       .transition()
77647                       .attr('opacity', 1)
77648                       .style('display', 'block');
77649               }, 250);
77650           }
77651
77652           var conflict = selection$$1
77653               .selectAll('.conflict')
77654               .data([_conflictList[index]]);
77655
77656           conflict.exit()
77657               .remove();
77658
77659           var conflictEnter = conflict.enter()
77660               .append('div')
77661               .attr('class', 'conflict');
77662
77663           conflictEnter
77664               .append('h4')
77665               .attr('class', 'conflict-count')
77666               .text(t('save.conflict.count', { num: index + 1, total: _conflictList.length }));
77667
77668           conflictEnter
77669               .append('a')
77670               .attr('class', 'conflict-description')
77671               .attr('href', '#')
77672               .text(function(d) { return d.name; })
77673               .on('click', function(d) {
77674                   event.preventDefault();
77675                   zoomToEntity(d.id);
77676               });
77677
77678           var details = conflictEnter
77679               .append('div')
77680               .attr('class', 'conflict-detail-container');
77681
77682           details
77683               .append('ul')
77684               .attr('class', 'conflict-detail-list')
77685               .selectAll('li')
77686               .data(function(d) { return d.details || []; })
77687               .enter()
77688               .append('li')
77689               .attr('class', 'conflict-detail-item')
77690               .html(function(d) { return d; });
77691
77692           details
77693               .append('div')
77694               .attr('class', 'conflict-choices')
77695               .call(addChoices);
77696
77697           details
77698               .append('div')
77699               .attr('class', 'conflict-nav-buttons joined cf')
77700               .selectAll('button')
77701               .data(['previous', 'next'])
77702               .enter()
77703               .append('button')
77704               .text(function(d) { return t('save.conflict.' + d); })
77705               .attr('class', 'conflict-nav-button action col6')
77706               .attr('disabled', function(d, i) {
77707                   return (i === 0 && index === 0) ||
77708                       (i === 1 && index === _conflictList.length - 1) || null;
77709               })
77710               .on('click', function(d, i) {
77711                   event.preventDefault();
77712
77713                   var container = parent.selectAll('.conflict-container');
77714                   var sign = (i === 0 ? -1 : 1);
77715
77716                   container
77717                       .selectAll('.conflict')
77718                       .remove();
77719
77720                   container
77721                       .call(showConflict, index + sign);
77722               });
77723
77724       }
77725
77726
77727       function addChoices(selection$$1) {
77728           var choices = selection$$1
77729               .append('ul')
77730               .attr('class', 'layer-list')
77731               .selectAll('li')
77732               .data(function(d) { return d.choices || []; });
77733
77734           // enter
77735           var choicesEnter = choices.enter()
77736               .append('li')
77737               .attr('class', 'layer');
77738
77739           var labelEnter = choicesEnter
77740               .append('label');
77741
77742           labelEnter
77743               .append('input')
77744               .attr('type', 'radio')
77745               .attr('name', function(d) { return d.id; })
77746               .on('change', function(d, i) {
77747                   var ul = this.parentNode.parentNode.parentNode;
77748                   ul.__data__.chosen = i;
77749                   choose(ul, d);
77750               });
77751
77752           labelEnter
77753               .append('span')
77754               .text(function(d) { return d.text; });
77755
77756           // update
77757           choicesEnter
77758               .merge(choices)
77759               .each(function(d, i) {
77760                   var ul = this.parentNode;
77761                   if (ul.__data__.chosen === i) {
77762                       choose(ul, d);
77763                   }
77764               });
77765       }
77766
77767
77768       function choose(ul, datum) {
77769           if (event) event.preventDefault();
77770
77771           select(ul)
77772               .selectAll('li')
77773               .classed('active', function(d) { return d === datum; })
77774               .selectAll('input')
77775               .property('checked', function(d) { return d === datum; });
77776
77777           var extent = geoExtent$$1();
77778           var entity;
77779
77780           entity = context.graph().hasEntity(datum.id);
77781           if (entity) extent._extend(entity.extent(context.graph()));
77782
77783           datum.action();
77784
77785           entity = context.graph().hasEntity(datum.id);
77786           if (entity) extent._extend(entity.extent(context.graph()));
77787
77788           zoomToEntity(datum.id, extent);
77789       }
77790
77791
77792       function zoomToEntity(id, extent) {
77793           context.surface().selectAll('.hover')
77794               .classed('hover', false);
77795
77796           var entity = context.graph().hasEntity(id);
77797           if (entity) {
77798               if (extent) {
77799                   context.map().trimmedExtent(extent);
77800               } else {
77801                   context.map().zoomTo(entity);
77802               }
77803               context.surface().selectAll(utilEntityOrMemberSelector([entity.id], context.graph()))
77804                   .classed('hover', true);
77805           }
77806       }
77807
77808
77809       // The conflict list should be an array of objects like:
77810       // {
77811       //     id: id,
77812       //     name: entityName(local),
77813       //     details: merge.conflicts(),
77814       //     chosen: 1,
77815       //     choices: [
77816       //         choice(id, keepMine, forceLocal),
77817       //         choice(id, keepTheirs, forceRemote)
77818       //     ]
77819       // }
77820       conflicts.conflictList = function(_) {
77821           if (!arguments.length) return _conflictList;
77822           _conflictList = _;
77823           return conflicts;
77824       };
77825
77826
77827       conflicts.origChanges = function(_) {
77828           if (!arguments.length) return _origChanges;
77829           _origChanges = _;
77830           return conflicts;
77831       };
77832
77833
77834       return utilRebind(conflicts, dispatch$$1, 'on');
77835   }
77836
77837   function uiDataEditor$$1(context) {
77838       var dataHeader = uiDataHeader();
77839       var rawTagEditor = uiRawTagEditor(context);
77840       var _datum;
77841
77842
77843       function dataEditor(selection) {
77844           var header = selection.selectAll('.header')
77845               .data([0]);
77846
77847           var headerEnter = header.enter()
77848               .append('div')
77849               .attr('class', 'header fillL');
77850
77851           headerEnter
77852               .append('button')
77853               .attr('class', 'fr data-editor-close')
77854               .on('click', function() {
77855                   context.enter(modeBrowse(context));
77856               })
77857               .call(svgIcon('#iD-icon-close'));
77858
77859           headerEnter
77860               .append('h3')
77861               .text(t('map_data.title'));
77862
77863
77864           var body = selection.selectAll('.body')
77865               .data([0]);
77866
77867           body = body.enter()
77868               .append('div')
77869               .attr('class', 'body')
77870               .merge(body);
77871
77872           var editor = body.selectAll('.data-editor')
77873               .data([0]);
77874
77875           editor.enter()
77876               .append('div')
77877               .attr('class', 'modal-section data-editor')
77878               .merge(editor)
77879               .call(dataHeader.datum(_datum));
77880
77881           var rte = body.selectAll('.raw-tag-editor')
77882               .data([0]);
77883
77884           rte.enter()
77885               .append('div')
77886               .attr('class', 'inspector-border raw-tag-editor inspector-inner data-editor')
77887               .merge(rte)
77888               .call(rawTagEditor
77889                   .expanded(true)
77890                   .readOnlyTags([/./])
77891                   .tags((_datum && _datum.properties) || {})
77892                   .state('hover')
77893               );
77894       }
77895
77896
77897       dataEditor.datum = function(val) {
77898           if (!arguments.length) return _datum;
77899           _datum = val;
77900           return this;
77901       };
77902
77903
77904       return dataEditor;
77905   }
77906
77907   function uiDataHeader() {
77908       var _datum;
77909
77910
77911       function dataHeader(selection) {
77912           var header = selection.selectAll('.data-header')
77913               .data(
77914                   (_datum ? [_datum] : []),
77915                   function(d) { return d.__featurehash__; }
77916               );
77917
77918           header.exit()
77919               .remove();
77920
77921           var headerEnter = header.enter()
77922               .append('div')
77923               .attr('class', 'data-header');
77924
77925           var iconEnter = headerEnter
77926               .append('div')
77927               .attr('class', 'data-header-icon');
77928
77929           iconEnter
77930               .append('div')
77931               .attr('class', 'preset-icon-28')
77932               .call(svgIcon('#iD-icon-data', 'note-fill'));
77933
77934           headerEnter
77935               .append('div')
77936               .attr('class', 'data-header-label')
77937               .text(t('map_data.layers.custom.title'));
77938       }
77939
77940
77941       dataHeader.datum = function(val) {
77942           if (!arguments.length) return _datum;
77943           _datum = val;
77944           return this;
77945       };
77946
77947
77948       return dataHeader;
77949   }
77950
77951   function uiEditMenu(context, operations) {
77952       var menu;
77953       var center = [0, 0];
77954       var offset = [0, 0];
77955       var tooltip;
77956
77957       var p = 8;               // top padding
77958       var m = 4;               // top margin
77959       var h = 15;              // height of icon
77960       var vpBottomMargin = 45; // viewport bottom margin
77961       var vpSideMargin = 35;   // viewport side margin
77962       var buttonWidth = 44;
77963       var buttonHeight = (2 * p + h);
77964       var menuWidth = buttonWidth;
77965       var menuHeight = (2 * m) + operations.length * buttonHeight;
77966       var menuSideMargin = 10;
77967       var tooltipWidth = 200;
77968       var tooltipHeight = 200;  // a reasonable guess, real height depends on tooltip contents
77969
77970
77971       var editMenu = function (selection$$1) {
77972           if (!operations.length) return;
77973
77974           selection$$1.node().parentNode.focus();
77975
77976           var isRTL = textDirection === 'rtl';
77977           var viewport = context.surfaceRect();
77978
77979           if (!isRTL && (center[0] + menuSideMargin + menuWidth) > (viewport.width - vpSideMargin)) {
77980               // menu is going left-to-right and near right viewport edge, go left instead
77981               isRTL = true;
77982           } else if (isRTL && (center[0] - menuSideMargin - menuWidth) < vpSideMargin) {
77983               // menu is going right-to-left and near left viewport edge, go right instead
77984               isRTL = false;
77985           }
77986
77987           offset[0] = (isRTL ? -1 * (menuSideMargin + menuWidth) : menuSideMargin);
77988
77989           if (center[1] + menuHeight > (viewport.height - vpBottomMargin)) {
77990               // menu is near bottom viewport edge, shift upwards
77991               offset[1] = -1 * (center[1] + menuHeight - viewport.height + vpBottomMargin);
77992           }
77993
77994           var origin = [ center[0] + offset[0], center[1] + offset[1] ];
77995
77996           menu = selection$$1
77997               .append('g')
77998               .attr('class', 'edit-menu')
77999               .attr('transform', 'translate(' + origin + ')')
78000               .attr('opacity', 0);
78001
78002           menu
78003               .transition()
78004               .attr('opacity', 1);
78005
78006           menu
78007               .append('rect')
78008               .attr('class', 'edit-menu-background')
78009               .attr('x', 4)
78010               .attr('rx', 4)
78011               .attr('ry', 4)
78012               .attr('width', menuWidth)
78013               .attr('height', menuHeight)
78014               .attr('stroke-linecap', 'round');
78015
78016
78017           var button = menu.selectAll('.edit-menu-item')
78018               .data(operations)
78019               .enter()
78020               .append('g')
78021               .attr('class', function (d) { return 'edit-menu-item edit-menu-item-' + d.id; })
78022               .classed('disabled', function (d) { return d.disabled(); })
78023               .attr('transform', function (d, i) {
78024                   return 'translate(' + geoVecFloor([
78025                       0,
78026                       m + i * buttonHeight
78027                   ]).join(',') + ')';
78028               });
78029
78030           button
78031               .append('rect')
78032               .attr('x', 4)
78033               .attr('width', buttonWidth)
78034               .attr('height', buttonHeight)
78035               .on('click', click)
78036               .on('mousedown', mousedown)
78037               .on('mouseover', mouseover)
78038               .on('mouseout', mouseout);
78039
78040           button
78041               .append('use')
78042               .attr('width', '20')
78043               .attr('height', '20')
78044               .attr('transform', function () { return 'translate(' + [2 * p, 5] + ')'; })
78045               .attr('xlink:href', function (d) { return '#iD-operation-' + d.id; });
78046
78047           tooltip = select(document.body)
78048               .append('div')
78049               .attr('class', 'tooltip-inner edit-menu-tooltip');
78050
78051
78052           function click(operation) {
78053               event.stopPropagation();
78054               if (operation.disabled()) return;
78055               operation();
78056               editMenu.close();
78057           }
78058
78059           function mousedown() {
78060               event.stopPropagation();  // https://github.com/openstreetmap/iD/issues/1869
78061           }
78062
78063           function mouseover(d, i) {
78064               var tipX, tipY;
78065
78066               if (!isRTL) {
78067                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
78068               } else {
78069                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
78070               }
78071
78072               if (tipX + tooltipWidth > viewport.right) {
78073                   // tip is going left-to-right and near right viewport edge, go left instead
78074                   tipX = viewport.left + origin[0] - 4 - tooltipWidth;
78075               } else if (tipX < viewport.left) {
78076                   // tip is going right-to-left and near left viewport edge, go right instead
78077                   tipX = viewport.left + origin[0] + menuSideMargin + menuWidth;
78078               }
78079
78080               tipY = viewport.top + origin[1] + (i * buttonHeight);
78081               if (tipY + tooltipHeight > viewport.bottom) {
78082                   // tip is near bottom viewport edge, shift upwards
78083                   tipY -= tipY + tooltipHeight - viewport.bottom;
78084               }
78085
78086               tooltip
78087                   .style('left', tipX + 'px')
78088                   .style('top', tipY + 'px')
78089                   .style('display', 'block')
78090                   .html(uiTooltipHtml(d.tooltip(), d.keys[0], d.title));
78091           }
78092
78093           function mouseout() {
78094               tooltip.style('display', 'none');
78095           }
78096       };
78097
78098
78099       editMenu.close = function () {
78100           if (menu) {
78101               menu
78102                   .style('pointer-events', 'none')
78103                   .transition()
78104                   .attr('opacity', 0)
78105                   .remove();
78106           }
78107
78108           if (tooltip) {
78109               tooltip.remove();
78110           }
78111       };
78112
78113
78114       editMenu.center = function (_) {
78115           if (!arguments.length) return center;
78116           center = _;
78117           return editMenu;
78118       };
78119
78120
78121       return editMenu;
78122   }
78123
78124   function uiPresetIcon() {
78125       var preset, geometry;
78126
78127
78128       function presetIcon(selection$$1) {
78129           selection$$1.each(render);
78130       }
78131
78132
78133       function getIcon(p, geom) {
78134           if (p.icon)
78135               return p.icon;
78136           else if (geom === 'line')
78137               return 'iD-other-line';
78138           else if (geom === 'vertex')
78139               return p.isFallback() ? '' : 'temaki-vertex';
78140           else
78141               return 'maki-marker-stroked';
78142       }
78143
78144
78145       function render() {
78146           var selection$$1 = select(this);
78147           var p = preset.apply(this, arguments);
78148           var geom = geometry.apply(this, arguments);
78149           var picon = getIcon(p, geom);
78150           var isMaki = /^maki-/.test(picon);
78151           var isTemaki = /^temaki-/.test(picon);
78152           var isFa = /^fa[srb]-/.test(picon);
78153           var isPOI = isMaki || isTemaki || isFa;
78154           var isFramed = (geom === 'area' || geom === 'vertex');
78155
78156
78157           function tag_classes(p) {
78158               var s = '';
78159               for (var i in p.tags) {
78160                   s += ' tag-' + i;
78161                   if (p.tags[i] !== '*') {
78162                       s += ' tag-' + i + '-' + p.tags[i];
78163                   }
78164               }
78165               return s;
78166           }
78167
78168
78169           var fill = selection$$1.selectAll('.preset-icon-fill')
78170               .data([0]);
78171
78172           fill = fill.enter()
78173               .append('div')
78174               .merge(fill);
78175
78176           fill
78177               .attr('class', function() {
78178                   return 'preset-icon-fill preset-icon-fill-' + geom + tag_classes(p);
78179               });
78180
78181
78182           var areaFrame = selection$$1.selectAll('.preset-icon-frame')
78183               .data((geom === 'area') ? [0] : []);
78184
78185           areaFrame.exit()
78186               .remove();
78187
78188           areaFrame = areaFrame.enter()
78189               .append('div')
78190               .attr('class', 'preset-icon-frame')
78191               .call(svgIcon('#iD-preset-icon-frame'));
78192
78193
78194           var icon = selection$$1.selectAll('.preset-icon')
78195               .data([0]);
78196
78197           icon = icon.enter()
78198               .append('div')
78199               .attr('class', 'preset-icon')
78200               .call(svgIcon(''))
78201               .merge(icon);
78202
78203           icon
78204               .attr('class', 'preset-icon preset-icon-' +
78205                   (isPOI ? (isFramed ? '24' : '28') : (isFramed ? '44' : '60'))
78206               );
78207
78208           icon.selectAll('svg')
78209               .attr('class', function() {
78210                   return 'icon ' + picon + (isPOI ? '' : tag_classes(p));
78211               });
78212
78213           icon.selectAll('use')
78214               .attr('href', '#' + picon + (isMaki ? '-15' : ''));
78215       }
78216
78217
78218       presetIcon.preset = function(_) {
78219           if (!arguments.length) return preset;
78220           preset = utilFunctor(_);
78221           return presetIcon;
78222       };
78223
78224
78225       presetIcon.geometry = function(_) {
78226           if (!arguments.length) return geometry;
78227           geometry = utilFunctor(_);
78228           return presetIcon;
78229       };
78230
78231       return presetIcon;
78232   }
78233
78234   function uiRawMemberEditor(context) {
78235       var taginfo = services.taginfo;
78236       var _entityID;
78237
78238       function downloadMember(d) {
78239           event.preventDefault();
78240
78241           // display the loading indicator
78242           select(this.parentNode).classed('tag-reference-loading', true);
78243           context.loadEntity(d.id);
78244       }
78245
78246       function zoomToMember(d) {
78247           event.preventDefault();
78248
78249           var entity = context.entity(d.id);
78250           context.map().zoomTo(entity);
78251
78252           // highlight the feature in case it wasn't previously on-screen
78253           utilHighlightEntity(d.id, true, context);
78254       }
78255
78256
78257       function selectMember(d) {
78258           event.preventDefault();
78259
78260           // remove the hover-highlight styling
78261           utilHighlightEntity(d.id, false, context);
78262
78263           var entity = context.entity(d.id);
78264           var mapExtent = context.map().extent();
78265           if (!entity.intersects(mapExtent, context.graph())) {
78266               // zoom to the entity if its extent is not visible now
78267               context.map().zoomTo(entity);
78268           }
78269
78270           context.enter(modeSelect(context, [d.id]));
78271       }
78272
78273
78274       function changeRole(d) {
78275           var role = select(this).property('value');
78276           var member = { id: d.id, type: d.type, role: role };
78277           context.perform(
78278               actionChangeMember(d.relation.id, member, d.index),
78279               t('operations.change_role.annotation')
78280           );
78281       }
78282
78283
78284       function deleteMember(d) {
78285           context.perform(
78286               actionDeleteMember(d.relation.id, d.index),
78287               t('operations.delete_member.annotation')
78288           );
78289
78290           if (!context.hasEntity(d.relation.id)) {
78291               context.enter(modeBrowse(context));
78292           }
78293       }
78294
78295
78296       function rawMemberEditor(selection$$1) {
78297           var entity = context.entity(_entityID);
78298           var memberships = [];
78299
78300           entity.members.slice(0, 1000).forEach(function(member, index) {
78301               memberships.push({
78302                   index: index,
78303                   id: member.id,
78304                   type: member.type,
78305                   role: member.role,
78306                   relation: entity,
78307                   member: context.hasEntity(member.id)
78308               });
78309           });
78310
78311           var gt = entity.members.length > 1000 ? '>' : '';
78312           selection$$1.call(uiDisclosure(context, 'raw_member_editor', true)
78313               .title(t('inspector.all_members') + ' (' + gt + memberships.length + ')')
78314               .expanded(true)
78315               .updatePreference(false)
78316               .on('toggled', function(expanded) {
78317                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
78318               })
78319               .content(content)
78320           );
78321
78322
78323           function content(selection$$1) {
78324               var list = selection$$1.selectAll('.member-list')
78325                   .data([0]);
78326
78327               list = list.enter()
78328                   .append('ul')
78329                   .attr('class', 'member-list')
78330                   .merge(list);
78331
78332
78333               var items = list.selectAll('li')
78334                   .data(memberships, function(d) {
78335                       return osmEntity$$1.key(d.relation) + ',' + d.index + ',' +
78336                           (d.member ? osmEntity$$1.key(d.member) : 'incomplete');
78337                   });
78338
78339               items.exit()
78340                   .each(unbind)
78341                   .remove();
78342
78343               var enter = items.enter()
78344                   .append('li')
78345                   .attr('class', 'member-row form-field')
78346                   .classed('member-incomplete', function(d) { return !d.member; });
78347
78348               enter
78349                   .each(function(d) {
78350                       if (d.member) {
78351
78352                           // highlight the member feature in the map while hovering on the list item
78353                           select(this).on('mouseover', function() {
78354                               utilHighlightEntity(d.id, true, context);
78355                           });
78356                           select(this).on('mouseout', function() {
78357                               utilHighlightEntity(d.id, false, context);
78358                           });
78359
78360                           var label = select(this)
78361                               .append('label')
78362                               .attr('class', 'form-field-label');
78363
78364                           var labelLink = label
78365                               .append('span')
78366                               .attr('class', 'label-text')
78367                               .append('a')
78368                               .attr('href', '#')
78369                               .on('click', selectMember);
78370
78371                           labelLink
78372                               .append('span')
78373                               .attr('class', 'member-entity-type')
78374                               .text(function(d) {
78375                                   var matched = context.presets().match(d.member, context.graph());
78376                                   return (matched && matched.name()) || utilDisplayType(d.member.id);
78377                               });
78378
78379                           labelLink
78380                               .append('span')
78381                               .attr('class', 'member-entity-name')
78382                               .text(function(d) { return utilDisplayName(d.member); });
78383
78384                           label
78385                               .append('button')
78386                               .attr('class', 'download-icon')
78387                               .attr('title', t('icons.zoom_to'))
78388                               .attr('tabindex', -1)
78389                               .call(svgIcon('#iD-icon-geolocate'))
78390                               .on('click', zoomToMember);
78391
78392                       } else {
78393                           var incompleteLabel = select(this)
78394                               .append('label')
78395                               .attr('class', 'form-field-label');
78396
78397                           var labelText = incompleteLabel
78398                               .append('span')
78399                               .attr('class', 'label-text');
78400
78401                           labelText
78402                               .append('span')
78403                               .attr('class', 'member-entity-type')
78404                               .text(t('inspector.'+d.type, { id: d.id }));
78405
78406                           labelText
78407                               .append('span')
78408                               .attr('class', 'member-entity-name')
78409                               .text(t('inspector.incomplete', { id: d.id }));
78410
78411                           incompleteLabel
78412                               .append('button')
78413                               .attr('class', 'download-icon')
78414                               .attr('title', t('icons.download'))
78415                               .attr('tabindex', -1)
78416                               .call(svgIcon('#iD-icon-load'))
78417                               .on('click', downloadMember);
78418                       }
78419                   });
78420
78421               var wrapEnter = enter
78422                   .append('div')
78423                   .attr('class', 'form-field-input-wrap form-field-input-member');
78424
78425               wrapEnter
78426                   .append('input')
78427                   .attr('class', 'member-role')
78428                   .property('type', 'text')
78429                   .attr('maxlength', 255)
78430                   .attr('placeholder', t('inspector.role'))
78431                   .call(utilNoAuto)
78432                   .property('value', function(d) { return d.role; })
78433                   .on('change', changeRole);
78434
78435               wrapEnter
78436                   .append('button')
78437                   .attr('tabindex', -1)
78438                   .attr('title', t('icons.remove'))
78439                   .attr('class', 'remove form-field-button member-delete')
78440                   .on('click', deleteMember)
78441                   .call(svgIcon('#iD-operation-delete'));
78442
78443               if (taginfo) {
78444                   wrapEnter.each(bindTypeahead);
78445               }
78446
78447
78448               function bindTypeahead(d) {
78449                   var row = select(this);
78450                   var role = row.selectAll('input.member-role');
78451
78452                   function sort(value, data) {
78453                       var sameletter = [];
78454                       var other = [];
78455                       for (var i = 0; i < data.length; i++) {
78456                           if (data[i].value.substring(0, value.length) === value) {
78457                               sameletter.push(data[i]);
78458                           } else {
78459                               other.push(data[i]);
78460                           }
78461                       }
78462                       return sameletter.concat(other);
78463                   }
78464
78465                   role.call(d3combobox()
78466                       .container(context.container())
78467                       .fetcher(function(role, callback) {
78468                           var rtype = entity.tags.type;
78469                           taginfo.roles({
78470                               debounce: true,
78471                               rtype: rtype || '',
78472                               geometry: context.geometry(d.member.id),
78473                               query: role
78474                           }, function(err, data) {
78475                               if (!err) callback(sort(role, data));
78476                           });
78477                       }));
78478               }
78479
78480
78481               function unbind() {
78482                   var row = select(this);
78483
78484                   row.selectAll('input.member-role')
78485                       .call(d3combobox.off);
78486               }
78487           }
78488       }
78489
78490
78491       rawMemberEditor.entityID = function(_) {
78492           if (!arguments.length) return _entityID;
78493           _entityID = _;
78494           return rawMemberEditor;
78495       };
78496
78497
78498       return rawMemberEditor;
78499   }
78500
78501   function uiRawMembershipEditor(context) {
78502       var taginfo = services.taginfo;
78503       var _entityID;
78504       var _showBlank;
78505
78506
78507       function selectRelation(d) {
78508           event.preventDefault();
78509
78510           // remove the hover-highlight styling
78511           utilHighlightEntity(d.relation.id, false, context);
78512
78513           context.enter(modeSelect(context, [d.relation.id]));
78514       }
78515
78516
78517       function changeRole(d) {
78518           var role = select(this).property('value');
78519           context.perform(
78520               actionChangeMember(d.relation.id, assignIn({}, d.member, { role: role }), d.index),
78521               t('operations.change_role.annotation')
78522           );
78523       }
78524
78525
78526       function addMembership(d, role) {
78527           _showBlank = false;
78528
78529           var member = { id: _entityID, type: context.entity(_entityID).type, role: role };
78530
78531           if (d.relation) {
78532               context.perform(
78533                   actionAddMember(d.relation.id, member),
78534                   t('operations.add_member.annotation')
78535               );
78536
78537           } else {
78538               var relation = osmRelation();
78539               context.perform(
78540                   actionAddEntity(relation),
78541                   actionAddMember(relation.id, member),
78542                   t('operations.add.annotation.relation')
78543               );
78544
78545               context.enter(modeSelect(context, [relation.id]));
78546           }
78547       }
78548
78549
78550       function deleteMembership(d) {
78551           context.perform(
78552               actionDeleteMember(d.relation.id, d.index),
78553               t('operations.delete_member.annotation')
78554           );
78555       }
78556
78557
78558       function relations(q) {
78559           var newRelation = { relation: null, value: t('inspector.new_relation') };
78560           var result = [];
78561           var graph = context.graph();
78562
78563           context.intersects(context.extent()).forEach(function(entity) {
78564               if (entity.type !== 'relation' || entity.id === _entityID) return;
78565
78566               var matched = context.presets().match(entity, graph);
78567               var presetName = (matched && matched.name()) || t('inspector.relation');
78568               var entityName = utilDisplayName(entity) || '';
78569
78570               var value = presetName + ' ' + entityName;
78571               if (q && value.toLowerCase().indexOf(q.toLowerCase()) === -1) return;
78572
78573               result.push({ relation: entity, value: value });
78574           });
78575
78576           result.sort(function(a, b) {
78577               return osmRelation.creationOrder(a.relation, b.relation);
78578           });
78579
78580           // Dedupe identical names by appending relation id - see #2891
78581           var dupeGroups = filter(
78582               groupBy(result, 'value'),
78583               function(v) { return v.length > 1; }
78584           );
78585
78586           dupeGroups.forEach(function(group) {
78587               group.forEach(function(obj) {
78588                   obj.value += ' ' + obj.relation.id;
78589               });
78590           });
78591
78592           result.forEach(function(obj) {
78593               obj.title = obj.value;
78594           });
78595
78596           result.unshift(newRelation);
78597           return result;
78598       }
78599
78600
78601       function rawMembershipEditor(selection$$1) {
78602           var entity = context.entity(_entityID);
78603           var parents = context.graph().parentRelations(entity);
78604           var memberships = [];
78605
78606           parents.slice(0, 1000).forEach(function(relation) {
78607               relation.members.forEach(function(member, index) {
78608                   if (member.id === entity.id) {
78609                       memberships.push({ relation: relation, member: member, index: index });
78610                   }
78611               });
78612           });
78613
78614           var gt = parents.length > 1000 ? '>' : '';
78615           selection$$1.call(uiDisclosure(context, 'raw_membership_editor', true)
78616               .title(t('inspector.all_relations') + ' (' + gt + memberships.length + ')')
78617               .expanded(true)
78618               .updatePreference(false)
78619               .on('toggled', function(expanded) {
78620                   if (expanded) { selection$$1.node().parentNode.scrollTop += 200; }
78621               })
78622               .content(content)
78623           );
78624
78625
78626           function content(selection$$1) {
78627               var list = selection$$1.selectAll('.member-list')
78628                   .data([0]);
78629
78630               list = list.enter()
78631                   .append('ul')
78632                   .attr('class', 'member-list')
78633                   .merge(list);
78634
78635
78636               var items = list.selectAll('li.member-row-normal')
78637                   .data(memberships, function(d) {
78638                       return osmEntity$$1.key(d.relation) + ',' + d.index;
78639                   });
78640
78641               items.exit()
78642                   .each(unbind)
78643                   .remove();
78644
78645               var enter = items.enter()
78646                   .append('li')
78647                   .attr('class', 'member-row member-row-normal form-field');
78648
78649               enter.each(function(d){
78650                   // highlight the relation in the map while hovering on the list item
78651                   select(this).on('mouseover', function() {
78652                       utilHighlightEntity(d.relation.id, true, context);
78653                   });
78654                   select(this).on('mouseout', function() {
78655                       utilHighlightEntity(d.relation.id, false, context);
78656                   });
78657               });
78658
78659               var labelEnter = enter
78660                   .append('label')
78661                   .attr('class', 'form-field-label')
78662                   .append('span')
78663                   .attr('class', 'label-text')
78664                   .append('a')
78665                   .attr('href', '#')
78666                   .on('click', selectRelation);
78667
78668               labelEnter
78669                   .append('span')
78670                   .attr('class', 'member-entity-type')
78671                   .text(function(d) {
78672                       var matched = context.presets().match(d.relation, context.graph());
78673                       return (matched && matched.name()) || t('inspector.relation');
78674                   });
78675
78676               labelEnter
78677                   .append('span')
78678                   .attr('class', 'member-entity-name')
78679                   .text(function(d) { return utilDisplayName(d.relation); });
78680
78681               var wrapEnter = enter
78682                   .append('div')
78683                   .attr('class', 'form-field-input-wrap form-field-input-member');
78684
78685               wrapEnter
78686                   .append('input')
78687                   .attr('class', 'member-role')
78688                   .property('type', 'text')
78689                   .attr('maxlength', 255)
78690                   .attr('placeholder', t('inspector.role'))
78691                   .call(utilNoAuto)
78692                   .property('value', function(d) { return d.member.role; })
78693                   .on('change', changeRole);
78694
78695               wrapEnter
78696                   .append('button')
78697                   .attr('tabindex', -1)
78698                   .attr('class', 'remove form-field-button member-delete')
78699                   .on('click', deleteMembership)
78700                   .call(svgIcon('#iD-operation-delete'));
78701
78702               if (taginfo) {
78703                   wrapEnter.each(bindTypeahead);
78704               }
78705
78706
78707               var newrow = list.selectAll('.member-row-new')
78708                   .data(_showBlank ? [0] : []);
78709
78710               newrow.exit()
78711                   .remove();
78712
78713               enter = newrow.enter()
78714                   .append('li')
78715                   .attr('class', 'member-row member-row-new form-field');
78716
78717               enter
78718                   .append('input')
78719                   .attr('type', 'text')
78720                   .attr('class', 'member-entity-input')
78721                   .call(utilNoAuto);
78722
78723               enter
78724                   .append('input')
78725                   .attr('class', 'member-role')
78726                   .property('type', 'text')
78727                   .attr('maxlength', 255)
78728                   .attr('placeholder', t('inspector.role'))
78729                   .call(utilNoAuto)
78730                   .on('change', changeRole);
78731
78732               enter
78733                   .append('button')
78734                   .attr('tabindex', -1)
78735                   .attr('class', 'remove form-field-button member-delete')
78736                   .on('click', deleteMembership)
78737                   .call(svgIcon('#iD-operation-delete'));
78738
78739               newrow = newrow
78740                   .merge(enter);
78741
78742               newrow.selectAll('.member-entity-input')
78743                   .call(d3combobox()
78744                       .container(context.container())
78745                       .minItems(1)
78746                       .fetcher(function(value, callback) { callback(relations(value)); })
78747                       .on('accept', onAccept)
78748                   );
78749
78750
78751               var addrel = selection$$1.selectAll('.add-relation')
78752                   .data([0]);
78753
78754               addrel = addrel.enter()
78755                   .append('button')
78756                   .attr('class', 'add-relation')
78757                   .merge(addrel);
78758
78759               addrel
78760                   .call(svgIcon('#iD-icon-plus', 'light'))
78761                   .on('click', function() {
78762                       _showBlank = true;
78763                       content(selection$$1);
78764                       list.selectAll('.member-entity-input').node().focus();
78765                   });
78766
78767
78768               function onAccept(d) {
78769                   var role = list.selectAll('.member-row-new .member-role').property('value');
78770                   addMembership(d, role);
78771               }
78772
78773
78774               function bindTypeahead(d) {
78775                   var row = select(this);
78776                   var role = row.selectAll('input.member-role');
78777
78778                   function sort(value, data) {
78779                       var sameletter = [];
78780                       var other = [];
78781                       for (var i = 0; i < data.length; i++) {
78782                           if (data[i].value.substring(0, value.length) === value) {
78783                               sameletter.push(data[i]);
78784                           } else {
78785                               other.push(data[i]);
78786                           }
78787                       }
78788                       return sameletter.concat(other);
78789                   }
78790
78791                   role.call(d3combobox()
78792                       .container(context.container())
78793                       .fetcher(function(role, callback) {
78794                           var rtype = d.relation.tags.type;
78795                           taginfo.roles({
78796                               debounce: true,
78797                               rtype: rtype || '',
78798                               geometry: context.geometry(_entityID),
78799                               query: role
78800                           }, function(err, data) {
78801                               if (!err) callback(sort(role, data));
78802                           });
78803                       }));
78804               }
78805
78806
78807               function unbind() {
78808                   var row = select(this);
78809
78810                   row.selectAll('input.member-role')
78811                       .call(d3combobox.off);
78812               }
78813           }
78814       }
78815
78816
78817       rawMembershipEditor.entityID = function(_) {
78818           if (!arguments.length) return _entityID;
78819           _entityID = _;
78820           return rawMembershipEditor;
78821       };
78822
78823
78824       return rawMembershipEditor;
78825   }
78826
78827   function uiPresetEditor(context) {
78828       var dispatch$$1 = dispatch('change');
78829       var formFields = uiFormFields(context);
78830       var _state;
78831       var _fieldsArr;
78832       var _preset;
78833       var _tags;
78834       var _entityID;
78835
78836
78837       function presetEditor(selection$$1) {
78838           selection$$1.call(uiDisclosure(context, 'preset_fields', true)
78839               .title(t('inspector.all_fields'))
78840               .content(render)
78841           );
78842       }
78843
78844
78845       function render(selection$$1) {
78846           if (!_fieldsArr) {
78847               var entity = context.entity(_entityID);
78848               var geometry = context.geometry(_entityID);
78849               var presets = context.presets();
78850
78851               _fieldsArr = [];
78852
78853               _preset.fields.forEach(function(field) {
78854                   if (field.matchGeometry(geometry)) {
78855                       _fieldsArr.push(
78856                           uiField(context, field, entity)
78857                       );
78858                   }
78859               });
78860
78861               if (entity.isHighwayIntersection(context.graph()) && presets.field('restrictions')) {
78862                   _fieldsArr.push(
78863                       uiField(context, presets.field('restrictions'), entity)
78864                   );
78865               }
78866
78867               presets.universal().forEach(function(field) {
78868                   if (_preset.fields.indexOf(field) === -1) {
78869                       _fieldsArr.push(
78870                           uiField(context, field, entity, { show: false })
78871                       );
78872                   }
78873               });
78874
78875               _fieldsArr.forEach(function(field) {
78876                   field
78877                       .on('change', function(t$$1, onInput) {
78878                           dispatch$$1.call('change', field, t$$1, onInput);
78879                       });
78880               });
78881           }
78882
78883           _fieldsArr.forEach(function(field) {
78884               field
78885                   .state(_state)
78886                   .tags(_tags);
78887           });
78888
78889
78890           selection$$1
78891               .call(formFields.fieldsArr(_fieldsArr), 'inspector-inner fillL3');
78892
78893
78894           selection$$1.selectAll('.wrap-form-field input')
78895               .on('keydown', function() {
78896                   // if user presses enter, and combobox is not active, accept edits..
78897                   if (event.keyCode === 13 && select('.combobox').empty()) {
78898                       context.enter(modeBrowse(context));
78899                   }
78900               });
78901       }
78902
78903
78904       presetEditor.preset = function(val) {
78905           if (!arguments.length) return _preset;
78906           if (_preset && _preset.id === val.id) return presetEditor;
78907           _preset = val;
78908           _fieldsArr = null;
78909           return presetEditor;
78910       };
78911
78912
78913       presetEditor.state = function(val) {
78914           if (!arguments.length) return _state;
78915           _state = val;
78916           return presetEditor;
78917       };
78918
78919
78920       presetEditor.tags = function(val) {
78921           if (!arguments.length) return _tags;
78922           _tags = val;
78923           // Don't reset _fieldsArr here.
78924           return presetEditor;
78925       };
78926
78927
78928       presetEditor.entityID = function(val) {
78929           if (!arguments.length) return _entityID;
78930           if (_entityID === val) return presetEditor;
78931           _entityID = val;
78932           _fieldsArr = null;
78933           return presetEditor;
78934       };
78935
78936
78937       return utilRebind(presetEditor, dispatch$$1, 'on');
78938   }
78939
78940   function uiEntityEditor(context) {
78941       var dispatch$$1 = dispatch('choose');
78942       var _state = 'select';
78943       var _coalesceChanges = false;
78944       var _modified = false;
78945       var _base;
78946       var _entityID;
78947       var _activePreset;
78948       var _tagReference;
78949
78950       var presetEditor = uiPresetEditor(context)
78951           .on('change', changeTags);
78952       var rawTagEditor = uiRawTagEditor(context)
78953           .on('change', changeTags);
78954
78955
78956       function entityEditor(selection$$1) {
78957           var entity = context.entity(_entityID);
78958           var tags = clone(entity.tags);
78959
78960           // Header
78961           var header = selection$$1.selectAll('.header')
78962               .data([0]);
78963
78964           // Enter
78965           var enter = header.enter()
78966               .append('div')
78967               .attr('class', 'header fillL cf');
78968
78969           enter
78970               .append('button')
78971               .attr('class', 'fl preset-reset preset-choose')
78972               .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-forward' : '#iD-icon-backward'));
78973
78974           enter
78975               .append('button')
78976               .attr('class', 'fr preset-close')
78977               .on('click', function() { context.enter(modeBrowse(context)); })
78978               .call(svgIcon(_modified ? '#iD-icon-apply' : '#iD-icon-close'));
78979
78980           enter
78981               .append('h3')
78982               .text(t('inspector.edit'));
78983
78984           // Update
78985           header = header
78986               .merge(enter);
78987
78988           header.selectAll('.preset-reset')
78989               .on('click', function() {
78990                   dispatch$$1.call('choose', this, _activePreset);
78991               });
78992
78993
78994           // Body
78995           var body = selection$$1.selectAll('.inspector-body')
78996               .data([0]);
78997
78998           // Enter
78999           enter = body.enter()
79000               .append('div')
79001               .attr('class', 'inspector-body');
79002
79003           enter
79004               .append('div')
79005               .attr('class', 'preset-list-item inspector-inner')
79006               .append('div')
79007               .attr('class', 'preset-list-button-wrap')
79008               .append('button')
79009               .attr('class', 'preset-list-button preset-reset')
79010               .call(tooltip().title(t('inspector.back_tooltip')).placement('bottom'))
79011               .append('div')
79012               .attr('class', 'label')
79013               .append('div')
79014               .attr('class', 'label-inner');
79015
79016           enter
79017               .append('div')
79018               .attr('class', 'inspector-border preset-editor');
79019
79020           enter
79021               .append('div')
79022               .attr('class', 'inspector-border raw-tag-editor inspector-inner');
79023
79024           enter
79025               .append('div')
79026               .attr('class', 'inspector-border raw-member-editor inspector-inner');
79027
79028           enter
79029               .append('div')
79030               .attr('class', 'raw-membership-editor inspector-inner');
79031
79032           enter
79033               .append('input')
79034               .attr('type', 'text')
79035               .attr('class', 'key-trap');
79036
79037
79038           // Update
79039           body = body
79040               .merge(enter);
79041
79042           if (_tagReference) {
79043               body.selectAll('.preset-list-button-wrap')
79044                   .call(_tagReference.button);
79045
79046               body.selectAll('.preset-list-item')
79047                   .call(_tagReference.body);
79048           }
79049
79050           body.selectAll('.preset-reset')
79051               .on('click', function() {
79052                   dispatch$$1.call('choose', this, _activePreset);
79053               });
79054
79055           body.select('.preset-list-item button')
79056               .call(uiPresetIcon()
79057                   .geometry(context.geometry(_entityID))
79058                   .preset(_activePreset)
79059               );
79060
79061
79062           var label = body.select('.label-inner');
79063           var nameparts = label.selectAll('.namepart')
79064               .data(_activePreset.name().split(' - '), function(d) { return d; });
79065
79066           nameparts.exit()
79067               .remove();
79068
79069           nameparts
79070               .enter()
79071               .append('div')
79072               .attr('class', 'namepart')
79073               .text(function(d) { return d; });
79074
79075
79076           body.select('.preset-editor')
79077               .call(presetEditor
79078                   .preset(_activePreset)
79079                   .entityID(_entityID)
79080                   .tags(tags)
79081                   .state(_state)
79082               );
79083
79084           body.select('.raw-tag-editor')
79085               .call(rawTagEditor
79086                   .preset(_activePreset)
79087                   .entityID(_entityID)
79088                   .tags(tags)
79089                   .state(_state)
79090               );
79091
79092           if (entity.type === 'relation') {
79093               body.select('.raw-member-editor')
79094                   .style('display', 'block')
79095                   .call(uiRawMemberEditor(context)
79096                       .entityID(_entityID)
79097                   );
79098           } else {
79099               body.select('.raw-member-editor')
79100                   .style('display', 'none');
79101           }
79102
79103           body.select('.raw-membership-editor')
79104               .call(uiRawMembershipEditor(context)
79105                   .entityID(_entityID)
79106               );
79107
79108           body.select('.key-trap')
79109               .on('keydown.key-trap', function() {
79110                   // On tabbing, send focus back to the first field on the inspector-body
79111                   // (probably the `name` field) #4159
79112                   if (event.keyCode === 9 && !event.shiftKey) {
79113                       event.preventDefault();
79114                       body.select('input').node().focus();
79115                   }
79116               });
79117
79118           context.history()
79119               .on('change.entity-editor', historyChanged);
79120
79121
79122           function historyChanged() {
79123               if (_state === 'hide') return;
79124
79125               var entity = context.hasEntity(_entityID);
79126               var graph = context.graph();
79127               if (!entity) return;
79128
79129               var match = context.presets().match(entity, graph);
79130               var activePreset = entityEditor.preset();
79131               var weakPreset = activePreset && isEmpty(activePreset.addTags);
79132
79133               // A "weak" preset doesn't set any tags. (e.g. "Address")
79134               // Don't replace a weak preset with a fallback preset (e.g. "Point")
79135               if (!(weakPreset && match.isFallback())) {
79136                   entityEditor.preset(match);
79137               }
79138               entityEditor.modified(_base !== graph);
79139               entityEditor(selection$$1);
79140           }
79141       }
79142
79143
79144       // Tag changes that fire on input can all get coalesced into a single
79145       // history operation when the user leaves the field.  #2342
79146       function changeTags(changed, onInput) {
79147           var entity = context.entity(_entityID);
79148           var annotation = t('operations.change_tags.annotation');
79149           var tags = clone(entity.tags);
79150
79151           for (var k in changed) {
79152               if (!k) continue;
79153               var v = changed[k];
79154               if (v !== undefined || tags.hasOwnProperty(k)) {
79155                   tags[k] = v;
79156               }
79157           }
79158
79159           if (!onInput) {
79160               tags = utilCleanTags(tags);
79161           }
79162
79163           if (!isEqual(entity.tags, tags)) {
79164               if (_coalesceChanges) {
79165                   context.overwrite(actionChangeTags(_entityID, tags), annotation);
79166               } else {
79167                   context.perform(actionChangeTags(_entityID, tags), annotation);
79168                   _coalesceChanges = !!onInput;
79169               }
79170           }
79171       }
79172
79173
79174       entityEditor.modified = function(_) {
79175           if (!arguments.length) return _modified;
79176           _modified = _;
79177           d3_selectAll('button.preset-close use')
79178               .attr('xlink:href', (_modified ? '#iD-icon-apply' : '#iD-icon-close'));
79179           return entityEditor;
79180       };
79181
79182
79183       entityEditor.state = function(_) {
79184           if (!arguments.length) return _state;
79185           _state = _;
79186           return entityEditor;
79187       };
79188
79189
79190       entityEditor.entityID = function(_) {
79191           if (!arguments.length) return _entityID;
79192           _entityID = _;
79193           _base = context.graph();
79194           _coalesceChanges = false;
79195
79196           // reset the scroll to the top of the inspector
79197           var body = d3_selectAll('.entity-editor-pane .inspector-body');
79198           if (!body.empty()) {
79199               body.node().scrollTop = 0;
79200           }
79201
79202           var presetMatch = context.presets().match(context.entity(_entityID), _base);
79203
79204           return entityEditor
79205               .preset(presetMatch)
79206               .modified(false);
79207       };
79208
79209
79210       entityEditor.preset = function(_) {
79211           if (!arguments.length) return _activePreset;
79212           if (_ !== _activePreset) {
79213               _activePreset = _;
79214               _tagReference = uiTagReference(_activePreset.reference(context.geometry(_entityID)), context)
79215                   .showing(false);
79216           }
79217           return entityEditor;
79218       };
79219
79220
79221       return utilRebind(entityEditor, dispatch$$1, 'on');
79222   }
79223
79224   var pair_1 = pair$1;
79225
79226   function search(x, dims, r) {
79227     if (!dims) dims = 'NSEW';
79228     if (typeof x !== 'string') return { val: null, regex: r };
79229
79230     r = r || /[\s\,]*([NSEW])?\s*([\-|\—|\―]?[0-9.]+)°?\s*(?:([0-9.]+)['’′‘]\s*)?(?:([0-9.]+)(?:''|"|”|″)\s*)?([NSEW])?/gi;
79231
79232     var m = r.exec(x);
79233     if (!m) return { val: null, regex: r };
79234
79235     var dim = m[1] || m[5];
79236     if (dim && dims.indexOf(dim) === -1) return { val: null, regex: r };
79237
79238     return {
79239       val: (((m[2]) ? parseFloat(m[2]) : 0) +
79240             ((m[3] ? parseFloat(m[3]) / 60 : 0)) +
79241             ((m[4] ? parseFloat(m[4]) / 3600 : 0))) *
79242             ((dim === 'S' || dim === 'W') ? -1 : 1),
79243       regex: r,
79244       raw: m[0],
79245       dim: dim
79246     };
79247   }
79248
79249   function pair$1(x, dims) {
79250     x = x.trim();
79251     var one = search(x, dims);
79252     if (one.val === null) return null;
79253     var two = search(x, dims, one.regex);
79254     if (two.val === null) return null;
79255     // null if one/two are not contiguous.
79256     if (one.raw + two.raw !== x) return null;
79257     if (one.dim) {
79258       return swapdim(one.val, two.val, one.dim);
79259     } else {
79260       return [one.val, two.val];
79261     }
79262   }
79263
79264   function swapdim(a, b, dim) {
79265     if (dim === 'N' || dim === 'S') return [a, b];
79266     if (dim === 'W' || dim === 'E') return [b, a];
79267   }
79268
79269   function uiFeatureList(context) {
79270       var _geocodeResults;
79271
79272
79273       function featureList(selection$$1) {
79274           var header = selection$$1
79275               .append('div')
79276               .attr('class', 'header fillL cf');
79277
79278           header
79279               .append('h3')
79280               .text(t('inspector.feature_list'));
79281
79282           var searchWrap = selection$$1
79283               .append('div')
79284               .attr('class', 'search-header');
79285
79286           var search = searchWrap
79287               .append('input')
79288               .attr('placeholder', t('inspector.search'))
79289               .attr('type', 'search')
79290               .call(utilNoAuto)
79291               .on('keypress', keypress)
79292               .on('keydown', keydown)
79293               .on('input', inputevent);
79294
79295           searchWrap
79296               .call(svgIcon('#iD-icon-search', 'pre-text'));
79297
79298           var listWrap = selection$$1
79299               .append('div')
79300               .attr('class', 'inspector-body');
79301
79302           var list = listWrap
79303               .append('div')
79304               .attr('class', 'feature-list cf');
79305
79306           context
79307               .on('exit.feature-list', clearSearch);
79308           context.map()
79309               .on('drawn.feature-list', mapDrawn);
79310
79311           context.keybinding()
79312               .on(uiCmd('⌘F'), focusSearch);
79313
79314
79315           function focusSearch() {
79316               var mode = context.mode() && context.mode().id;
79317               if (mode !== 'browse') return;
79318
79319               event.preventDefault();
79320               search.node().focus();
79321           }
79322
79323
79324           function keydown() {
79325               if (event.keyCode === 27) {  // escape
79326                   search.node().blur();
79327               }
79328           }
79329
79330
79331           function keypress() {
79332               var q = search.property('value'),
79333                   items = list.selectAll('.feature-list-item');
79334               if (event.keyCode === 13 && q.length && items.size()) {  // return
79335                   click(items.datum());
79336               }
79337           }
79338
79339
79340           function inputevent() {
79341               _geocodeResults = undefined;
79342               drawList();
79343           }
79344
79345
79346           function clearSearch() {
79347               search.property('value', '');
79348               drawList();
79349           }
79350
79351
79352           function mapDrawn(e) {
79353               if (e.full) {
79354                   drawList();
79355               }
79356           }
79357
79358
79359           function features() {
79360               var entities = {};
79361               var result = [];
79362               var graph = context.graph();
79363               var q = search.property('value').toLowerCase();
79364
79365               if (!q) return result;
79366
79367               var idMatch = q.match(/^([nwr])([0-9]+)$/);
79368
79369               if (idMatch) {
79370                   result.push({
79371                       id: idMatch[0],
79372                       geometry: idMatch[1] === 'n' ? 'point' : idMatch[1] === 'w' ? 'line' : 'relation',
79373                       type: idMatch[1] === 'n' ? t('inspector.node') : idMatch[1] === 'w' ? t('inspector.way') : t('inspector.relation'),
79374                       name: idMatch[2]
79375                   });
79376               }
79377
79378               var locationMatch = pair_1(q.toUpperCase()) || q.match(/^(-?\d+\.?\d*)\s+(-?\d+\.?\d*)$/);
79379
79380               if (locationMatch) {
79381                   var loc = [parseFloat(locationMatch[0]), parseFloat(locationMatch[1])];
79382                   result.push({
79383                       id: -1,
79384                       geometry: 'point',
79385                       type: t('inspector.location'),
79386                       name: dmsCoordinatePair([loc[1], loc[0]]),
79387                       location: loc
79388                   });
79389               }
79390
79391               function addEntity(entity) {
79392                   if (entity.id in entities || result.length > 200)
79393                       return;
79394
79395                   entities[entity.id] = true;
79396
79397                   var name = utilDisplayName(entity) || '';
79398                   if (name.toLowerCase().indexOf(q) >= 0) {
79399                       var matched = context.presets().match(entity, graph);
79400                       var type = (matched && matched.name()) || utilDisplayType(entity.id);
79401
79402                       result.push({
79403                           id: entity.id,
79404                           entity: entity,
79405                           geometry: context.geometry(entity.id),
79406                           type: type,
79407                           name: name
79408                       });
79409                   }
79410
79411                   graph.parentRelations(entity).forEach(function(parent) {
79412                       addEntity(parent);
79413                   });
79414               }
79415
79416               var visible = context.surface().selectAll('.point, .line, .area').nodes();
79417               for (var i = 0; i < visible.length && result.length <= 200; i++) {
79418                   var datum = visible[i].__data__;
79419                   var entity = datum && datum.properties && datum.properties.entity;
79420                   if (entity) { addEntity(entity); }
79421               }
79422
79423               (_geocodeResults || []).forEach(function(d) {
79424                   if (d.osm_type && d.osm_id) {    // some results may be missing these - #1890
79425
79426                       // Make a temporary osmEntity so we can preset match
79427                       // and better localize the search result - #4725
79428                       var id = osmEntity$$1.id.fromOSM(d.osm_type, d.osm_id);
79429                       var tags = {};
79430                       tags[d.class] = d.type;
79431
79432                       var attrs = { id: id, type: d.osm_type, tags: tags };
79433                       if (d.osm_type === 'way') {   // for ways, add some fake closed nodes
79434                           attrs.nodes = ['a','a'];  // so that geometry area is possible
79435                       }
79436
79437                       var tempEntity = osmEntity$$1(attrs);
79438                       var tempGraph = coreGraph$$1([tempEntity]);
79439                       var matched = context.presets().match(tempEntity, tempGraph);
79440                       var type = (matched && matched.name()) || utilDisplayType(id);
79441
79442                       result.push({
79443                           id: tempEntity.id,
79444                           geometry: tempEntity.geometry(tempGraph),
79445                           type: type,
79446                           name: d.display_name,
79447                           extent: new geoExtent$$1(
79448                               [parseFloat(d.boundingbox[3]), parseFloat(d.boundingbox[0])],
79449                               [parseFloat(d.boundingbox[2]), parseFloat(d.boundingbox[1])])
79450                       });
79451                   }
79452               });
79453
79454               return result;
79455           }
79456
79457
79458           function drawList() {
79459               var value = search.property('value');
79460               var results = features();
79461
79462               list.classed('filtered', value.length);
79463
79464               var noResultsWorldwide = _geocodeResults && _geocodeResults.length === 0;
79465
79466               var resultsIndicator = list.selectAll('.no-results-item')
79467                   .data([0])
79468                   .enter()
79469                   .append('button')
79470                   .property('disabled', true)
79471                   .attr('class', 'no-results-item')
79472                   .call(svgIcon('#iD-icon-alert', 'pre-text'));
79473
79474               resultsIndicator.append('span')
79475                   .attr('class', 'entity-name');
79476
79477               list.selectAll('.no-results-item .entity-name')
79478                   .text(noResultsWorldwide ? t('geocoder.no_results_worldwide') : t('geocoder.no_results_visible'));
79479
79480               if (services.geocoder) {
79481                 list.selectAll('.geocode-item')
79482                     .data([0])
79483                     .enter()
79484                     .append('button')
79485                     .attr('class', 'geocode-item')
79486                     .on('click', geocoderSearch)
79487                     .append('div')
79488                     .attr('class', 'label')
79489                     .append('span')
79490                     .attr('class', 'entity-name')
79491                     .text(t('geocoder.search'));
79492               }
79493
79494               list.selectAll('.no-results-item')
79495                   .style('display', (value.length && !results.length) ? 'block' : 'none');
79496
79497               list.selectAll('.geocode-item')
79498                   .style('display', (value && _geocodeResults === undefined) ? 'block' : 'none');
79499
79500               list.selectAll('.feature-list-item')
79501                   .data([-1])
79502                   .remove();
79503
79504               var items = list.selectAll('.feature-list-item')
79505                   .data(results, function(d) { return d.id; });
79506
79507               var enter = items.enter()
79508                   .insert('button', '.geocode-item')
79509                   .attr('class', 'feature-list-item')
79510                   .on('mouseover', mouseover)
79511                   .on('mouseout', mouseout)
79512                   .on('click', click);
79513
79514               var label = enter
79515                   .append('div')
79516                   .attr('class', 'label');
79517
79518               label
79519                   .each(function(d) {
79520                       select(this)
79521                           .call(svgIcon('#iD-icon-' + d.geometry, 'pre-text'));
79522                   });
79523
79524               label
79525                   .append('span')
79526                   .attr('class', 'entity-type')
79527                   .text(function(d) { return d.type; });
79528
79529               label
79530                   .append('span')
79531                   .attr('class', 'entity-name')
79532                   .text(function(d) { return d.name; });
79533
79534               enter
79535                   .style('opacity', 0)
79536                   .transition()
79537                   .style('opacity', 1);
79538
79539               items.order();
79540
79541               items.exit()
79542                   .remove();
79543           }
79544
79545
79546           function mouseover(d) {
79547               if (d.id === -1) return;
79548
79549               context.surface().selectAll(utilEntityOrMemberSelector([d.id], context.graph()))
79550                   .classed('hover', true);
79551           }
79552
79553
79554           function mouseout() {
79555               context.surface().selectAll('.hover')
79556                   .classed('hover', false);
79557           }
79558
79559
79560           function click(d) {
79561               event.preventDefault();
79562               if (d.location) {
79563                   context.map().centerZoom([d.location[1], d.location[0]], 19);
79564               }
79565               else if (d.entity) {
79566                   if (d.entity.type === 'node') {
79567                       context.map().center(d.entity.loc);
79568                   } else if (d.entity.type === 'way') {
79569                       var center = context.projection(context.map().center());
79570                       var edge = geoChooseEdge(context.childNodes(d.entity), center, context.projection);
79571                       context.map().center(edge.loc);
79572                   }
79573                   context.enter(modeSelect(context, [d.entity.id]));
79574               } else {
79575                   context.zoomToEntity(d.id);
79576               }
79577           }
79578
79579
79580           function geocoderSearch() {
79581               services.geocoder.search(search.property('value'), function (err, resp) {
79582                   _geocodeResults = resp || [];
79583                   drawList();
79584               });
79585           }
79586       }
79587
79588
79589       return featureList;
79590   }
79591
79592   var _flashTimer;
79593
79594
79595   function uiFlash() {
79596       var _duration = 2000;
79597       var _iconName = '#iD-icon-no';
79598       var _iconClass = 'disabled';
79599       var _text = '';
79600       var _textClass;
79601
79602
79603       function flash() {
79604           if (_flashTimer) {
79605               _flashTimer.stop();
79606           }
79607
79608           select('#footer-wrap')
79609               .attr('class', 'footer-hide');
79610           select('#flash-wrap')
79611               .attr('class', 'footer-show');
79612
79613           var content = select('#flash-wrap').selectAll('.flash-content')
79614               .data([0]);
79615
79616           // Enter
79617           var contentEnter = content.enter()
79618               .append('div')
79619               .attr('class', 'flash-content');
79620
79621           var iconEnter = contentEnter
79622               .append('svg')
79623               .attr('class', 'flash-icon')
79624               .append('g')
79625               .attr('transform', 'translate(10,10)');
79626
79627           iconEnter
79628               .append('circle')
79629               .attr('r', 9);
79630
79631           iconEnter
79632               .append('use')
79633               .attr('transform', 'translate(-7,-7)')
79634               .attr('width', '14')
79635               .attr('height', '14');
79636
79637           contentEnter
79638               .append('div')
79639               .attr('class', 'flash-text');
79640
79641
79642           // Update
79643           content = content
79644               .merge(contentEnter);
79645
79646           content
79647               .selectAll('.flash-icon')
79648               .attr('class', 'flash-icon ' + (_iconClass || ''));
79649
79650           content
79651               .selectAll('.flash-icon use')
79652               .attr('xlink:href', _iconName);
79653
79654           content
79655               .selectAll('.flash-text')
79656               .attr('class', 'flash-text ' + (_textClass || ''))
79657               .text(_text);
79658
79659
79660           _flashTimer = timeout$1(function() {
79661               _flashTimer = null;
79662               select('#footer-wrap')
79663                   .attr('class', 'footer-show');
79664               select('#flash-wrap')
79665                   .attr('class', 'footer-hide');
79666           }, _duration);
79667
79668           return content;
79669       }
79670
79671
79672       flash.duration = function(_) {
79673           if (!arguments.length) return _duration;
79674           _duration = _;
79675           return flash;
79676       };
79677
79678       flash.text = function(_) {
79679           if (!arguments.length) return _text;
79680           _text = _;
79681           return flash;
79682       };
79683
79684       flash.textClass = function(_) {
79685           if (!arguments.length) return _textClass;
79686           _textClass = _;
79687           return flash;
79688       };
79689
79690       flash.iconName = function(_) {
79691           if (!arguments.length) return _iconName;
79692           _iconName = _;
79693           return flash;
79694       };
79695
79696       flash.iconClass = function(_) {
79697           if (!arguments.length) return _iconClass;
79698           _iconClass = _;
79699           return flash;
79700       };
79701
79702       return flash;
79703   }
79704
79705   function uiPresetList(context) {
79706       var dispatch$$1 = dispatch('choose');
79707       var _entityID;
79708       var _currentPreset;
79709       var _autofocus = false;
79710
79711
79712       function presetList(selection$$1) {
79713           var entity = context.entity(_entityID);
79714           var geometry = context.geometry(_entityID);
79715
79716           // Treat entities on addr:interpolation lines as points, not vertices (#3241)
79717           if (geometry === 'vertex' && entity.isOnAddressLine(context.graph())) {
79718               geometry = 'point';
79719           }
79720
79721           var presets = context.presets().matchGeometry(geometry);
79722
79723           selection$$1.html('');
79724
79725           var messagewrap = selection$$1
79726               .append('div')
79727               .attr('class', 'header fillL cf');
79728
79729           var message = messagewrap
79730               .append('h3')
79731               .text(t('inspector.choose'));
79732
79733           if (context.entity(_entityID).isUsed(context.graph())) {
79734               messagewrap
79735                   .append('button')
79736                   .attr('class', 'preset-choose')
79737                   .on('click', function() { dispatch$$1.call('choose', this, _currentPreset); })
79738                   .call(svgIcon((textDirection === 'rtl') ? '#iD-icon-backward' : '#iD-icon-forward'));
79739           } else {
79740               messagewrap
79741                   .append('button')
79742                   .attr('class', 'close')
79743                   .on('click', function() {
79744                       context.enter(modeBrowse(context));
79745                   })
79746                   .call(svgIcon('#iD-icon-close'));
79747           }
79748
79749           function initialKeydown() {
79750               // hack to let delete shortcut work when search is autofocused
79751               if (search.property('value').length === 0 &&
79752                   (event.keyCode === utilKeybinding.keyCodes['⌫'] ||
79753                    event.keyCode === utilKeybinding.keyCodes['⌦'])) {
79754                   event.preventDefault();
79755                   event.stopPropagation();
79756                   operationDelete([_entityID], context)();
79757
79758               // hack to let undo work when search is autofocused
79759               } else if (search.property('value').length === 0 &&
79760                   (event.ctrlKey || event.metaKey) &&
79761                   event.keyCode === utilKeybinding.keyCodes.z) {
79762                   event.preventDefault();
79763                   event.stopPropagation();
79764                   context.undo();
79765               } else if (!event.ctrlKey && !event.metaKey) {
79766                   // don't check for delete/undo hack on future keydown events
79767                   select(this).on('keydown', keydown);
79768                   keydown.call(this);
79769               }
79770           }
79771
79772           function keydown() {
79773               // down arrow
79774               if (event.keyCode === utilKeybinding.keyCodes['↓'] &&
79775                   // if insertion point is at the end of the string
79776                   search.node().selectionStart === search.property('value').length) {
79777                   event.preventDefault();
79778                   event.stopPropagation();
79779                   // move focus to the first item in the preset list
79780                   list.select('.preset-list-button').node().focus();
79781               }
79782           }
79783
79784           function keypress() {
79785               // enter
79786               var value = search.property('value');
79787               if (event.keyCode === 13 && value.length) {
79788                   list.selectAll('.preset-list-item:first-child').datum().choose();
79789               }
79790           }
79791
79792           function inputevent() {
79793               var value = search.property('value');
79794               list.classed('filtered', value.length);
79795               if (value.length) {
79796                   var results = presets.search(value, geometry);
79797                   message.text(t('inspector.results', {
79798                       n: results.collection.length,
79799                       search: value
79800                   }));
79801                   list.call(drawList, results);
79802               } else {
79803                   list.call(drawList, context.presets().defaults(geometry, 36));
79804                   message.text(t('inspector.choose'));
79805               }
79806           }
79807
79808           var searchWrap = selection$$1
79809               .append('div')
79810               .attr('class', 'search-header');
79811
79812           var search = searchWrap
79813               .append('input')
79814               .attr('class', 'preset-search-input')
79815               .attr('placeholder', t('inspector.search'))
79816               .attr('type', 'search')
79817               .call(utilNoAuto)
79818               .on('keydown', initialKeydown)
79819               .on('keypress', keypress)
79820               .on('input', inputevent);
79821
79822           searchWrap
79823               .call(svgIcon('#iD-icon-search', 'pre-text'));
79824
79825           if (_autofocus) {
79826               search.node().focus();
79827           }
79828
79829           var listWrap = selection$$1
79830               .append('div')
79831               .attr('class', 'inspector-body');
79832
79833           var list = listWrap
79834               .append('div')
79835               .attr('class', 'preset-list fillL cf')
79836               .call(drawList, context.presets().defaults(geometry, 36));
79837       }
79838
79839
79840       function drawList(list, presets) {
79841           var collection = presets.collection.map(function(preset) {
79842               return preset.members ? CategoryItem(preset) : PresetItem(preset);
79843           });
79844
79845           var items = list.selectAll('.preset-list-item')
79846               .data(collection, function(d) { return d.preset.id; });
79847
79848           items.order();
79849
79850           items.exit()
79851               .remove();
79852
79853           items.enter()
79854               .append('div')
79855               .attr('class', function(item) { return 'preset-list-item preset-' + item.preset.id.replace('/', '-'); })
79856               .classed('current', function(item) { return item.preset === _currentPreset; })
79857               .each(function(item) { select(this).call(item); })
79858               .style('opacity', 0)
79859               .transition()
79860               .style('opacity', 1);
79861       }
79862
79863       function itemKeydown(){
79864           // the actively focused item
79865           var item = select(this.closest('.preset-list-item'));
79866           var parentItem = select(item.node().parentElement.closest('.preset-list-item'));
79867
79868           // arrow down, move focus to the next, lower item
79869           if (event.keyCode === utilKeybinding.keyCodes['↓']) {
79870               event.preventDefault();
79871               event.stopPropagation();
79872               // the next item in the list at the same level
79873               var nextItem = select(item.node().nextElementSibling);
79874               // if there is no next item in this list
79875               if (nextItem.empty()) {
79876                   // if there is a parent item
79877                   if (!parentItem.empty()) {
79878                       // the item is the last item of a sublist,
79879                       // select the next item at the parent level
79880                       nextItem = select(parentItem.node().nextElementSibling);
79881                   }
79882               // if the focused item is expanded
79883               } else if (select(this).classed('expanded')) {
79884                   // select the first subitem instead
79885                   nextItem = item.select('.subgrid .preset-list-item:first-child');
79886               }
79887               if (!nextItem.empty()) {
79888                   // focus on the next item
79889                   nextItem.select('.preset-list-button').node().focus();
79890               }
79891
79892           // arrow up, move focus to the previous, higher item
79893           } else if (event.keyCode === utilKeybinding.keyCodes['↑']) {
79894               event.preventDefault();
79895               event.stopPropagation();
79896               // the previous item in the list at the same level
79897               var previousItem = select(item.node().previousElementSibling);
79898
79899               // if there is no previous item in this list
79900               if (previousItem.empty()) {
79901                   // if there is a parent item
79902                   if (!parentItem.empty()) {
79903                       // the item is the first subitem of a sublist select the parent item
79904                       previousItem = parentItem;
79905                   }
79906               // if the previous item is expanded
79907               } else if (previousItem.select('.preset-list-button').classed('expanded')) {
79908                   // select the last subitem of the sublist of the previous item
79909                   previousItem = previousItem.select('.subgrid .preset-list-item:last-child');
79910               }
79911
79912               if (!previousItem.empty()) {
79913                   // focus on the previous item
79914                   previousItem.select('.preset-list-button').node().focus();
79915               } else {
79916                   // the focus is at the top of the list, move focus back to the search field
79917                   var search = select(this.closest('.preset-list-pane')).select('.preset-search-input');
79918                   search.node().focus();
79919               }
79920
79921           // arrow left, move focus to the parent item if there is one
79922           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
79923               event.preventDefault();
79924               event.stopPropagation();
79925               // if there is a parent item, focus on the parent item
79926               if (!parentItem.empty()) {
79927                   parentItem.select('.preset-list-button').node().focus();
79928               }
79929
79930           // arrow right, choose this item
79931           } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
79932               event.preventDefault();
79933               event.stopPropagation();
79934               item.datum().choose();
79935           }
79936       }
79937
79938
79939       function CategoryItem(preset) {
79940           var box, sublist, shown = false;
79941
79942           function item(selection$$1) {
79943               var wrap = selection$$1.append('div')
79944                   .attr('class', 'preset-list-button-wrap category col12');
79945
79946               function click() {
79947                   var isExpanded = select(this).classed('expanded');
79948                   var iconName = isExpanded ?
79949                       (textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward') : '#iD-icon-down';
79950                   select(this)
79951                       .classed('expanded', !isExpanded);
79952                   select(this).selectAll('div.label-inner svg.icon use')
79953                       .attr('href', iconName);
79954                   item.choose();
79955               }
79956
79957               var button = wrap
79958                   .append('button')
79959                   .attr('class', 'preset-list-button')
79960                   .classed('expanded', false)
79961                   .call(uiPresetIcon()
79962                       .geometry(context.geometry(_entityID))
79963                       .preset(preset))
79964                   .on('click', click)
79965                   .on('keydown', function() {
79966                       // right arrow, expand the focused item
79967                       if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '←' : '→']) {
79968                           event.preventDefault();
79969                           event.stopPropagation();
79970                           // if the item isn't expanded
79971                           if (!select(this).classed('expanded')) {
79972                               // toggle expansion (expand the item)
79973                               click.call(this);
79974                           }
79975                       // left arrow, collapse the focused item
79976                       } else if (event.keyCode === utilKeybinding.keyCodes[(textDirection === 'rtl') ? '→' : '←']) {
79977                           event.preventDefault();
79978                           event.stopPropagation();
79979                           // if the item is expanded
79980                           if (select(this).classed('expanded')) {
79981                               // toggle expansion (collapse the item)
79982                               click.call(this);
79983                           }
79984                       } else {
79985                           itemKeydown.call(this);
79986                       }
79987                   });
79988
79989               var label = button
79990                   .append('div')
79991                   .attr('class', 'label')
79992                   .append('div')
79993                   .attr('class', 'label-inner');
79994
79995               label
79996                   .append('div')
79997                   .attr('class', 'namepart')
79998                   .call(svgIcon((textDirection === 'rtl' ? '#iD-icon-backward' : '#iD-icon-forward'), 'inline'))
79999                   .append('span')
80000                   .html(function() { return preset.name() + '&hellip;'; });
80001
80002               box = selection$$1.append('div')
80003                   .attr('class', 'subgrid col12')
80004                   .style('max-height', '0px')
80005                   .style('opacity', 0);
80006
80007               box.append('div')
80008                   .attr('class', 'arrow');
80009
80010               sublist = box.append('div')
80011                   .attr('class', 'preset-list fillL3 cf fl');
80012           }
80013
80014
80015           item.choose = function() {
80016               if (!box || !sublist) return;
80017
80018               if (shown) {
80019                   shown = false;
80020                   box.transition()
80021                       .duration(200)
80022                       .style('opacity', '0')
80023                       .style('max-height', '0px')
80024                       .style('padding-bottom', '0px');
80025               } else {
80026                   shown = true;
80027                   sublist.call(drawList, preset.members);
80028                   box.transition()
80029                       .duration(200)
80030                       .style('opacity', '1')
80031                       .style('max-height', 200 + preset.members.collection.length * 190 + 'px')
80032                       .style('padding-bottom', '20px');
80033               }
80034           };
80035
80036           item.preset = preset;
80037           return item;
80038       }
80039
80040
80041       function PresetItem(preset) {
80042           function item(selection$$1) {
80043               var wrap = selection$$1.append('div')
80044                   .attr('class', 'preset-list-button-wrap col12');
80045
80046               var button = wrap.append('button')
80047                   .attr('class', 'preset-list-button')
80048                   .call(uiPresetIcon()
80049                       .geometry(context.geometry(_entityID))
80050                       .preset(preset))
80051                   .on('click', item.choose)
80052                   .on('keydown', itemKeydown);
80053
80054               var label = button
80055                   .append('div')
80056                   .attr('class', 'label')
80057                   .append('div')
80058                   .attr('class', 'label-inner');
80059
80060               label.selectAll('.namepart')
80061                   .data(preset.name().split(' - '))
80062                   .enter()
80063                   .append('div')
80064                   .attr('class', 'namepart')
80065                   .text(function(d) { return d; });
80066
80067               wrap.call(item.reference.button);
80068               selection$$1.call(item.reference.body);
80069           }
80070
80071           item.choose = function() {
80072               context.presets().choose(preset);
80073               context.perform(
80074                   actionChangePreset(_entityID, _currentPreset, preset),
80075                   t('operations.change_tags.annotation')
80076               );
80077
80078               dispatch$$1.call('choose', this, preset);
80079           };
80080
80081           item.help = function() {
80082               event.stopPropagation();
80083               item.reference.toggle();
80084           };
80085
80086           item.preset = preset;
80087           item.reference = uiTagReference(preset.reference(context.geometry(_entityID)), context);
80088
80089           return item;
80090       }
80091
80092
80093       presetList.autofocus = function(val) {
80094           if (!arguments.length) return _autofocus;
80095           _autofocus = val;
80096           return presetList;
80097       };
80098
80099
80100       presetList.entityID = function(val) {
80101           if (!arguments.length) return _entityID;
80102           _entityID = val;
80103           presetList.preset(context.presets().match(context.entity(_entityID), context.graph()));
80104           return presetList;
80105       };
80106
80107
80108       presetList.preset = function(val) {
80109           if (!arguments.length) return _currentPreset;
80110           _currentPreset = val;
80111           return presetList;
80112       };
80113
80114
80115       return utilRebind(presetList, dispatch$$1, 'on');
80116   }
80117
80118   function uiViewOnOSM(context) {
80119       var _what;   // an osmEntity or osmNote
80120
80121
80122       function viewOnOSM(selection) {
80123           var url;
80124           if (_what instanceof osmEntity$$1) {
80125               url = context.connection().entityURL(_what);
80126           } else if (_what instanceof osmNote) {
80127               url = context.connection().noteURL(_what);
80128           }
80129
80130           var data = ((!_what || _what.isNew()) ? [] : [_what]);
80131           var link = selection.selectAll('.view-on-osm')
80132               .data(data, function(d) { return d.id; });
80133
80134           // exit
80135           link.exit()
80136               .remove();
80137
80138           // enter
80139           var linkEnter = link.enter()
80140               .append('a')
80141               .attr('class', 'view-on-osm')
80142               .attr('target', '_blank')
80143               .attr('href', url)
80144               .call(svgIcon('#iD-icon-out-link', 'inline'));
80145
80146           linkEnter
80147               .append('span')
80148               .text(t('inspector.view_on_osm'));
80149       }
80150
80151
80152       viewOnOSM.what = function(_) {
80153           if (!arguments.length) return _what;
80154           _what = _;
80155           return viewOnOSM;
80156       };
80157
80158       return viewOnOSM;
80159   }
80160
80161   function uiInspector(context) {
80162       var presetList = uiPresetList(context);
80163       var entityEditor = uiEntityEditor(context);
80164       var _state = 'select';
80165       var _entityID;
80166       var _newFeature = false;
80167
80168
80169       function inspector(selection$$1) {
80170           presetList
80171               .entityID(_entityID)
80172               .autofocus(_newFeature)
80173               .on('choose', setPreset);
80174
80175           entityEditor
80176               .state(_state)
80177               .entityID(_entityID)
80178               .on('choose', showList);
80179
80180           var wrap = selection$$1.selectAll('.panewrap')
80181               .data([0]);
80182
80183           var enter = wrap.enter()
80184               .append('div')
80185               .attr('class', 'panewrap');
80186
80187           enter
80188               .append('div')
80189               .attr('class', 'preset-list-pane pane');
80190
80191           enter
80192               .append('div')
80193               .attr('class', 'entity-editor-pane pane');
80194
80195           wrap = wrap.merge(enter);
80196           var presetPane = wrap.selectAll('.preset-list-pane');
80197           var editorPane = wrap.selectAll('.entity-editor-pane');
80198
80199           var graph = context.graph();
80200           var entity = context.entity(_entityID);
80201
80202           var showEditor = _state === 'hover' ||
80203               entity.isUsed(graph) ||
80204               entity.isHighwayIntersection(graph);
80205
80206           if (showEditor) {
80207               wrap.style('right', '0%');
80208               editorPane.call(entityEditor);
80209           } else {
80210               wrap.style('right', '-100%');
80211               presetPane.call(presetList);
80212           }
80213
80214           var footer = selection$$1.selectAll('.footer')
80215               .data([0]);
80216
80217           footer = footer.enter()
80218               .append('div')
80219               .attr('class', 'footer')
80220               .merge(footer);
80221
80222           footer
80223               .call(uiViewOnOSM(context)
80224                   .what(context.hasEntity(_entityID))
80225               );
80226
80227
80228           function showList(preset) {
80229               wrap.transition()
80230                   .styleTween('right', function() { return interpolate('0%', '-100%'); });
80231
80232               presetPane
80233                   .call(presetList.preset(preset).autofocus(true));
80234           }
80235
80236
80237           function setPreset(preset) {
80238               wrap.transition()
80239                   .styleTween('right', function() { return interpolate('-100%', '0%'); });
80240
80241               editorPane
80242                   .call(entityEditor.preset(preset));
80243           }
80244       }
80245
80246
80247       inspector.state = function(_) {
80248           if (!arguments.length) return _state;
80249           _state = _;
80250           entityEditor.state(_state);
80251
80252           // remove any old field help overlay that might have gotten attached to the inspector
80253           d3_selectAll('.field-help-body').remove();
80254
80255           return inspector;
80256       };
80257
80258
80259       inspector.entityID = function(_) {
80260           if (!arguments.length) return _entityID;
80261           _entityID = _;
80262           return inspector;
80263       };
80264
80265
80266       inspector.newFeature = function(_) {
80267           if (!arguments.length) return _newFeature;
80268           _newFeature = _;
80269           return inspector;
80270       };
80271
80272
80273       return inspector;
80274   }
80275
80276   function uiLasso(context) {
80277       var group, polygon;
80278
80279       lasso.coordinates = [];
80280
80281       function lasso(selection$$1) {
80282           context.container()
80283               .classed('lasso', true);
80284
80285           group = selection$$1
80286               .append('g')
80287               .attr('class', 'lasso hide');
80288
80289           polygon = group
80290               .append('path')
80291               .attr('class', 'lasso-path');
80292
80293           group
80294               .call(uiToggle(true));
80295       }
80296
80297
80298       function draw() {
80299           if (polygon) {
80300               polygon.data([lasso.coordinates])
80301                   .attr('d', function(d) { return 'M' + d.join(' L') + ' Z'; });
80302           }
80303       }
80304
80305
80306       lasso.extent = function () {
80307           return lasso.coordinates.reduce(function(extent, point$$1) {
80308               return extent.extend(geoExtent$$1(point$$1));
80309           }, geoExtent$$1());
80310       };
80311
80312
80313       lasso.p = function(_) {
80314           if (!arguments.length) return lasso;
80315           lasso.coordinates.push(_);
80316           draw();
80317           return lasso;
80318       };
80319
80320
80321       lasso.close = function() {
80322           if (group) {
80323               group.call(uiToggle(false, function() {
80324                   select(this).remove();
80325               }));
80326           }
80327           context.container().classed('lasso', false);
80328       };
80329
80330
80331       return lasso;
80332   }
80333
80334   function uiNoteComments() {
80335       var _note;
80336
80337
80338       function noteComments(selection$$1) {
80339           if (_note.isNew()) return; // don't draw .comments-container
80340
80341           var comments = selection$$1.selectAll('.comments-container')
80342               .data([0]);
80343
80344           comments = comments.enter()
80345               .append('div')
80346               .attr('class', 'comments-container')
80347               .merge(comments);
80348
80349           var commentEnter = comments.selectAll('.comment')
80350               .data(_note.comments)
80351               .enter()
80352               .append('div')
80353               .attr('class', 'comment');
80354
80355           commentEnter
80356               .append('div')
80357               .attr('class', function(d) { return 'comment-avatar user-' + d.uid; })
80358               .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon'));
80359
80360           var mainEnter = commentEnter
80361               .append('div')
80362               .attr('class', 'comment-main');
80363
80364           var metadataEnter = mainEnter
80365               .append('div')
80366               .attr('class', 'comment-metadata');
80367
80368           metadataEnter
80369               .append('div')
80370               .attr('class', 'comment-author')
80371               .each(function(d) {
80372                   var selection$$1 = select(this);
80373                   var osm = services.osm;
80374                   if (osm && d.user) {
80375                       selection$$1 = selection$$1
80376                           .append('a')
80377                           .attr('class', 'comment-author-link')
80378                           .attr('href', osm.userURL(d.user))
80379                           .attr('tabindex', -1)
80380                           .attr('target', '_blank');
80381                   }
80382                   selection$$1
80383                       .text(function(d) { return d.user || t('note.anonymous'); });
80384               });
80385
80386           metadataEnter
80387               .append('div')
80388               .attr('class', 'comment-date')
80389               .text(function(d) {
80390                   return t('note.status.' + d.action, { when: localeDateString(d.date) });
80391               });
80392
80393           mainEnter
80394               .append('div')
80395               .attr('class', 'comment-text')
80396               .html(function(d) { return d.html; });
80397
80398           comments
80399               .call(replaceAvatars);
80400       }
80401
80402
80403       function replaceAvatars(selection$$1) {
80404           var osm = services.osm;
80405           if (!osm) return;
80406
80407           var uids = {};  // gather uids in the comment thread
80408           _note.comments.forEach(function(d) {
80409               if (d.uid) uids[d.uid] = true;
80410           });
80411
80412           Object.keys(uids).forEach(function(uid) {
80413               osm.loadUser(uid, function(err, user) {
80414                   if (!user || !user.image_url) return;
80415
80416                   selection$$1.selectAll('.comment-avatar.user-' + uid)
80417                       .html('')
80418                       .append('img')
80419                       .attr('class', 'icon comment-avatar-icon')
80420                       .attr('src', user.image_url)
80421                       .attr('alt', user.display_name);
80422               });
80423           });
80424       }
80425
80426
80427       function localeDateString(s) {
80428           if (!s) return null;
80429           var detected = utilDetect();
80430           var options = { day: 'numeric', month: 'short', year: 'numeric' };
80431           s = s.replace(/-/g, '/'); // fix browser-specific Date() issues
80432           var d = new Date(s);
80433           if (isNaN(d.getTime())) return null;
80434           return d.toLocaleDateString(detected.locale, options);
80435       }
80436
80437
80438       noteComments.note = function(_) {
80439           if (!arguments.length) return _note;
80440           _note = _;
80441           return noteComments;
80442       };
80443
80444
80445       return noteComments;
80446   }
80447
80448   function uiNoteEditor$$1(context) {
80449       var dispatch$$1 = dispatch('change');
80450       var noteComments = uiNoteComments();
80451       var noteHeader = uiNoteHeader();
80452
80453       // var formFields = uiFormFields(context);
80454
80455       var _note;
80456       // var _fieldsArr;
80457
80458
80459       function noteEditor(selection$$1) {
80460           var header = selection$$1.selectAll('.header')
80461               .data([0]);
80462
80463           var headerEnter = header.enter()
80464               .append('div')
80465               .attr('class', 'header fillL');
80466
80467           headerEnter
80468               .append('button')
80469               .attr('class', 'fr note-editor-close')
80470               .on('click', function() {
80471                   context.enter(modeBrowse(context));
80472               })
80473               .call(svgIcon('#iD-icon-close'));
80474
80475           headerEnter
80476               .append('h3')
80477               .text(t('note.title'));
80478
80479
80480           var body = selection$$1.selectAll('.body')
80481               .data([0]);
80482
80483           body = body.enter()
80484               .append('div')
80485               .attr('class', 'body')
80486               .merge(body);
80487
80488           var editor = body.selectAll('.note-editor')
80489               .data([0]);
80490
80491           editor.enter()
80492               .append('div')
80493               .attr('class', 'modal-section note-editor')
80494               .merge(editor)
80495               .call(noteHeader.note(_note))
80496               .call(noteComments.note(_note))
80497               .call(noteSaveSection);
80498
80499
80500           var footer = selection$$1.selectAll('.footer')
80501               .data([0]);
80502
80503           footer.enter()
80504               .append('div')
80505               .attr('class', 'footer')
80506               .merge(footer)
80507               .call(uiViewOnOSM(context).what(_note))
80508               .call(uiNoteReport(context).note(_note));
80509
80510
80511           // rerender the note editor on any auth change
80512           var osm = services.osm;
80513           if (osm) {
80514               osm.on('change.note-save', function() {
80515                   selection$$1.call(noteEditor);
80516               });
80517           }
80518       }
80519
80520
80521       function noteSaveSection(selection$$1) {
80522           var isSelected = (_note && _note.id === context.selectedNoteID());
80523           var noteSave = selection$$1.selectAll('.note-save')
80524               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
80525
80526           // exit
80527           noteSave.exit()
80528               .remove();
80529
80530           // enter
80531           var noteSaveEnter = noteSave.enter()
80532               .append('div')
80533               .attr('class', 'note-save save-section cf');
80534
80535           // // if new note, show categories to pick from
80536           // if (_note.isNew()) {
80537           //     var presets = context.presets();
80538
80539           //     // NOTE: this key isn't a age and therefore there is no documentation (yet)
80540           //     _fieldsArr = [
80541           //         uiField(context, presets.field('category'), null, { show: true, revert: false }),
80542           //     ];
80543
80544           //     _fieldsArr.forEach(function(field) {
80545           //         field
80546           //             .on('change', changeCategory);
80547           //     });
80548
80549           //     noteSaveEnter
80550           //         .append('div')
80551           //         .attr('class', 'note-category')
80552           //         .call(formFields.fieldsArr(_fieldsArr));
80553           // }
80554
80555           // function changeCategory() {
80556           //     // NOTE: perhaps there is a better way to get value
80557           //     var val = d3_select('input[name=\'category\']:checked').property('__data__') || undefined;
80558
80559           //     // store the unsaved category with the note itself
80560           //     _note = _note.update({ newCategory: val });
80561           //     var osm = services.osm;
80562           //     if (osm) {
80563           //         osm.replaceNote(_note);  // update note cache
80564           //     }
80565           //     noteSave
80566           //         .call(noteSaveButtons);
80567           // }
80568
80569           noteSaveEnter
80570               .append('h4')
80571               .attr('class', '.note-save-header')
80572               .text(function() {
80573                   return _note.isNew() ? t('note.newDescription') : t('note.newComment');
80574               });
80575
80576           noteSaveEnter
80577               .append('textarea')
80578               .attr('id', 'new-comment-input')
80579               .attr('placeholder', t('note.inputPlaceholder'))
80580               .attr('maxlength', 1000)
80581               .property('value', function(d) { return d.newComment; })
80582               .call(utilNoAuto)
80583               .on('keydown.note-input', keydown)
80584               .on('input.note-input', changeInput)
80585               .on('blur.note-input', changeInput);
80586
80587           // update
80588           noteSave = noteSaveEnter
80589               .merge(noteSave)
80590               .call(userDetails)
80591               .call(noteSaveButtons);
80592
80593
80594           // fast submit if user presses cmd+enter
80595           function keydown() {
80596               if (!(event.keyCode === 13 && event.metaKey)) return;
80597
80598               var osm = services.osm;
80599               if (!osm) return;
80600
80601               var hasAuth = osm.authenticated();
80602               if (!hasAuth) return;
80603
80604               if (!_note.newComment) return;
80605
80606               event.preventDefault();
80607
80608               select(this)
80609                   .on('keydown.note-input', null);
80610
80611               // focus on button and submit
80612               window.setTimeout(function() {
80613                   if (_note.isNew()) {
80614                       noteSave.selectAll('.save-button').node().focus();
80615                       clickSave(_note);
80616                   } else  {
80617                       noteSave.selectAll('.comment-button').node().focus();
80618                       clickComment(_note);
80619                   }
80620               }, 10);
80621           }
80622
80623
80624           function changeInput() {
80625               var input = select(this);
80626               var val = input.property('value').trim() || undefined;
80627
80628               // store the unsaved comment with the note itself
80629               _note = _note.update({ newComment: val });
80630
80631               var osm = services.osm;
80632               if (osm) {
80633                   osm.replaceNote(_note);  // update note cache
80634               }
80635
80636               noteSave
80637                   .call(noteSaveButtons);
80638           }
80639       }
80640
80641
80642       function userDetails(selection$$1) {
80643           var detailSection = selection$$1.selectAll('.detail-section')
80644               .data([0]);
80645
80646           detailSection = detailSection.enter()
80647               .append('div')
80648               .attr('class', 'detail-section')
80649               .merge(detailSection);
80650
80651           var osm = services.osm;
80652           if (!osm) return;
80653
80654           // Add warning if user is not logged in
80655           var hasAuth = osm.authenticated();
80656           var authWarning = detailSection.selectAll('.auth-warning')
80657               .data(hasAuth ? [] : [0]);
80658
80659           authWarning.exit()
80660               .transition()
80661               .duration(200)
80662               .style('opacity', 0)
80663               .remove();
80664
80665           var authEnter = authWarning.enter()
80666               .insert('div', '.tag-reference-body')
80667               .attr('class', 'field-warning auth-warning')
80668               .style('opacity', 0);
80669
80670           authEnter
80671               .call(svgIcon('#iD-icon-alert', 'inline'));
80672
80673           authEnter
80674               .append('span')
80675               .text(t('note.login'));
80676
80677           authEnter
80678               .append('a')
80679               .attr('target', '_blank')
80680               .call(svgIcon('#iD-icon-out-link', 'inline'))
80681               .append('span')
80682               .text(t('login'))
80683               .on('click.note-login', function() {
80684                   event.preventDefault();
80685                   osm.authenticate();
80686               });
80687
80688           authEnter
80689               .transition()
80690               .duration(200)
80691               .style('opacity', 1);
80692
80693
80694           var prose = detailSection.selectAll('.note-save-prose')
80695               .data(hasAuth ? [0] : []);
80696
80697           prose.exit()
80698               .remove();
80699
80700           prose = prose.enter()
80701               .append('p')
80702               .attr('class', 'note-save-prose')
80703               .text(t('note.upload_explanation'))
80704               .merge(prose);
80705
80706           osm.userDetails(function(err, user) {
80707               if (err) return;
80708
80709               var userLink = select(document.createElement('div'));
80710
80711               if (user.image_url) {
80712                   userLink
80713                       .append('img')
80714                       .attr('src', user.image_url)
80715                       .attr('class', 'icon pre-text user-icon');
80716               }
80717
80718               userLink
80719                   .append('a')
80720                   .attr('class', 'user-info')
80721                   .text(user.display_name)
80722                   .attr('href', osm.userURL(user.display_name))
80723                   .attr('tabindex', -1)
80724                   .attr('target', '_blank');
80725
80726               prose
80727                   .html(t('note.upload_explanation_with_user', { user: userLink.html() }));
80728           });
80729       }
80730
80731
80732       function noteSaveButtons(selection$$1) {
80733           var osm = services.osm;
80734           var hasAuth = osm && osm.authenticated();
80735
80736           var isSelected = (_note && _note.id === context.selectedNoteID());
80737           var buttonSection = selection$$1.selectAll('.buttons')
80738               .data((isSelected ? [_note] : []), function(d) { return d.status + d.id; });
80739
80740           // exit
80741           buttonSection.exit()
80742               .remove();
80743
80744           // enter
80745           var buttonEnter = buttonSection.enter()
80746               .append('div')
80747               .attr('class', 'buttons');
80748
80749           if (_note.isNew()) {
80750               buttonEnter
80751                   .append('button')
80752                   .attr('class', 'button cancel-button secondary-action')
80753                   .text(t('confirm.cancel'));
80754
80755               buttonEnter
80756                   .append('button')
80757                   .attr('class', 'button save-button action')
80758                   .text(t('note.save'));
80759
80760           } else {
80761               buttonEnter
80762                   .append('button')
80763                   .attr('class', 'button status-button action');
80764
80765               buttonEnter
80766                   .append('button')
80767                   .attr('class', 'button comment-button action')
80768                   .text(t('note.comment'));
80769           }
80770
80771
80772           // update
80773           buttonSection = buttonSection
80774               .merge(buttonEnter);
80775
80776           buttonSection.select('.cancel-button')   // select and propagate data
80777               .on('click.cancel', clickCancel);
80778
80779           buttonSection.select('.save-button')     // select and propagate data
80780               .attr('disabled', isSaveDisabled)
80781               .on('click.save', clickSave);
80782
80783           buttonSection.select('.status-button')   // select and propagate data
80784               .attr('disabled', (hasAuth ? null : true))
80785               .text(function(d) {
80786                   var action = (d.status === 'open' ? 'close' : 'open');
80787                   var andComment = (d.newComment ? '_comment' : '');
80788                   return t('note.' + action + andComment);
80789               })
80790               .on('click.status', clickStatus);
80791
80792           buttonSection.select('.comment-button')   // select and propagate data
80793               .attr('disabled', isSaveDisabled)
80794               .on('click.comment', clickComment);
80795
80796
80797           function isSaveDisabled(d) {
80798               return (hasAuth && d.status === 'open' && d.newComment) ? null : true;
80799           }
80800       }
80801
80802
80803
80804       function clickCancel(d) {
80805           this.blur();    // avoid keeping focus on the button - #4641
80806           var osm = services.osm;
80807           if (osm) {
80808               osm.removeNote(d);
80809           }
80810           context.enter(modeBrowse(context));
80811           dispatch$$1.call('change');
80812       }
80813
80814
80815       function clickSave(d) {
80816           this.blur();    // avoid keeping focus on the button - #4641
80817           var osm = services.osm;
80818           if (osm) {
80819               osm.postNoteCreate(d, function(err, note) {
80820                   dispatch$$1.call('change', note);
80821               });
80822           }
80823       }
80824
80825
80826       function clickStatus(d) {
80827           this.blur();    // avoid keeping focus on the button - #4641
80828           var osm = services.osm;
80829           if (osm) {
80830               var setStatus = (d.status === 'open' ? 'closed' : 'open');
80831               osm.postNoteUpdate(d, setStatus, function(err, note) {
80832                   dispatch$$1.call('change', note);
80833               });
80834           }
80835       }
80836
80837       function clickComment(d) {
80838           this.blur();    // avoid keeping focus on the button - #4641
80839           var osm = services.osm;
80840           if (osm) {
80841               osm.postNoteUpdate(d, d.status, function(err, note) {
80842                   dispatch$$1.call('change', note);
80843               });
80844           }
80845       }
80846
80847
80848       noteEditor.note = function(_) {
80849           if (!arguments.length) return _note;
80850           _note = _;
80851           return noteEditor;
80852       };
80853
80854
80855       return utilRebind(noteEditor, dispatch$$1, 'on');
80856   }
80857
80858   function uiNoteHeader() {
80859       var _note;
80860
80861
80862       function noteHeader(selection) {
80863           var header = selection.selectAll('.note-header')
80864               .data(
80865                   (_note ? [_note] : []),
80866                   function(d) { return d.status + d.id; }
80867               );
80868
80869           header.exit()
80870               .remove();
80871
80872           var headerEnter = header.enter()
80873               .append('div')
80874               .attr('class', 'note-header');
80875
80876           var iconEnter = headerEnter
80877               .append('div')
80878               .attr('class', function(d) { return 'note-header-icon ' + d.status; })
80879               .classed('new', function(d) { return d.id < 0; });
80880
80881           iconEnter
80882               .append('div')
80883               .attr('class', 'preset-icon-28')
80884               .call(svgIcon('#iD-icon-note', 'note-fill'));
80885
80886           iconEnter.each(function(d) {
80887               var statusIcon = '#iD-icon-' + (d.id < 0 ? 'plus' : (d.status === 'open' ? 'close' : 'apply'));
80888               iconEnter
80889                   .append('div')
80890                   .attr('class', 'note-icon-annotation')
80891                   .call(svgIcon(statusIcon, 'note-annotation'));
80892           });
80893
80894           headerEnter
80895               .append('div')
80896               .attr('class', 'note-header-label')
80897               .text(function(d) {
80898                   if (_note.isNew()) { return t('note.new'); }
80899                   return t('note.note') + ' ' + d.id + ' ' +
80900                       (d.status === 'closed' ? t('note.closed') : '');
80901               });
80902       }
80903
80904
80905       noteHeader.note = function(_) {
80906           if (!arguments.length) return _note;
80907           _note = _;
80908           return noteHeader;
80909       };
80910
80911
80912       return noteHeader;
80913   }
80914
80915   function uiNoteReport() {
80916       var _note;
80917       var url = 'https://www.openstreetmap.org/reports/new?reportable_id=';
80918
80919       function noteReport(selection) {
80920
80921           if (!(_note instanceof osmNote)) return;
80922
80923           url += _note.id + '&reportable_type=Note';
80924
80925           var data = ((!_note || _note.isNew()) ? [] : [_note]);
80926           var link = selection.selectAll('.note-report')
80927               .data(data, function(d) { return d.id; });
80928
80929           // exit
80930           link.exit()
80931               .remove();
80932
80933           // enter
80934           var linkEnter = link.enter()
80935               .append('a')
80936               .attr('class', 'note-report')
80937               .attr('target', '_blank')
80938               .attr('href', url)
80939               .call(svgIcon('#iD-icon-out-link', 'inline'));
80940
80941           linkEnter
80942               .append('span')
80943               .text(t('note.report'));
80944       }
80945
80946
80947       noteReport.note = function(_) {
80948           if (!arguments.length) return _note;
80949           _note = _;
80950           return noteReport;
80951       };
80952
80953       return noteReport;
80954   }
80955
80956   function uiRadialMenu(context, operations) {
80957       var menu;
80958       var center = [0, 0];
80959       var tooltip;
80960
80961
80962       var radialMenu = function(selection$$1) {
80963           if (!operations.length) return;
80964
80965           selection$$1.node().parentNode.focus();
80966
80967           function click(operation) {
80968               event.stopPropagation();
80969               if (operation.disabled()) return;
80970               operation();
80971               radialMenu.close();
80972           }
80973
80974           menu = selection$$1
80975               .append('g')
80976               .attr('class', 'radial-menu')
80977               .attr('transform', 'translate(' + center + ')')
80978               .attr('opacity', 0);
80979
80980           menu
80981               .transition()
80982               .attr('opacity', 1);
80983
80984           var r = 50;
80985           var a = Math.PI / 4;
80986           var a0 = -Math.PI / 4;
80987           var a1 = a0 + (operations.length - 1) * a;
80988
80989           menu
80990               .append('path')
80991               .attr('class', 'radial-menu-background')
80992               .attr('d', 'M' + r * Math.sin(a0) + ',' +
80993                                r * Math.cos(a0) +
80994                         ' A' + r + ',' + r + ' 0 ' + (operations.length > 5 ? '1' : '0') + ',0 ' +
80995                                (r * Math.sin(a1) + 1e-3) + ',' +
80996                                (r * Math.cos(a1) + 1e-3)) // Force positive-length path (#1305)
80997               .attr('stroke-width', 50)
80998               .attr('stroke-linecap', 'round');
80999
81000           var button = menu.selectAll()
81001               .data(operations)
81002               .enter()
81003               .append('g')
81004               .attr('class', function(d) { return 'radial-menu-item radial-menu-item-' + d.id; })
81005               .classed('disabled', function(d) { return d.disabled(); })
81006               .attr('transform', function(d, i) {
81007                   return 'translate(' + geoVecFloor([
81008                           r * Math.sin(a0 + i * a),
81009                           r * Math.cos(a0 + i * a)]).join(',') + ')';
81010               });
81011
81012           button
81013               .append('circle')
81014               .attr('r', 15)
81015               .on('click', click)
81016               .on('mousedown', mousedown)
81017               .on('mouseover', mouseover)
81018               .on('mouseout', mouseout);
81019
81020           button
81021               .append('use')
81022               .attr('transform', 'translate(-10,-10)')
81023               .attr('width', '20')
81024               .attr('height', '20')
81025               .attr('xlink:href', function(d) { return '#iD-operation-' + d.id; });
81026
81027           tooltip = select(document.body)
81028               .append('div')
81029               .attr('class', 'tooltip-inner radial-menu-tooltip');
81030
81031           function mousedown() {
81032               event.stopPropagation(); // https://github.com/openstreetmap/iD/issues/1869
81033           }
81034
81035           function mouseover(d, i) {
81036               var rect = context.surfaceRect();
81037               var angle = a0 + i * a;
81038               var top = rect.top + (r + 25) * Math.cos(angle) + center[1] + 'px';
81039               var left = rect.left + (r + 25) * Math.sin(angle) + center[0] + 'px';
81040               var bottom = rect.height - (r + 25) * Math.cos(angle) - center[1] + 'px';
81041               var right = rect.width - (r + 25) * Math.sin(angle) - center[0] + 'px';
81042
81043               tooltip
81044                   .style('top', null)
81045                   .style('left', null)
81046                   .style('bottom', null)
81047                   .style('right', null)
81048                   .style('display', 'block')
81049                   .html(uiTooltipHtml(d.tooltip(), d.keys[0]));
81050
81051               if (i === 0) {
81052                   tooltip
81053                       .style('right', right)
81054                       .style('top', top);
81055               } else if (i >= 4) {
81056                   tooltip
81057                       .style('left', left)
81058                       .style('bottom', bottom);
81059               } else {
81060                   tooltip
81061                       .style('left', left)
81062                       .style('top', top);
81063               }
81064           }
81065
81066           function mouseout() {
81067               tooltip.style('display', 'none');
81068           }
81069       };
81070
81071
81072       radialMenu.close = function() {
81073           if (menu) {
81074               menu
81075                   .style('pointer-events', 'none')
81076                   .transition()
81077                   .attr('opacity', 0)
81078                   .remove();
81079           }
81080
81081           if (tooltip) {
81082               tooltip.remove();
81083           }
81084       };
81085
81086
81087       radialMenu.center = function(_) {
81088           if (!arguments.length) return center;
81089           center = _;
81090           return radialMenu;
81091       };
81092
81093
81094       return radialMenu;
81095   }
81096
81097   function uiSelectionList(context, selectedIDs) {
81098
81099       function selectEntity(entity) {
81100           context.enter(modeSelect(context, [entity.id]));
81101       }
81102
81103
81104       function deselectEntity(entity) {
81105           event.stopPropagation();
81106           var index = selectedIDs.indexOf(entity.id);
81107           if (index > -1) {
81108               selectedIDs.splice(index, 1);
81109           }
81110           context.enter(modeSelect(context, selectedIDs));
81111       }
81112
81113
81114       function selectionList(selection$$1) {
81115           selection$$1.classed('selection-list-pane', true);
81116
81117           var header = selection$$1
81118               .append('div')
81119               .attr('class', 'header fillL cf');
81120
81121           header
81122               .append('h3')
81123               .text(t('inspector.multiselect'));
81124
81125           var listWrap = selection$$1
81126               .append('div')
81127               .attr('class', 'inspector-body');
81128
81129           var list = listWrap
81130               .append('div')
81131               .attr('class', 'feature-list cf');
81132
81133           context.history().on('change.selection-list', drawList);
81134           drawList();
81135
81136
81137           function drawList() {
81138               var entities = selectedIDs
81139                   .map(function(id) { return context.hasEntity(id); })
81140                   .filter(function(entity) { return entity; });
81141
81142               var items = list.selectAll('.feature-list-item')
81143                   .data(entities, osmEntity$$1.key);
81144
81145               items.exit()
81146                   .remove();
81147
81148               // Enter
81149               var enter = items.enter()
81150                   .append('div')
81151                   .attr('class', 'feature-list-item')
81152                   .on('click', selectEntity);
81153
81154               enter
81155                   .each(function(d) {
81156                   // highlight the feature in the map while hovering on the list item
81157                   select(this).on('mouseover', function() {
81158                       utilHighlightEntity(d.id, true, context);
81159                   });
81160                   select(this).on('mouseout', function() {
81161                       utilHighlightEntity(d.id, false, context);
81162                   });
81163               });
81164
81165               var label = enter
81166                   .append('button')
81167                   .attr('class', 'label');
81168
81169               enter
81170                   .append('button')
81171                   .attr('class', 'close')
81172                   .on('click', deselectEntity)
81173                   .call(svgIcon('#iD-icon-close'));
81174
81175               label
81176                   .append('span')
81177                   .attr('class', 'entity-geom-icon')
81178                   .call(svgIcon('', 'pre-text'));
81179
81180               label
81181                   .append('span')
81182                   .attr('class', 'entity-type');
81183
81184               label
81185                   .append('span')
81186                   .attr('class', 'entity-name');
81187
81188               // Update
81189               items = items.merge(enter);
81190
81191               items.selectAll('.entity-geom-icon use')
81192                   .attr('href', function() {
81193                       var entity = this.parentNode.parentNode.__data__;
81194                       return '#iD-icon-' + context.geometry(entity.id);
81195                   });
81196
81197               items.selectAll('.entity-type')
81198                   .text(function(entity) { return context.presets().match(entity, context.graph()).name(); });
81199
81200               items.selectAll('.entity-name')
81201                   .text(function(entity) { return utilDisplayName(entity); });
81202           }
81203       }
81204
81205       return selectionList;
81206   }
81207
81208   function uiSourceSwitch(context) {
81209       var keys;
81210
81211
81212       function click() {
81213           event.preventDefault();
81214
81215           var osm = context.connection();
81216           if (!osm) return;
81217
81218           if (context.inIntro()) return;
81219
81220           if (context.history().hasChanges() &&
81221               !window.confirm(t('source_switch.lose_changes'))) return;
81222
81223           var isLive = select(this)
81224               .classed('live');
81225
81226           isLive = !isLive;
81227           context.enter(modeBrowse(context));
81228           context.history().clearSaved();          // remove saved history
81229           context.flush();                         // remove stored data
81230
81231           select(this)
81232               .text(isLive ? t('source_switch.live') : t('source_switch.dev'))
81233               .classed('live', isLive);
81234
81235           osm.switch(isLive ? keys[0] : keys[1]);  // switch connection (warning: dispatches 'change' event)
81236       }
81237
81238       var sourceSwitch = function(selection$$1) {
81239           selection$$1
81240               .append('a')
81241               .attr('href', '#')
81242               .text(t('source_switch.live'))
81243               .classed('live', true)
81244               .attr('tabindex', -1)
81245               .on('click', click);
81246       };
81247
81248
81249       sourceSwitch.keys = function(_) {
81250           if (!arguments.length) return keys;
81251           keys = _;
81252           return sourceSwitch;
81253       };
81254
81255
81256       return sourceSwitch;
81257   }
81258
81259   function uiSuccess$$1(context) {
81260       var MAXEVENTS = 2;
81261
81262       // All else being equal, rank more "social" communities higher
81263       // (anything not in this list receives no adjustment)
81264       var COMMUNITYRANK = {
81265           'meetup': +5,
81266           'slack': +4,
81267           'facebook': +3,
81268           'reddit': +2,
81269           'forum': -2,
81270           'mailinglist': -3,
81271           'irc': -4
81272       };
81273
81274       var detected = utilDetect();
81275       var dispatch$$1 = dispatch('cancel');
81276       var _changeset;
81277       var _location;
81278
81279
81280       // string-to-date parsing in JavaScript is weird
81281       function parseEventDate(when) {
81282           if (!when) return;
81283
81284           var raw = when.trim();
81285           if (!raw) return;
81286
81287           if (!/Z$/.test(raw)) {    // if no trailing 'Z', add one
81288               raw += 'Z';           // this forces date to be parsed as a UTC date
81289           }
81290
81291           var parsed = new Date(raw);
81292           return new Date(parsed.toUTCString().substr(0, 25));  // convert to local timezone
81293       }
81294
81295
81296       function success(selection$$1) {
81297           var header = selection$$1
81298               .append('div')
81299               .attr('class', 'header fillL');
81300
81301           header
81302               .append('button')
81303               .attr('class', 'fr')
81304               .on('click', function() { dispatch$$1.call('cancel'); })
81305               .call(svgIcon('#iD-icon-close'));
81306
81307           header
81308               .append('h3')
81309               .text(t('success.just_edited'));
81310
81311           var body = selection$$1
81312               .append('div')
81313               .attr('class', 'body save-success fillL');
81314
81315           var summary = body
81316               .append('div')
81317               .attr('class', 'save-summary');
81318
81319           summary
81320               .append('h3')
81321               .text(t('success.thank_you' + (_location ? '_location' : ''), { where: _location }));
81322
81323           summary
81324               .append('p')
81325               .text(t('success.help_html'))
81326               .append('a')
81327               .attr('class', 'link-out')
81328               .attr('target', '_blank')
81329               .attr('tabindex', -1)
81330               .attr('href', t('success.help_link_url'))
81331               .call(svgIcon('#iD-icon-out-link', 'inline'))
81332               .append('span')
81333               .text(t('success.help_link_text'));
81334
81335           var osm = context.connection();
81336           if (!osm) return;
81337
81338           var changesetURL = osm.changesetURL(_changeset.id);
81339
81340           var table = summary
81341               .append('table')
81342               .attr('class', 'summary-table');
81343
81344           var row = table
81345               .append('tr')
81346               .attr('class', 'summary-row');
81347
81348           row
81349               .append('td')
81350               .attr('class', 'cell-icon summary-icon')
81351               .append('a')
81352               .attr('target', '_blank')
81353               .attr('href', changesetURL)
81354               .append('svg')
81355               .attr('class', 'logo-small')
81356               .append('use')
81357               .attr('xlink:href', '#iD-logo-osm');
81358
81359           var summaryDetail = row
81360               .append('td')
81361               .attr('class', 'cell-detail summary-detail');
81362
81363           summaryDetail
81364               .append('a')
81365               .attr('class', 'cell-detail summary-view-on-osm')
81366               .attr('target', '_blank')
81367               .attr('href', changesetURL)
81368               .text(t('success.view_on_osm'));
81369
81370           summaryDetail
81371               .append('div')
81372               .text(t('success.changeset_id', { changeset_id: _changeset.id }));
81373
81374
81375           // Gather community polygon IDs intersecting the map..
81376           var matchFeatures = data.community.query(context.map().center(), true) || [];
81377           var matchIDs = matchFeatures.map(function(feature) { return feature.id; });
81378
81379           // Gather community resources that are either global or match a polygon.
81380           var matchResources = filter(data.community.resources, function(v) {
81381               return !v.featureId || matchIDs.indexOf(v.featureId) !== -1;
81382           });
81383
81384           if (matchResources.length) {
81385               // sort by size ascending, then by community rank
81386               matchResources.sort(function(a, b) {
81387                   var aSize = Infinity;
81388                   var bSize = Infinity;
81389                   var aRank = COMMUNITYRANK[a.type] || 0;
81390                   var bRank = COMMUNITYRANK[b.type] || 0;
81391
81392                   if (a.featureId) {
81393                       aSize = data.community.features[a.featureId].properties.area;
81394                   }
81395                   if (b.featureId) {
81396                       bSize = data.community.features[b.featureId].properties.area;
81397                   }
81398
81399                   return aSize < bSize ? -1 : aSize > bSize ? 1 : bRank - aRank;
81400               });
81401
81402               body
81403                   .call(showCommunityLinks, matchResources);
81404           }
81405       }
81406
81407
81408       function showCommunityLinks(selection$$1, matchResources) {
81409           var communityLinks = selection$$1
81410               .append('div')
81411               .attr('class', 'save-communityLinks');
81412
81413           communityLinks
81414               .append('h3')
81415               .text(t('success.like_osm'));
81416
81417           var table = communityLinks
81418               .append('table')
81419               .attr('class', 'community-table');
81420
81421           var row = table.selectAll('.community-row')
81422               .data(matchResources);
81423
81424           var rowEnter = row.enter()
81425               .append('tr')
81426               .attr('class', 'community-row');
81427
81428           rowEnter
81429               .append('td')
81430               .attr('class', 'cell-icon community-icon')
81431               .append('a')
81432               .attr('target', '_blank')
81433               .attr('href', function(d) { return d.url; })
81434               .append('svg')
81435               .attr('class', 'logo-small')
81436               .append('use')
81437               .attr('xlink:href', function(d) { return '#community-' + d.type; });
81438
81439           var communityDetail = rowEnter
81440               .append('td')
81441               .attr('class', 'cell-detail community-detail');
81442
81443           communityDetail
81444               .each(showCommunityDetails);
81445
81446           communityLinks
81447               .append('div')
81448               .attr('class', 'community-missing')
81449               .text(t('success.missing'))
81450               .append('a')
81451               .attr('class', 'link-out')
81452               .attr('target', '_blank')
81453               .attr('tabindex', -1)
81454               .call(svgIcon('#iD-icon-out-link', 'inline'))
81455               .attr('href', 'https://github.com/osmlab/osm-community-index/issues')
81456               .append('span')
81457               .text(t('success.tell_us'));
81458       }
81459
81460
81461       function showCommunityDetails(d) {
81462           var selection$$1 = select(this);
81463           var communityID = d.id;
81464           var replacements = {
81465               url: linkify(d.url),
81466               signupUrl: linkify(d.signupUrl || d.url)
81467           };
81468
81469           selection$$1
81470               .append('div')
81471               .attr('class', 'community-name')
81472               .append('a')
81473               .attr('target', '_blank')
81474               .attr('href', d.url)
81475               .text(t('community.' + d.id + '.name'));
81476
81477           var descriptionHTML = t('community.' + d.id + '.description', replacements);
81478
81479           if (d.type === 'reddit') {   // linkify subreddits  #4997
81480               descriptionHTML = descriptionHTML
81481                   .replace(/(\/r\/\w*\/*)/i, function(match) { return linkify(d.url, match); });
81482           }
81483
81484           selection$$1
81485               .append('div')
81486               .attr('class', 'community-description')
81487               .html(descriptionHTML);
81488
81489           if (d.extendedDescription || (d.languageCodes && d.languageCodes.length)) {
81490               selection$$1
81491                   .append('div')
81492                   .call(uiDisclosure(context, 'community-more-' + d.id, false)
81493                       .expanded(false)
81494                       .updatePreference(false)
81495                       .title(t('success.more'))
81496                       .content(showMore)
81497                   );
81498           }
81499
81500           var nextEvents = (d.events || [])
81501               .map(function(event$$1) {
81502                   event$$1.date = parseEventDate(event$$1.when);
81503                   return event$$1;
81504               })
81505               .filter(function(event$$1) {               // date is valid and future (or today)
81506                   var t$$1 = event$$1.date.getTime();
81507                   var now = (new Date()).setHours(0,0,0,0);
81508                   return !isNaN(t$$1) && t$$1 >= now;
81509               })
81510               .sort(function(a, b) {                  // sort by date ascending
81511                   return a.date < b.date ? -1 : a.date > b.date ? 1 : 0;
81512               })
81513               .slice(0, MAXEVENTS);                   // limit number of events shown
81514
81515           if (nextEvents.length) {
81516               selection$$1
81517                   .append('div')
81518                   .call(uiDisclosure(context, 'community-events-' + d.id, false)
81519                       .expanded(false)
81520                       .updatePreference(false)
81521                       .title(t('success.events'))
81522                       .content(showNextEvents)
81523                   )
81524                   .select('.hide-toggle')
81525                   .append('span')
81526                   .attr('class', 'badge-text')
81527                   .text(nextEvents.length);
81528           }
81529
81530
81531           function showMore(selection$$1) {
81532               var more = selection$$1
81533                   .append('div')
81534                   .attr('class', 'community-more');
81535
81536               if (d.extendedDescription) {
81537                   more
81538                       .append('div')
81539                       .attr('class', 'community-extended-description')
81540                       .html(t('community.' + d.id + '.extendedDescription', replacements));
81541               }
81542
81543               if (d.languageCodes && d.languageCodes.length) {
81544                   more
81545                       .append('div')
81546                       .attr('class', 'community-languages')
81547                       .text(t('success.languages', { languages: d.languageCodes.join(', ') }));
81548               }
81549           }
81550
81551
81552           function showNextEvents(selection$$1) {
81553               var events = selection$$1
81554                   .append('div')
81555                   .attr('class', 'community-events');
81556
81557               var item = events.selectAll('.community-event')
81558                   .data(nextEvents);
81559
81560               var itemEnter = item.enter()
81561                   .append('div')
81562                   .attr('class', 'community-event');
81563
81564               itemEnter
81565                   .append('div')
81566                   .attr('class', 'community-event-name')
81567                   .append('a')
81568                   .attr('target', '_blank')
81569                   .attr('href', function(d) { return d.url; })
81570                   .text(function(d) {
81571                       var name = d.name;
81572                       if (d.i18n && d.id) {
81573                           name = t('community.' + communityID + '.events.' + d.id + '.name', { default: name });
81574                       }
81575                       return name;
81576                   });
81577
81578               itemEnter
81579                   .append('div')
81580                   .attr('class', 'community-event-when')
81581                   .text(function(d) {
81582                       var options = {
81583                           weekday: 'short', day: 'numeric', month: 'short', year: 'numeric'
81584                       };
81585                       if (d.date.getHours() || d.date.getMinutes()) {   // include time if it has one
81586                           options.hour = 'numeric';
81587                           options.minute = 'numeric';
81588                       }
81589                       return d.date.toLocaleString(detected.locale, options);
81590                   });
81591
81592               itemEnter
81593                   .append('div')
81594                   .attr('class', 'community-event-where')
81595                   .text(function(d) {
81596                       var where = d.where;
81597                       if (d.i18n && d.id) {
81598                           where = t('community.' + communityID + '.events.' + d.id + '.where', { default: where });
81599                       }
81600                       return where;
81601                   });
81602
81603               itemEnter
81604                   .append('div')
81605                   .attr('class', 'community-event-description')
81606                   .text(function(d) {
81607                       var description = d.description;
81608                       if (d.i18n && d.id) {
81609                           description = t('community.' + communityID + '.events.' + d.id + '.description', { default: description });
81610                       }
81611                       return description;
81612                   });
81613           }
81614
81615
81616           function linkify(url, text) {
81617               text = text || url;
81618               return '<a target="_blank" href="' + url + '">' + text + '</a>';
81619           }
81620       }
81621
81622
81623       success.changeset = function(_) {
81624           if (!arguments.length) return _changeset;
81625           _changeset = _;
81626           return success;
81627       };
81628
81629
81630       success.location = function(_) {
81631           if (!arguments.length) return _location;
81632           _location = _;
81633           return success;
81634       };
81635
81636
81637       return utilRebind(success, dispatch$$1, 'on');
81638   }
81639
81640   function coreHistory(context) {
81641       var imageryUsed = ['Bing'];
81642       var dispatch$$1 = dispatch('change', 'undone', 'redone');
81643       var lock = utilSessionMutex('lock');
81644       var duration = 150;
81645       var _checkpoints = {};
81646       var _stack;
81647       var _index;
81648       var _tree;
81649
81650
81651       // internal _act, accepts list of actions and eased time
81652       function _act(actions, t) {
81653           actions = Array.prototype.slice.call(actions);
81654
81655           var annotation;
81656           if (!isFunction(actions[actions.length - 1])) {
81657               annotation = actions.pop();
81658           }
81659
81660           _stack[_index].transform = context.projection.transform();
81661           _stack[_index].selectedIDs = context.selectedIDs();
81662
81663           var graph = _stack[_index].graph;
81664           for (var i = 0; i < actions.length; i++) {
81665               graph = actions[i](graph, t);
81666           }
81667
81668           return {
81669               graph: graph,
81670               annotation: annotation,
81671               imageryUsed: imageryUsed
81672           };
81673       }
81674
81675
81676       // internal _perform with eased time
81677       function _perform(args, t) {
81678           var previous = _stack[_index].graph;
81679           _stack = _stack.slice(0, _index + 1);
81680           _stack.push(_act(args, t));
81681           _index++;
81682           return change(previous);
81683       }
81684
81685
81686       // internal _replace with eased time
81687       function _replace(args, t) {
81688           var previous = _stack[_index].graph;
81689           // assert(_index == _stack.length - 1)
81690           _stack[_index] = _act(args, t);
81691           return change(previous);
81692       }
81693
81694
81695       // internal _overwrite with eased time
81696       function _overwrite(args, t) {
81697           var previous = _stack[_index].graph;
81698           if (_index > 0) {
81699               _index--;
81700               _stack.pop();
81701           }
81702           _stack = _stack.slice(0, _index + 1);
81703           _stack.push(_act(args, t));
81704           _index++;
81705           return change(previous);
81706       }
81707
81708
81709       // determine diffrence and dispatch a change event
81710       function change(previous) {
81711           var difference$$1 = coreDifference(previous, history.graph());
81712           dispatch$$1.call('change', this, difference$$1);
81713           return difference$$1;
81714       }
81715
81716
81717       // iD uses namespaced keys so multiple installations do not conflict
81718       function getKey(n) {
81719           return 'iD_' + window.location.origin + '_' + n;
81720       }
81721
81722
81723       var history = {
81724
81725           graph: function() {
81726               return _stack[_index].graph;
81727           },
81728
81729
81730           base: function() {
81731               return _stack[0].graph;
81732           },
81733
81734
81735           merge: function(entities, extent) {
81736               _stack[0].graph.rebase(entities, map$3(_stack, 'graph'), false);
81737               _tree.rebase(entities, false);
81738
81739               dispatch$$1.call('change', this, undefined, extent);
81740           },
81741
81742
81743           perform: function() {
81744               // complete any transition already in progress
81745               select(document).interrupt('history.perform');
81746
81747               var transitionable = false;
81748               var action0 = arguments[0];
81749
81750               if (arguments.length === 1 ||
81751                   arguments.length === 2 && !isFunction(arguments[1])) {
81752                   transitionable = !!action0.transitionable;
81753               }
81754
81755               if (transitionable) {
81756                   var origArguments = arguments;
81757                   select(document)
81758                       .transition('history.perform')
81759                       .duration(duration)
81760                       .ease(linear$1)
81761                       .tween('history.tween', function() {
81762                           return function(t) {
81763                               if (t < 1) _overwrite([action0], t);
81764                           };
81765                       })
81766                       .on('start', function() {
81767                           _perform([action0], 0);
81768                       })
81769                       .on('end interrupt', function() {
81770                           _overwrite(origArguments, 1);
81771                       });
81772
81773               } else {
81774                   return _perform(arguments);
81775               }
81776           },
81777
81778
81779           replace: function() {
81780               select(document).interrupt('history.perform');
81781               return _replace(arguments, 1);
81782           },
81783
81784
81785           // Same as calling pop and then perform
81786           overwrite: function() {
81787               select(document).interrupt('history.perform');
81788               return _overwrite(arguments, 1);
81789           },
81790
81791
81792           pop: function(n) {
81793               select(document).interrupt('history.perform');
81794
81795               var previous = _stack[_index].graph;
81796               if (isNaN(+n) || +n < 0) {
81797                   n = 1;
81798               }
81799               while (n-- > 0 && _index > 0) {
81800                   _index--;
81801                   _stack.pop();
81802               }
81803               return change(previous);
81804           },
81805
81806
81807           // Back to the previous annotated state or _index = 0.
81808           undo: function() {
81809               select(document).interrupt('history.perform');
81810
81811               var previous = _stack[_index].graph;
81812               while (_index > 0) {
81813                   _index--;
81814                   if (_stack[_index].annotation) break;
81815               }
81816
81817               dispatch$$1.call('undone', this, _stack[_index]);
81818               return change(previous);
81819           },
81820
81821
81822           // Forward to the next annotated state.
81823           redo: function() {
81824               select(document).interrupt('history.perform');
81825
81826               var previous = _stack[_index].graph;
81827               var tryIndex = _index;
81828               while (tryIndex < _stack.length - 1) {
81829                   tryIndex++;
81830                   if (_stack[tryIndex].annotation) {
81831                       _index = tryIndex;
81832                       dispatch$$1.call('redone', this, _stack[_index]);
81833                       break;
81834                   }
81835               }
81836
81837               return change(previous);
81838           },
81839
81840
81841           undoAnnotation: function() {
81842               var i = _index;
81843               while (i >= 0) {
81844                   if (_stack[i].annotation) return _stack[i].annotation;
81845                   i--;
81846               }
81847           },
81848
81849
81850           redoAnnotation: function() {
81851               var i = _index + 1;
81852               while (i <= _stack.length - 1) {
81853                   if (_stack[i].annotation) return _stack[i].annotation;
81854                   i++;
81855               }
81856           },
81857
81858
81859           intersects: function(extent) {
81860               return _tree.intersects(extent, _stack[_index].graph);
81861           },
81862
81863
81864           difference: function() {
81865               var base = _stack[0].graph;
81866               var head = _stack[_index].graph;
81867               return coreDifference(base, head);
81868           },
81869
81870
81871           changes: function(action) {
81872               var base = _stack[0].graph;
81873               var head = _stack[_index].graph;
81874
81875               if (action) {
81876                   head = action(head);
81877               }
81878
81879               var difference$$1 = coreDifference(base, head);
81880
81881               return {
81882                   modified: difference$$1.modified(),
81883                   created: difference$$1.created(),
81884                   deleted: difference$$1.deleted()
81885               };
81886           },
81887
81888
81889           validate: function(changes) {
81890               return flatten(
81891                   map$3(Validations, function(fn) { return fn()(changes, _stack[_index].graph); })
81892               );
81893           },
81894
81895
81896           hasChanges: function() {
81897               return this.difference().length() > 0;
81898           },
81899
81900
81901           imageryUsed: function(sources) {
81902               if (sources) {
81903                   imageryUsed = sources;
81904                   return history;
81905               } else {
81906                   var arr = map$3(_stack.slice(1, _index + 1), 'imageryUsed');
81907                   return without(uniq(flatten(arr)), 'Custom');
81908               }
81909           },
81910
81911
81912           // save the current history state
81913           checkpoint: function(key) {
81914               _checkpoints[key] = {
81915                   stack: cloneDeep(_stack),
81916                   index: _index
81917               };
81918               return history;
81919           },
81920
81921
81922           // restore history state to a given checkpoint or reset completely
81923           reset: function(key) {
81924               if (key !== undefined && _checkpoints.hasOwnProperty(key)) {
81925                   _stack = cloneDeep(_checkpoints[key].stack);
81926                   _index = _checkpoints[key].index;
81927               } else {
81928                   _stack = [{graph: coreGraph$$1()}];
81929                   _index = 0;
81930                   _tree = coreTree(_stack[0].graph);
81931                   _checkpoints = {};
81932               }
81933               dispatch$$1.call('change');
81934               return history;
81935           },
81936
81937
81938           toIntroGraph: function() {
81939               var nextId = { n: 0, r: 0, w: 0 };
81940               var permIds = {};
81941               var graph = this.graph();
81942               var baseEntities = {};
81943
81944               // clone base entities..
81945               forEach(graph.base().entities, function(entity) {
81946                   var copy = cloneDeepWith(entity, customizer);
81947                   baseEntities[copy.id] = copy;
81948               });
81949
81950               // replace base entities with head entities..
81951               forEach(graph.entities, function(entity, id) {
81952                   if (entity) {
81953                       var copy = cloneDeepWith(entity, customizer);
81954                       baseEntities[copy.id] = copy;
81955                   } else {
81956                       delete baseEntities[id];
81957                   }
81958               });
81959
81960               // swap temporary for permanent ids..
81961               forEach(baseEntities, function(entity) {
81962                   if (Array.isArray(entity.nodes)) {
81963                       entity.nodes = entity.nodes.map(function(node) {
81964                           return permIds[node] || node;
81965                       });
81966                   }
81967                   if (Array.isArray(entity.members)) {
81968                       entity.members = entity.members.map(function(member) {
81969                           member.id = permIds[member.id] || member.id;
81970                           return member;
81971                       });
81972                   }
81973               });
81974
81975               return JSON.stringify({ dataIntroGraph: baseEntities });
81976
81977
81978               function customizer(src) {
81979                   var copy = omit(cloneDeep(src), ['type', 'user', 'v', 'version', 'visible']);
81980                   if (isEmpty(copy.tags)) {
81981                       delete copy.tags;
81982                   }
81983
81984                   if (Array.isArray(copy.loc)) {
81985                       copy.loc[0] = +copy.loc[0].toFixed(6);
81986                       copy.loc[1] = +copy.loc[1].toFixed(6);
81987                   }
81988
81989                   var match = src.id.match(/([nrw])-\d*/);  // temporary id
81990                   if (match !== null) {
81991                       var nrw = match[1], permId;
81992                       do { permId = nrw + (++nextId[nrw]); }
81993                       while (baseEntities.hasOwnProperty(permId));
81994
81995                       copy.id = permIds[src.id] = permId;
81996                   }
81997                   return copy;
81998               }
81999           },
82000
82001
82002           toJSON: function() {
82003               if (!this.hasChanges()) return;
82004
82005               var allEntities = {};
82006               var baseEntities = {};
82007               var base = _stack[0];
82008
82009               var s = _stack.map(function(i) {
82010                   var modified = [], deleted = [];
82011
82012                   forEach(i.graph.entities, function(entity, id) {
82013                       if (entity) {
82014                           var key = osmEntity$$1.key(entity);
82015                           allEntities[key] = entity;
82016                           modified.push(key);
82017                       } else {
82018                           deleted.push(id);
82019                       }
82020
82021                       // make sure that the originals of changed or deleted entities get merged
82022                       // into the base of the _stack after restoring the data from JSON.
82023                       if (id in base.graph.entities) {
82024                           baseEntities[id] = base.graph.entities[id];
82025                       }
82026                       // get originals of parent entities too
82027                       forEach(base.graph._parentWays[id], function(parentId) {
82028                           if (parentId in base.graph.entities) {
82029                               baseEntities[parentId] = base.graph.entities[parentId];
82030                           }
82031                       });
82032                   });
82033
82034                   var x = {};
82035
82036                   if (modified.length) x.modified = modified;
82037                   if (deleted.length) x.deleted = deleted;
82038                   if (i.imageryUsed) x.imageryUsed = i.imageryUsed;
82039                   if (i.annotation) x.annotation = i.annotation;
82040
82041                   return x;
82042               });
82043
82044               return JSON.stringify({
82045                   version: 3,
82046                   entities: values$1(allEntities),
82047                   baseEntities: values$1(baseEntities),
82048                   stack: s,
82049                   nextIDs: osmEntity$$1.id.next,
82050                   index: _index
82051               });
82052           },
82053
82054
82055           fromJSON: function(json, loadChildNodes) {
82056               var h = JSON.parse(json);
82057               var loadComplete = true;
82058
82059               osmEntity$$1.id.next = h.nextIDs;
82060               _index = h.index;
82061
82062               if (h.version === 2 || h.version === 3) {
82063                   var allEntities = {};
82064
82065                   h.entities.forEach(function(entity) {
82066                       allEntities[osmEntity$$1.key(entity)] = osmEntity$$1(entity);
82067                   });
82068
82069                   if (h.version === 3) {
82070                       // This merges originals for changed entities into the base of
82071                       // the _stack even if the current _stack doesn't have them (for
82072                       // example when iD has been restarted in a different region)
82073                       var baseEntities = h.baseEntities.map(function(d) { return osmEntity$$1(d); });
82074                       _stack[0].graph.rebase(baseEntities, map$3(_stack, 'graph'), true);
82075                       _tree.rebase(baseEntities, true);
82076
82077                       // When we restore a modified way, we also need to fetch any missing
82078                       // childnodes that would normally have been downloaded with it.. #2142
82079                       if (loadChildNodes) {
82080                           var osm = context.connection();
82081                           var nodes = flatten(uniq(map$3(filter(baseEntities, { type: 'way' }), 'nodes')));
82082                           var missing = reject(nodes, function(n) { return _stack[0].graph.hasEntity(n); });
82083
82084                           if (!isEmpty(missing) && osm) {
82085                               loadComplete = false;
82086                               context.redrawEnable(false);
82087
82088                               var loading = uiLoading(context).blocking(true);
82089                               context.container().call(loading);
82090
82091                               var childNodesLoaded = function(err, result) {
82092                                   if (!err) {
82093                                       var visible = groupBy(result.data, 'visible');
82094                                       if (!isEmpty(visible.true)) {
82095                                           missing = difference(missing, map$3(visible.true, 'id'));
82096                                           _stack[0].graph.rebase(visible.true, map$3(_stack, 'graph'), true);
82097                                           _tree.rebase(visible.true, true);
82098                                       }
82099
82100                                       // fetch older versions of nodes that were deleted..
82101                                       forEach(visible.false, function(entity) {
82102                                           osm.loadEntityVersion(entity.id, +entity.version - 1, childNodesLoaded);
82103                                       });
82104                                   }
82105
82106                                   if (err || isEmpty(missing)) {
82107                                       loading.close();
82108                                       context.redrawEnable(true);
82109                                       dispatch$$1.call('change');
82110                                   }
82111                               };
82112
82113                               osm.loadMultiple(missing, childNodesLoaded);
82114                           }
82115                       }
82116                   }
82117
82118                   _stack = h.stack.map(function(d) {
82119                       var entities = {}, entity;
82120
82121                       if (d.modified) {
82122                           d.modified.forEach(function(key) {
82123                               entity = allEntities[key];
82124                               entities[entity.id] = entity;
82125                           });
82126                       }
82127
82128                       if (d.deleted) {
82129                           d.deleted.forEach(function(id) {
82130                               entities[id] = undefined;
82131                           });
82132                       }
82133
82134                       return {
82135                           graph: coreGraph$$1(_stack[0].graph).load(entities),
82136                           annotation: d.annotation,
82137                           imageryUsed: d.imageryUsed
82138                       };
82139                   });
82140
82141               } else { // original version
82142                   _stack = h.stack.map(function(d) {
82143                       var entities = {};
82144
82145                       for (var i in d.entities) {
82146                           var entity = d.entities[i];
82147                           entities[i] = entity === 'undefined' ? undefined : osmEntity$$1(entity);
82148                       }
82149
82150                       d.graph = coreGraph$$1(_stack[0].graph).load(entities);
82151                       return d;
82152                   });
82153               }
82154
82155               if (loadComplete) {
82156                   dispatch$$1.call('change');
82157               }
82158
82159               return history;
82160           },
82161
82162
82163           save: function() {
82164               if (lock.locked()) context.storage(getKey('saved_history'), history.toJSON() || null);
82165               return history;
82166           },
82167
82168
82169           clearSaved: function() {
82170               context.debouncedSave.cancel();
82171               if (lock.locked()) context.storage(getKey('saved_history'), null);
82172               return history;
82173           },
82174
82175
82176           lock: function() {
82177               return lock.lock();
82178           },
82179
82180
82181           unlock: function() {
82182               lock.unlock();
82183           },
82184
82185
82186           // is iD not open in another window and it detects that
82187           // there's a history stored in localStorage that's recoverable?
82188           restorableChanges: function() {
82189               return lock.locked() && !!context.storage(getKey('saved_history'));
82190           },
82191
82192
82193           // load history from a version stored in localStorage
82194           restore: function() {
82195               if (!lock.locked()) return;
82196
82197               var json = context.storage(getKey('saved_history'));
82198               if (json) history.fromJSON(json, true);
82199           },
82200
82201
82202           _getKey: getKey
82203
82204       };
82205
82206
82207       history.reset();
82208
82209       return utilRebind(history, dispatch$$1, 'on');
82210   }
82211
82212   /** Used to store function metadata. */
82213   var metaMap = WeakMap && new WeakMap;
82214
82215   /**
82216    * The base implementation of `setData` without support for hot loop shorting.
82217    *
82218    * @private
82219    * @param {Function} func The function to associate metadata with.
82220    * @param {*} data The metadata.
82221    * @returns {Function} Returns `func`.
82222    */
82223   var baseSetData = !metaMap ? identity$8 : function(func, data) {
82224     metaMap.set(func, data);
82225     return func;
82226   };
82227
82228   /**
82229    * Creates a function that produces an instance of `Ctor` regardless of
82230    * whether it was invoked as part of a `new` expression or by `call` or `apply`.
82231    *
82232    * @private
82233    * @param {Function} Ctor The constructor to wrap.
82234    * @returns {Function} Returns the new wrapped function.
82235    */
82236   function createCtor(Ctor) {
82237     return function() {
82238       // Use a `switch` statement to work with class constructors. See
82239       // http://ecma-international.org/ecma-262/7.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist
82240       // for more details.
82241       var args = arguments;
82242       switch (args.length) {
82243         case 0: return new Ctor;
82244         case 1: return new Ctor(args[0]);
82245         case 2: return new Ctor(args[0], args[1]);
82246         case 3: return new Ctor(args[0], args[1], args[2]);
82247         case 4: return new Ctor(args[0], args[1], args[2], args[3]);
82248         case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);
82249         case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);
82250         case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);
82251       }
82252       var thisBinding = baseCreate(Ctor.prototype),
82253           result = Ctor.apply(thisBinding, args);
82254
82255       // Mimic the constructor's `return` behavior.
82256       // See https://es5.github.io/#x13.2.2 for more details.
82257       return isObject(result) ? result : thisBinding;
82258     };
82259   }
82260
82261   /** Used to compose bitmasks for function metadata. */
82262   var WRAP_BIND_FLAG = 1;
82263
82264   /**
82265    * Creates a function that wraps `func` to invoke it with the optional `this`
82266    * binding of `thisArg`.
82267    *
82268    * @private
82269    * @param {Function} func The function to wrap.
82270    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82271    * @param {*} [thisArg] The `this` binding of `func`.
82272    * @returns {Function} Returns the new wrapped function.
82273    */
82274   function createBind(func, bitmask, thisArg) {
82275     var isBind = bitmask & WRAP_BIND_FLAG,
82276         Ctor = createCtor(func);
82277
82278     function wrapper() {
82279       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
82280       return fn.apply(isBind ? thisArg : this, arguments);
82281     }
82282     return wrapper;
82283   }
82284
82285   /* Built-in method references for those with the same name as other `lodash` methods. */
82286   var nativeMax$5 = Math.max;
82287
82288   /**
82289    * Creates an array that is the composition of partially applied arguments,
82290    * placeholders, and provided arguments into a single array of arguments.
82291    *
82292    * @private
82293    * @param {Array} args The provided arguments.
82294    * @param {Array} partials The arguments to prepend to those provided.
82295    * @param {Array} holders The `partials` placeholder indexes.
82296    * @params {boolean} [isCurried] Specify composing for a curried function.
82297    * @returns {Array} Returns the new array of composed arguments.
82298    */
82299   function composeArgs(args, partials, holders, isCurried) {
82300     var argsIndex = -1,
82301         argsLength = args.length,
82302         holdersLength = holders.length,
82303         leftIndex = -1,
82304         leftLength = partials.length,
82305         rangeLength = nativeMax$5(argsLength - holdersLength, 0),
82306         result = Array(leftLength + rangeLength),
82307         isUncurried = !isCurried;
82308
82309     while (++leftIndex < leftLength) {
82310       result[leftIndex] = partials[leftIndex];
82311     }
82312     while (++argsIndex < holdersLength) {
82313       if (isUncurried || argsIndex < argsLength) {
82314         result[holders[argsIndex]] = args[argsIndex];
82315       }
82316     }
82317     while (rangeLength--) {
82318       result[leftIndex++] = args[argsIndex++];
82319     }
82320     return result;
82321   }
82322
82323   /* Built-in method references for those with the same name as other `lodash` methods. */
82324   var nativeMax$6 = Math.max;
82325
82326   /**
82327    * This function is like `composeArgs` except that the arguments composition
82328    * is tailored for `_.partialRight`.
82329    *
82330    * @private
82331    * @param {Array} args The provided arguments.
82332    * @param {Array} partials The arguments to append to those provided.
82333    * @param {Array} holders The `partials` placeholder indexes.
82334    * @params {boolean} [isCurried] Specify composing for a curried function.
82335    * @returns {Array} Returns the new array of composed arguments.
82336    */
82337   function composeArgsRight(args, partials, holders, isCurried) {
82338     var argsIndex = -1,
82339         argsLength = args.length,
82340         holdersIndex = -1,
82341         holdersLength = holders.length,
82342         rightIndex = -1,
82343         rightLength = partials.length,
82344         rangeLength = nativeMax$6(argsLength - holdersLength, 0),
82345         result = Array(rangeLength + rightLength),
82346         isUncurried = !isCurried;
82347
82348     while (++argsIndex < rangeLength) {
82349       result[argsIndex] = args[argsIndex];
82350     }
82351     var offset = argsIndex;
82352     while (++rightIndex < rightLength) {
82353       result[offset + rightIndex] = partials[rightIndex];
82354     }
82355     while (++holdersIndex < holdersLength) {
82356       if (isUncurried || argsIndex < argsLength) {
82357         result[offset + holders[holdersIndex]] = args[argsIndex++];
82358       }
82359     }
82360     return result;
82361   }
82362
82363   /**
82364    * Gets the number of `placeholder` occurrences in `array`.
82365    *
82366    * @private
82367    * @param {Array} array The array to inspect.
82368    * @param {*} placeholder The placeholder to search for.
82369    * @returns {number} Returns the placeholder count.
82370    */
82371   function countHolders(array, placeholder) {
82372     var length = array.length,
82373         result = 0;
82374
82375     while (length--) {
82376       if (array[length] === placeholder) {
82377         ++result;
82378       }
82379     }
82380     return result;
82381   }
82382
82383   /**
82384    * The function whose prototype chain sequence wrappers inherit from.
82385    *
82386    * @private
82387    */
82388   function baseLodash() {
82389     // No operation performed.
82390   }
82391
82392   /** Used as references for the maximum length and index of an array. */
82393   var MAX_ARRAY_LENGTH = 4294967295;
82394
82395   /**
82396    * Creates a lazy wrapper object which wraps `value` to enable lazy evaluation.
82397    *
82398    * @private
82399    * @constructor
82400    * @param {*} value The value to wrap.
82401    */
82402   function LazyWrapper(value) {
82403     this.__wrapped__ = value;
82404     this.__actions__ = [];
82405     this.__dir__ = 1;
82406     this.__filtered__ = false;
82407     this.__iteratees__ = [];
82408     this.__takeCount__ = MAX_ARRAY_LENGTH;
82409     this.__views__ = [];
82410   }
82411
82412   // Ensure `LazyWrapper` is an instance of `baseLodash`.
82413   LazyWrapper.prototype = baseCreate(baseLodash.prototype);
82414   LazyWrapper.prototype.constructor = LazyWrapper;
82415
82416   /**
82417    * Gets metadata for `func`.
82418    *
82419    * @private
82420    * @param {Function} func The function to query.
82421    * @returns {*} Returns the metadata for `func`.
82422    */
82423   var getData = !metaMap ? noop$3 : function(func) {
82424     return metaMap.get(func);
82425   };
82426
82427   /** Used to lookup unminified function names. */
82428   var realNames = {};
82429
82430   /** Used for built-in method references. */
82431   var objectProto$k = Object.prototype;
82432
82433   /** Used to check objects for own properties. */
82434   var hasOwnProperty$h = objectProto$k.hasOwnProperty;
82435
82436   /**
82437    * Gets the name of `func`.
82438    *
82439    * @private
82440    * @param {Function} func The function to query.
82441    * @returns {string} Returns the function name.
82442    */
82443   function getFuncName(func) {
82444     var result = (func.name + ''),
82445         array = realNames[result],
82446         length = hasOwnProperty$h.call(realNames, result) ? array.length : 0;
82447
82448     while (length--) {
82449       var data = array[length],
82450           otherFunc = data.func;
82451       if (otherFunc == null || otherFunc == func) {
82452         return data.name;
82453       }
82454     }
82455     return result;
82456   }
82457
82458   /**
82459    * The base constructor for creating `lodash` wrapper objects.
82460    *
82461    * @private
82462    * @param {*} value The value to wrap.
82463    * @param {boolean} [chainAll] Enable explicit method chain sequences.
82464    */
82465   function LodashWrapper(value, chainAll) {
82466     this.__wrapped__ = value;
82467     this.__actions__ = [];
82468     this.__chain__ = !!chainAll;
82469     this.__index__ = 0;
82470     this.__values__ = undefined;
82471   }
82472
82473   LodashWrapper.prototype = baseCreate(baseLodash.prototype);
82474   LodashWrapper.prototype.constructor = LodashWrapper;
82475
82476   /**
82477    * Creates a clone of `wrapper`.
82478    *
82479    * @private
82480    * @param {Object} wrapper The wrapper to clone.
82481    * @returns {Object} Returns the cloned wrapper.
82482    */
82483   function wrapperClone(wrapper) {
82484     if (wrapper instanceof LazyWrapper) {
82485       return wrapper.clone();
82486     }
82487     var result = new LodashWrapper(wrapper.__wrapped__, wrapper.__chain__);
82488     result.__actions__ = copyArray(wrapper.__actions__);
82489     result.__index__  = wrapper.__index__;
82490     result.__values__ = wrapper.__values__;
82491     return result;
82492   }
82493
82494   /** Used for built-in method references. */
82495   var objectProto$l = Object.prototype;
82496
82497   /** Used to check objects for own properties. */
82498   var hasOwnProperty$i = objectProto$l.hasOwnProperty;
82499
82500   /**
82501    * Creates a `lodash` object which wraps `value` to enable implicit method
82502    * chain sequences. Methods that operate on and return arrays, collections,
82503    * and functions can be chained together. Methods that retrieve a single value
82504    * or may return a primitive value will automatically end the chain sequence
82505    * and return the unwrapped value. Otherwise, the value must be unwrapped
82506    * with `_#value`.
82507    *
82508    * Explicit chain sequences, which must be unwrapped with `_#value`, may be
82509    * enabled using `_.chain`.
82510    *
82511    * The execution of chained methods is lazy, that is, it's deferred until
82512    * `_#value` is implicitly or explicitly called.
82513    *
82514    * Lazy evaluation allows several methods to support shortcut fusion.
82515    * Shortcut fusion is an optimization to merge iteratee calls; this avoids
82516    * the creation of intermediate arrays and can greatly reduce the number of
82517    * iteratee executions. Sections of a chain sequence qualify for shortcut
82518    * fusion if the section is applied to an array and iteratees accept only
82519    * one argument. The heuristic for whether a section qualifies for shortcut
82520    * fusion is subject to change.
82521    *
82522    * Chaining is supported in custom builds as long as the `_#value` method is
82523    * directly or indirectly included in the build.
82524    *
82525    * In addition to lodash methods, wrappers have `Array` and `String` methods.
82526    *
82527    * The wrapper `Array` methods are:
82528    * `concat`, `join`, `pop`, `push`, `shift`, `sort`, `splice`, and `unshift`
82529    *
82530    * The wrapper `String` methods are:
82531    * `replace` and `split`
82532    *
82533    * The wrapper methods that support shortcut fusion are:
82534    * `at`, `compact`, `drop`, `dropRight`, `dropWhile`, `filter`, `find`,
82535    * `findLast`, `head`, `initial`, `last`, `map`, `reject`, `reverse`, `slice`,
82536    * `tail`, `take`, `takeRight`, `takeRightWhile`, `takeWhile`, and `toArray`
82537    *
82538    * The chainable wrapper methods are:
82539    * `after`, `ary`, `assign`, `assignIn`, `assignInWith`, `assignWith`, `at`,
82540    * `before`, `bind`, `bindAll`, `bindKey`, `castArray`, `chain`, `chunk`,
82541    * `commit`, `compact`, `concat`, `conforms`, `constant`, `countBy`, `create`,
82542    * `curry`, `debounce`, `defaults`, `defaultsDeep`, `defer`, `delay`,
82543    * `difference`, `differenceBy`, `differenceWith`, `drop`, `dropRight`,
82544    * `dropRightWhile`, `dropWhile`, `extend`, `extendWith`, `fill`, `filter`,
82545    * `flatMap`, `flatMapDeep`, `flatMapDepth`, `flatten`, `flattenDeep`,
82546    * `flattenDepth`, `flip`, `flow`, `flowRight`, `fromPairs`, `functions`,
82547    * `functionsIn`, `groupBy`, `initial`, `intersection`, `intersectionBy`,
82548    * `intersectionWith`, `invert`, `invertBy`, `invokeMap`, `iteratee`, `keyBy`,
82549    * `keys`, `keysIn`, `map`, `mapKeys`, `mapValues`, `matches`, `matchesProperty`,
82550    * `memoize`, `merge`, `mergeWith`, `method`, `methodOf`, `mixin`, `negate`,
82551    * `nthArg`, `omit`, `omitBy`, `once`, `orderBy`, `over`, `overArgs`,
82552    * `overEvery`, `overSome`, `partial`, `partialRight`, `partition`, `pick`,
82553    * `pickBy`, `plant`, `property`, `propertyOf`, `pull`, `pullAll`, `pullAllBy`,
82554    * `pullAllWith`, `pullAt`, `push`, `range`, `rangeRight`, `rearg`, `reject`,
82555    * `remove`, `rest`, `reverse`, `sampleSize`, `set`, `setWith`, `shuffle`,
82556    * `slice`, `sort`, `sortBy`, `splice`, `spread`, `tail`, `take`, `takeRight`,
82557    * `takeRightWhile`, `takeWhile`, `tap`, `throttle`, `thru`, `toArray`,
82558    * `toPairs`, `toPairsIn`, `toPath`, `toPlainObject`, `transform`, `unary`,
82559    * `union`, `unionBy`, `unionWith`, `uniq`, `uniqBy`, `uniqWith`, `unset`,
82560    * `unshift`, `unzip`, `unzipWith`, `update`, `updateWith`, `values`,
82561    * `valuesIn`, `without`, `wrap`, `xor`, `xorBy`, `xorWith`, `zip`,
82562    * `zipObject`, `zipObjectDeep`, and `zipWith`
82563    *
82564    * The wrapper methods that are **not** chainable by default are:
82565    * `add`, `attempt`, `camelCase`, `capitalize`, `ceil`, `clamp`, `clone`,
82566    * `cloneDeep`, `cloneDeepWith`, `cloneWith`, `conformsTo`, `deburr`,
82567    * `defaultTo`, `divide`, `each`, `eachRight`, `endsWith`, `eq`, `escape`,
82568    * `escapeRegExp`, `every`, `find`, `findIndex`, `findKey`, `findLast`,
82569    * `findLastIndex`, `findLastKey`, `first`, `floor`, `forEach`, `forEachRight`,
82570    * `forIn`, `forInRight`, `forOwn`, `forOwnRight`, `get`, `gt`, `gte`, `has`,
82571    * `hasIn`, `head`, `identity`, `includes`, `indexOf`, `inRange`, `invoke`,
82572    * `isArguments`, `isArray`, `isArrayBuffer`, `isArrayLike`, `isArrayLikeObject`,
82573    * `isBoolean`, `isBuffer`, `isDate`, `isElement`, `isEmpty`, `isEqual`,
82574    * `isEqualWith`, `isError`, `isFinite`, `isFunction`, `isInteger`, `isLength`,
82575    * `isMap`, `isMatch`, `isMatchWith`, `isNaN`, `isNative`, `isNil`, `isNull`,
82576    * `isNumber`, `isObject`, `isObjectLike`, `isPlainObject`, `isRegExp`,
82577    * `isSafeInteger`, `isSet`, `isString`, `isUndefined`, `isTypedArray`,
82578    * `isWeakMap`, `isWeakSet`, `join`, `kebabCase`, `last`, `lastIndexOf`,
82579    * `lowerCase`, `lowerFirst`, `lt`, `lte`, `max`, `maxBy`, `mean`, `meanBy`,
82580    * `min`, `minBy`, `multiply`, `noConflict`, `noop`, `now`, `nth`, `pad`,
82581    * `padEnd`, `padStart`, `parseInt`, `pop`, `random`, `reduce`, `reduceRight`,
82582    * `repeat`, `result`, `round`, `runInContext`, `sample`, `shift`, `size`,
82583    * `snakeCase`, `some`, `sortedIndex`, `sortedIndexBy`, `sortedLastIndex`,
82584    * `sortedLastIndexBy`, `startCase`, `startsWith`, `stubArray`, `stubFalse`,
82585    * `stubObject`, `stubString`, `stubTrue`, `subtract`, `sum`, `sumBy`,
82586    * `template`, `times`, `toFinite`, `toInteger`, `toJSON`, `toLength`,
82587    * `toLower`, `toNumber`, `toSafeInteger`, `toString`, `toUpper`, `trim`,
82588    * `trimEnd`, `trimStart`, `truncate`, `unescape`, `uniqueId`, `upperCase`,
82589    * `upperFirst`, `value`, and `words`
82590    *
82591    * @name _
82592    * @constructor
82593    * @category Seq
82594    * @param {*} value The value to wrap in a `lodash` instance.
82595    * @returns {Object} Returns the new `lodash` wrapper instance.
82596    * @example
82597    *
82598    * function square(n) {
82599    *   return n * n;
82600    * }
82601    *
82602    * var wrapped = _([1, 2, 3]);
82603    *
82604    * // Returns an unwrapped value.
82605    * wrapped.reduce(_.add);
82606    * // => 6
82607    *
82608    * // Returns a wrapped value.
82609    * var squares = wrapped.map(square);
82610    *
82611    * _.isArray(squares);
82612    * // => false
82613    *
82614    * _.isArray(squares.value());
82615    * // => true
82616    */
82617   function lodash(value) {
82618     if (isObjectLike(value) && !isArray(value) && !(value instanceof LazyWrapper)) {
82619       if (value instanceof LodashWrapper) {
82620         return value;
82621       }
82622       if (hasOwnProperty$i.call(value, '__wrapped__')) {
82623         return wrapperClone(value);
82624       }
82625     }
82626     return new LodashWrapper(value);
82627   }
82628
82629   // Ensure wrappers are instances of `baseLodash`.
82630   lodash.prototype = baseLodash.prototype;
82631   lodash.prototype.constructor = lodash;
82632
82633   /**
82634    * Checks if `func` has a lazy counterpart.
82635    *
82636    * @private
82637    * @param {Function} func The function to check.
82638    * @returns {boolean} Returns `true` if `func` has a lazy counterpart,
82639    *  else `false`.
82640    */
82641   function isLaziable(func) {
82642     var funcName = getFuncName(func),
82643         other = lodash[funcName];
82644
82645     if (typeof other != 'function' || !(funcName in LazyWrapper.prototype)) {
82646       return false;
82647     }
82648     if (func === other) {
82649       return true;
82650     }
82651     var data = getData(other);
82652     return !!data && func === data[0];
82653   }
82654
82655   /**
82656    * Sets metadata for `func`.
82657    *
82658    * **Note:** If this function becomes hot, i.e. is invoked a lot in a short
82659    * period of time, it will trip its breaker and transition to an identity
82660    * function to avoid garbage collection pauses in V8. See
82661    * [V8 issue 2070](https://bugs.chromium.org/p/v8/issues/detail?id=2070)
82662    * for more details.
82663    *
82664    * @private
82665    * @param {Function} func The function to associate metadata with.
82666    * @param {*} data The metadata.
82667    * @returns {Function} Returns `func`.
82668    */
82669   var setData = shortOut(baseSetData);
82670
82671   /** Used to match wrap detail comments. */
82672   var reWrapDetails = /\{\n\/\* \[wrapped with (.+)\] \*/,
82673       reSplitDetails = /,? & /;
82674
82675   /**
82676    * Extracts wrapper details from the `source` body comment.
82677    *
82678    * @private
82679    * @param {string} source The source to inspect.
82680    * @returns {Array} Returns the wrapper details.
82681    */
82682   function getWrapDetails(source) {
82683     var match = source.match(reWrapDetails);
82684     return match ? match[1].split(reSplitDetails) : [];
82685   }
82686
82687   /** Used to match wrap detail comments. */
82688   var reWrapComment = /\{(?:\n\/\* \[wrapped with .+\] \*\/)?\n?/;
82689
82690   /**
82691    * Inserts wrapper `details` in a comment at the top of the `source` body.
82692    *
82693    * @private
82694    * @param {string} source The source to modify.
82695    * @returns {Array} details The details to insert.
82696    * @returns {string} Returns the modified source.
82697    */
82698   function insertWrapDetails(source, details) {
82699     var length = details.length;
82700     if (!length) {
82701       return source;
82702     }
82703     var lastIndex = length - 1;
82704     details[lastIndex] = (length > 1 ? '& ' : '') + details[lastIndex];
82705     details = details.join(length > 2 ? ', ' : ' ');
82706     return source.replace(reWrapComment, '{\n/* [wrapped with ' + details + '] */\n');
82707   }
82708
82709   /** Used to compose bitmasks for function metadata. */
82710   var WRAP_BIND_FLAG$1 = 1,
82711       WRAP_BIND_KEY_FLAG = 2,
82712       WRAP_CURRY_FLAG = 8,
82713       WRAP_CURRY_RIGHT_FLAG = 16,
82714       WRAP_PARTIAL_FLAG = 32,
82715       WRAP_PARTIAL_RIGHT_FLAG = 64,
82716       WRAP_ARY_FLAG = 128,
82717       WRAP_REARG_FLAG = 256,
82718       WRAP_FLIP_FLAG = 512;
82719
82720   /** Used to associate wrap methods with their bit flags. */
82721   var wrapFlags = [
82722     ['ary', WRAP_ARY_FLAG],
82723     ['bind', WRAP_BIND_FLAG$1],
82724     ['bindKey', WRAP_BIND_KEY_FLAG],
82725     ['curry', WRAP_CURRY_FLAG],
82726     ['curryRight', WRAP_CURRY_RIGHT_FLAG],
82727     ['flip', WRAP_FLIP_FLAG],
82728     ['partial', WRAP_PARTIAL_FLAG],
82729     ['partialRight', WRAP_PARTIAL_RIGHT_FLAG],
82730     ['rearg', WRAP_REARG_FLAG]
82731   ];
82732
82733   /**
82734    * Updates wrapper `details` based on `bitmask` flags.
82735    *
82736    * @private
82737    * @returns {Array} details The details to modify.
82738    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82739    * @returns {Array} Returns `details`.
82740    */
82741   function updateWrapDetails(details, bitmask) {
82742     arrayEach(wrapFlags, function(pair) {
82743       var value = '_.' + pair[0];
82744       if ((bitmask & pair[1]) && !arrayIncludes(details, value)) {
82745         details.push(value);
82746       }
82747     });
82748     return details.sort();
82749   }
82750
82751   /**
82752    * Sets the `toString` method of `wrapper` to mimic the source of `reference`
82753    * with wrapper details in a comment at the top of the source body.
82754    *
82755    * @private
82756    * @param {Function} wrapper The function to modify.
82757    * @param {Function} reference The reference function.
82758    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82759    * @returns {Function} Returns `wrapper`.
82760    */
82761   function setWrapToString(wrapper, reference, bitmask) {
82762     var source = (reference + '');
82763     return setToString(wrapper, insertWrapDetails(source, updateWrapDetails(getWrapDetails(source), bitmask)));
82764   }
82765
82766   /** Used to compose bitmasks for function metadata. */
82767   var WRAP_BIND_FLAG$2 = 1,
82768       WRAP_BIND_KEY_FLAG$1 = 2,
82769       WRAP_CURRY_BOUND_FLAG = 4,
82770       WRAP_CURRY_FLAG$1 = 8,
82771       WRAP_PARTIAL_FLAG$1 = 32,
82772       WRAP_PARTIAL_RIGHT_FLAG$1 = 64;
82773
82774   /**
82775    * Creates a function that wraps `func` to continue currying.
82776    *
82777    * @private
82778    * @param {Function} func The function to wrap.
82779    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82780    * @param {Function} wrapFunc The function to create the `func` wrapper.
82781    * @param {*} placeholder The placeholder value.
82782    * @param {*} [thisArg] The `this` binding of `func`.
82783    * @param {Array} [partials] The arguments to prepend to those provided to
82784    *  the new function.
82785    * @param {Array} [holders] The `partials` placeholder indexes.
82786    * @param {Array} [argPos] The argument positions of the new function.
82787    * @param {number} [ary] The arity cap of `func`.
82788    * @param {number} [arity] The arity of `func`.
82789    * @returns {Function} Returns the new wrapped function.
82790    */
82791   function createRecurry(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {
82792     var isCurry = bitmask & WRAP_CURRY_FLAG$1,
82793         newHolders = isCurry ? holders : undefined,
82794         newHoldersRight = isCurry ? undefined : holders,
82795         newPartials = isCurry ? partials : undefined,
82796         newPartialsRight = isCurry ? undefined : partials;
82797
82798     bitmask |= (isCurry ? WRAP_PARTIAL_FLAG$1 : WRAP_PARTIAL_RIGHT_FLAG$1);
82799     bitmask &= ~(isCurry ? WRAP_PARTIAL_RIGHT_FLAG$1 : WRAP_PARTIAL_FLAG$1);
82800
82801     if (!(bitmask & WRAP_CURRY_BOUND_FLAG)) {
82802       bitmask &= ~(WRAP_BIND_FLAG$2 | WRAP_BIND_KEY_FLAG$1);
82803     }
82804     var newData = [
82805       func, bitmask, thisArg, newPartials, newHolders, newPartialsRight,
82806       newHoldersRight, argPos, ary, arity
82807     ];
82808
82809     var result = wrapFunc.apply(undefined, newData);
82810     if (isLaziable(func)) {
82811       setData(result, newData);
82812     }
82813     result.placeholder = placeholder;
82814     return setWrapToString(result, func, bitmask);
82815   }
82816
82817   /**
82818    * Gets the argument placeholder value for `func`.
82819    *
82820    * @private
82821    * @param {Function} func The function to inspect.
82822    * @returns {*} Returns the placeholder value.
82823    */
82824   function getHolder(func) {
82825     var object = func;
82826     return object.placeholder;
82827   }
82828
82829   /* Built-in method references for those with the same name as other `lodash` methods. */
82830   var nativeMin$2 = Math.min;
82831
82832   /**
82833    * Reorder `array` according to the specified indexes where the element at
82834    * the first index is assigned as the first element, the element at
82835    * the second index is assigned as the second element, and so on.
82836    *
82837    * @private
82838    * @param {Array} array The array to reorder.
82839    * @param {Array} indexes The arranged array indexes.
82840    * @returns {Array} Returns `array`.
82841    */
82842   function reorder(array, indexes) {
82843     var arrLength = array.length,
82844         length = nativeMin$2(indexes.length, arrLength),
82845         oldArray = copyArray(array);
82846
82847     while (length--) {
82848       var index = indexes[length];
82849       array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;
82850     }
82851     return array;
82852   }
82853
82854   /** Used as the internal argument placeholder. */
82855   var PLACEHOLDER = '__lodash_placeholder__';
82856
82857   /**
82858    * Replaces all `placeholder` elements in `array` with an internal placeholder
82859    * and returns an array of their indexes.
82860    *
82861    * @private
82862    * @param {Array} array The array to modify.
82863    * @param {*} placeholder The placeholder to replace.
82864    * @returns {Array} Returns the new array of placeholder indexes.
82865    */
82866   function replaceHolders(array, placeholder) {
82867     var index = -1,
82868         length = array.length,
82869         resIndex = 0,
82870         result = [];
82871
82872     while (++index < length) {
82873       var value = array[index];
82874       if (value === placeholder || value === PLACEHOLDER) {
82875         array[index] = PLACEHOLDER;
82876         result[resIndex++] = index;
82877       }
82878     }
82879     return result;
82880   }
82881
82882   /** Used to compose bitmasks for function metadata. */
82883   var WRAP_BIND_FLAG$3 = 1,
82884       WRAP_BIND_KEY_FLAG$2 = 2,
82885       WRAP_CURRY_FLAG$2 = 8,
82886       WRAP_CURRY_RIGHT_FLAG$1 = 16,
82887       WRAP_ARY_FLAG$1 = 128,
82888       WRAP_FLIP_FLAG$1 = 512;
82889
82890   /**
82891    * Creates a function that wraps `func` to invoke it with optional `this`
82892    * binding of `thisArg`, partial application, and currying.
82893    *
82894    * @private
82895    * @param {Function|string} func The function or method name to wrap.
82896    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82897    * @param {*} [thisArg] The `this` binding of `func`.
82898    * @param {Array} [partials] The arguments to prepend to those provided to
82899    *  the new function.
82900    * @param {Array} [holders] The `partials` placeholder indexes.
82901    * @param {Array} [partialsRight] The arguments to append to those provided
82902    *  to the new function.
82903    * @param {Array} [holdersRight] The `partialsRight` placeholder indexes.
82904    * @param {Array} [argPos] The argument positions of the new function.
82905    * @param {number} [ary] The arity cap of `func`.
82906    * @param {number} [arity] The arity of `func`.
82907    * @returns {Function} Returns the new wrapped function.
82908    */
82909   function createHybrid(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {
82910     var isAry = bitmask & WRAP_ARY_FLAG$1,
82911         isBind = bitmask & WRAP_BIND_FLAG$3,
82912         isBindKey = bitmask & WRAP_BIND_KEY_FLAG$2,
82913         isCurried = bitmask & (WRAP_CURRY_FLAG$2 | WRAP_CURRY_RIGHT_FLAG$1),
82914         isFlip = bitmask & WRAP_FLIP_FLAG$1,
82915         Ctor = isBindKey ? undefined : createCtor(func);
82916
82917     function wrapper() {
82918       var length = arguments.length,
82919           args = Array(length),
82920           index = length;
82921
82922       while (index--) {
82923         args[index] = arguments[index];
82924       }
82925       if (isCurried) {
82926         var placeholder = getHolder(wrapper),
82927             holdersCount = countHolders(args, placeholder);
82928       }
82929       if (partials) {
82930         args = composeArgs(args, partials, holders, isCurried);
82931       }
82932       if (partialsRight) {
82933         args = composeArgsRight(args, partialsRight, holdersRight, isCurried);
82934       }
82935       length -= holdersCount;
82936       if (isCurried && length < arity) {
82937         var newHolders = replaceHolders(args, placeholder);
82938         return createRecurry(
82939           func, bitmask, createHybrid, wrapper.placeholder, thisArg,
82940           args, newHolders, argPos, ary, arity - length
82941         );
82942       }
82943       var thisBinding = isBind ? thisArg : this,
82944           fn = isBindKey ? thisBinding[func] : func;
82945
82946       length = args.length;
82947       if (argPos) {
82948         args = reorder(args, argPos);
82949       } else if (isFlip && length > 1) {
82950         args.reverse();
82951       }
82952       if (isAry && ary < length) {
82953         args.length = ary;
82954       }
82955       if (this && this !== root$2 && this instanceof wrapper) {
82956         fn = Ctor || createCtor(fn);
82957       }
82958       return fn.apply(thisBinding, args);
82959     }
82960     return wrapper;
82961   }
82962
82963   /**
82964    * Creates a function that wraps `func` to enable currying.
82965    *
82966    * @private
82967    * @param {Function} func The function to wrap.
82968    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
82969    * @param {number} arity The arity of `func`.
82970    * @returns {Function} Returns the new wrapped function.
82971    */
82972   function createCurry(func, bitmask, arity) {
82973     var Ctor = createCtor(func);
82974
82975     function wrapper() {
82976       var length = arguments.length,
82977           args = Array(length),
82978           index = length,
82979           placeholder = getHolder(wrapper);
82980
82981       while (index--) {
82982         args[index] = arguments[index];
82983       }
82984       var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)
82985         ? []
82986         : replaceHolders(args, placeholder);
82987
82988       length -= holders.length;
82989       if (length < arity) {
82990         return createRecurry(
82991           func, bitmask, createHybrid, wrapper.placeholder, undefined,
82992           args, holders, undefined, undefined, arity - length);
82993       }
82994       var fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
82995       return apply(fn, this, args);
82996     }
82997     return wrapper;
82998   }
82999
83000   /** Used to compose bitmasks for function metadata. */
83001   var WRAP_BIND_FLAG$4 = 1;
83002
83003   /**
83004    * Creates a function that wraps `func` to invoke it with the `this` binding
83005    * of `thisArg` and `partials` prepended to the arguments it receives.
83006    *
83007    * @private
83008    * @param {Function} func The function to wrap.
83009    * @param {number} bitmask The bitmask flags. See `createWrap` for more details.
83010    * @param {*} thisArg The `this` binding of `func`.
83011    * @param {Array} partials The arguments to prepend to those provided to
83012    *  the new function.
83013    * @returns {Function} Returns the new wrapped function.
83014    */
83015   function createPartial(func, bitmask, thisArg, partials) {
83016     var isBind = bitmask & WRAP_BIND_FLAG$4,
83017         Ctor = createCtor(func);
83018
83019     function wrapper() {
83020       var argsIndex = -1,
83021           argsLength = arguments.length,
83022           leftIndex = -1,
83023           leftLength = partials.length,
83024           args = Array(leftLength + argsLength),
83025           fn = (this && this !== root$2 && this instanceof wrapper) ? Ctor : func;
83026
83027       while (++leftIndex < leftLength) {
83028         args[leftIndex] = partials[leftIndex];
83029       }
83030       while (argsLength--) {
83031         args[leftIndex++] = arguments[++argsIndex];
83032       }
83033       return apply(fn, isBind ? thisArg : this, args);
83034     }
83035     return wrapper;
83036   }
83037
83038   /** Used as the internal argument placeholder. */
83039   var PLACEHOLDER$1 = '__lodash_placeholder__';
83040
83041   /** Used to compose bitmasks for function metadata. */
83042   var WRAP_BIND_FLAG$5 = 1,
83043       WRAP_BIND_KEY_FLAG$3 = 2,
83044       WRAP_CURRY_BOUND_FLAG$1 = 4,
83045       WRAP_CURRY_FLAG$3 = 8,
83046       WRAP_ARY_FLAG$2 = 128,
83047       WRAP_REARG_FLAG$1 = 256;
83048
83049   /* Built-in method references for those with the same name as other `lodash` methods. */
83050   var nativeMin$3 = Math.min;
83051
83052   /**
83053    * Merges the function metadata of `source` into `data`.
83054    *
83055    * Merging metadata reduces the number of wrappers used to invoke a function.
83056    * This is possible because methods like `_.bind`, `_.curry`, and `_.partial`
83057    * may be applied regardless of execution order. Methods like `_.ary` and
83058    * `_.rearg` modify function arguments, making the order in which they are
83059    * executed important, preventing the merging of metadata. However, we make
83060    * an exception for a safe combined case where curried functions have `_.ary`
83061    * and or `_.rearg` applied.
83062    *
83063    * @private
83064    * @param {Array} data The destination metadata.
83065    * @param {Array} source The source metadata.
83066    * @returns {Array} Returns `data`.
83067    */
83068   function mergeData(data, source) {
83069     var bitmask = data[1],
83070         srcBitmask = source[1],
83071         newBitmask = bitmask | srcBitmask,
83072         isCommon = newBitmask < (WRAP_BIND_FLAG$5 | WRAP_BIND_KEY_FLAG$3 | WRAP_ARY_FLAG$2);
83073
83074     var isCombo =
83075       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_CURRY_FLAG$3)) ||
83076       ((srcBitmask == WRAP_ARY_FLAG$2) && (bitmask == WRAP_REARG_FLAG$1) && (data[7].length <= source[8])) ||
83077       ((srcBitmask == (WRAP_ARY_FLAG$2 | WRAP_REARG_FLAG$1)) && (source[7].length <= source[8]) && (bitmask == WRAP_CURRY_FLAG$3));
83078
83079     // Exit early if metadata can't be merged.
83080     if (!(isCommon || isCombo)) {
83081       return data;
83082     }
83083     // Use source `thisArg` if available.
83084     if (srcBitmask & WRAP_BIND_FLAG$5) {
83085       data[2] = source[2];
83086       // Set when currying a bound function.
83087       newBitmask |= bitmask & WRAP_BIND_FLAG$5 ? 0 : WRAP_CURRY_BOUND_FLAG$1;
83088     }
83089     // Compose partial arguments.
83090     var value = source[3];
83091     if (value) {
83092       var partials = data[3];
83093       data[3] = partials ? composeArgs(partials, value, source[4]) : value;
83094       data[4] = partials ? replaceHolders(data[3], PLACEHOLDER$1) : source[4];
83095     }
83096     // Compose partial right arguments.
83097     value = source[5];
83098     if (value) {
83099       partials = data[5];
83100       data[5] = partials ? composeArgsRight(partials, value, source[6]) : value;
83101       data[6] = partials ? replaceHolders(data[5], PLACEHOLDER$1) : source[6];
83102     }
83103     // Use source `argPos` if available.
83104     value = source[7];
83105     if (value) {
83106       data[7] = value;
83107     }
83108     // Use source `ary` if it's smaller.
83109     if (srcBitmask & WRAP_ARY_FLAG$2) {
83110       data[8] = data[8] == null ? source[8] : nativeMin$3(data[8], source[8]);
83111     }
83112     // Use source `arity` if one is not provided.
83113     if (data[9] == null) {
83114       data[9] = source[9];
83115     }
83116     // Use source `func` and merge bitmasks.
83117     data[0] = source[0];
83118     data[1] = newBitmask;
83119
83120     return data;
83121   }
83122
83123   /** Error message constants. */
83124   var FUNC_ERROR_TEXT$4 = 'Expected a function';
83125
83126   /** Used to compose bitmasks for function metadata. */
83127   var WRAP_BIND_FLAG$6 = 1,
83128       WRAP_BIND_KEY_FLAG$4 = 2,
83129       WRAP_CURRY_FLAG$4 = 8,
83130       WRAP_CURRY_RIGHT_FLAG$2 = 16,
83131       WRAP_PARTIAL_FLAG$2 = 32,
83132       WRAP_PARTIAL_RIGHT_FLAG$2 = 64;
83133
83134   /* Built-in method references for those with the same name as other `lodash` methods. */
83135   var nativeMax$7 = Math.max;
83136
83137   /**
83138    * Creates a function that either curries or invokes `func` with optional
83139    * `this` binding and partially applied arguments.
83140    *
83141    * @private
83142    * @param {Function|string} func The function or method name to wrap.
83143    * @param {number} bitmask The bitmask flags.
83144    *    1 - `_.bind`
83145    *    2 - `_.bindKey`
83146    *    4 - `_.curry` or `_.curryRight` of a bound function
83147    *    8 - `_.curry`
83148    *   16 - `_.curryRight`
83149    *   32 - `_.partial`
83150    *   64 - `_.partialRight`
83151    *  128 - `_.rearg`
83152    *  256 - `_.ary`
83153    *  512 - `_.flip`
83154    * @param {*} [thisArg] The `this` binding of `func`.
83155    * @param {Array} [partials] The arguments to be partially applied.
83156    * @param {Array} [holders] The `partials` placeholder indexes.
83157    * @param {Array} [argPos] The argument positions of the new function.
83158    * @param {number} [ary] The arity cap of `func`.
83159    * @param {number} [arity] The arity of `func`.
83160    * @returns {Function} Returns the new wrapped function.
83161    */
83162   function createWrap(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {
83163     var isBindKey = bitmask & WRAP_BIND_KEY_FLAG$4;
83164     if (!isBindKey && typeof func != 'function') {
83165       throw new TypeError(FUNC_ERROR_TEXT$4);
83166     }
83167     var length = partials ? partials.length : 0;
83168     if (!length) {
83169       bitmask &= ~(WRAP_PARTIAL_FLAG$2 | WRAP_PARTIAL_RIGHT_FLAG$2);
83170       partials = holders = undefined;
83171     }
83172     ary = ary === undefined ? ary : nativeMax$7(toInteger(ary), 0);
83173     arity = arity === undefined ? arity : toInteger(arity);
83174     length -= holders ? holders.length : 0;
83175
83176     if (bitmask & WRAP_PARTIAL_RIGHT_FLAG$2) {
83177       var partialsRight = partials,
83178           holdersRight = holders;
83179
83180       partials = holders = undefined;
83181     }
83182     var data = isBindKey ? undefined : getData(func);
83183
83184     var newData = [
83185       func, bitmask, thisArg, partials, holders, partialsRight, holdersRight,
83186       argPos, ary, arity
83187     ];
83188
83189     if (data) {
83190       mergeData(newData, data);
83191     }
83192     func = newData[0];
83193     bitmask = newData[1];
83194     thisArg = newData[2];
83195     partials = newData[3];
83196     holders = newData[4];
83197     arity = newData[9] = newData[9] === undefined
83198       ? (isBindKey ? 0 : func.length)
83199       : nativeMax$7(newData[9] - length, 0);
83200
83201     if (!arity && bitmask & (WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2)) {
83202       bitmask &= ~(WRAP_CURRY_FLAG$4 | WRAP_CURRY_RIGHT_FLAG$2);
83203     }
83204     if (!bitmask || bitmask == WRAP_BIND_FLAG$6) {
83205       var result = createBind(func, bitmask, thisArg);
83206     } else if (bitmask == WRAP_CURRY_FLAG$4 || bitmask == WRAP_CURRY_RIGHT_FLAG$2) {
83207       result = createCurry(func, bitmask, arity);
83208     } else if ((bitmask == WRAP_PARTIAL_FLAG$2 || bitmask == (WRAP_BIND_FLAG$6 | WRAP_PARTIAL_FLAG$2)) && !holders.length) {
83209       result = createPartial(func, bitmask, thisArg, partials);
83210     } else {
83211       result = createHybrid.apply(undefined, newData);
83212     }
83213     var setter = data ? baseSetData : setData;
83214     return setWrapToString(setter(result, newData), func, bitmask);
83215   }
83216
83217   /** Used to compose bitmasks for function metadata. */
83218   var WRAP_BIND_FLAG$7 = 1,
83219       WRAP_PARTIAL_FLAG$3 = 32;
83220
83221   /**
83222    * Creates a function that invokes `func` with the `this` binding of `thisArg`
83223    * and `partials` prepended to the arguments it receives.
83224    *
83225    * The `_.bind.placeholder` value, which defaults to `_` in monolithic builds,
83226    * may be used as a placeholder for partially applied arguments.
83227    *
83228    * **Note:** Unlike native `Function#bind`, this method doesn't set the "length"
83229    * property of bound functions.
83230    *
83231    * @static
83232    * @memberOf _
83233    * @since 0.1.0
83234    * @category Function
83235    * @param {Function} func The function to bind.
83236    * @param {*} thisArg The `this` binding of `func`.
83237    * @param {...*} [partials] The arguments to be partially applied.
83238    * @returns {Function} Returns the new bound function.
83239    * @example
83240    *
83241    * function greet(greeting, punctuation) {
83242    *   return greeting + ' ' + this.user + punctuation;
83243    * }
83244    *
83245    * var object = { 'user': 'fred' };
83246    *
83247    * var bound = _.bind(greet, object, 'hi');
83248    * bound('!');
83249    * // => 'hi fred!'
83250    *
83251    * // Bound with placeholders.
83252    * var bound = _.bind(greet, object, _, '!');
83253    * bound('hi');
83254    * // => 'hi fred!'
83255    */
83256   var bind$2 = baseRest(function(func, thisArg, partials) {
83257     var bitmask = WRAP_BIND_FLAG$7;
83258     if (partials.length) {
83259       var holders = replaceHolders(partials, getHolder(bind$2));
83260       bitmask |= WRAP_PARTIAL_FLAG$3;
83261     }
83262     return createWrap(func, bitmask, thisArg, partials, holders);
83263   });
83264
83265   // Assign default placeholders.
83266   bind$2.placeholder = {};
83267
83268   function presetCollection(collection) {
83269       var maxSearchResults = 50;
83270       var maxSuggestionResults = 10;
83271
83272       var presets = {
83273
83274           collection: collection,
83275
83276
83277           item: function(id) {
83278               return find$1(this.collection, function(d) {
83279                   return d.id === id;
83280               });
83281           },
83282
83283
83284           matchGeometry: function(geometry) {
83285               return presetCollection(this.collection.filter(function(d) {
83286                   return d.matchGeometry(geometry);
83287               }));
83288           },
83289
83290
83291           search: function(value, geometry) {
83292               if (!value) return this;
83293
83294               function leading(a) {
83295                   var index = a.indexOf(value);
83296                   return index === 0 || a[index - 1] === ' ';
83297               }
83298
83299               function suggestionName(name) {
83300                   var nameArray = name.split(' - ');
83301                   if (nameArray.length > 1) {
83302                       name = nameArray.slice(0, nameArray.length - 1).join(' - ');
83303                   }
83304                   return name.toLowerCase();
83305               }
83306
83307
83308               value = value.toLowerCase();
83309
83310               var searchable = filter(this.collection, function(a) {
83311                   return a.searchable !== false && a.suggestion !== true;
83312               });
83313               var suggestions = filter(this.collection, function(a) {
83314                   return a.suggestion === true;
83315               });
83316
83317
83318               // matches value to preset.name
83319               var leading_name = filter(searchable, function(a) {
83320                       return leading(a.name().toLowerCase());
83321                   }).sort(function(a, b) {
83322                       var aCompare = a.name().toLowerCase();
83323                       var bCompare = b.name().toLowerCase();
83324                       var i;
83325
83326                       // priority if search string matches preset name exactly - #4325
83327                       if (value === aCompare) return -1;
83328                       if (value === bCompare) return 1;
83329
83330                       // priority for higher matchScore
83331                       i = b.originalScore - a.originalScore;
83332                       if (i !== 0) return i;
83333
83334                       // priority if search string appears earlier in preset name
83335                       i = aCompare.indexOf(value) - bCompare.indexOf(value);
83336                       if (i !== 0) return i;
83337
83338                       // priority for shorter preset names
83339                       return a.name().length - b.name().length;
83340                   });
83341
83342               // matches value to preset.terms values
83343               var leading_terms = filter(searchable, function(a) {
83344                   return some(a.terms() || [], leading);
83345               });
83346
83347               // matches value to preset.tags values
83348               var leading_tag_values = filter(searchable, function(a) {
83349                   return some(without(values$1(a.tags || {}), '*'), leading);
83350               });
83351
83352
83353               // finds close matches to value in preset.name
83354               var similar_name = searchable
83355                   .map(function(a) {
83356                       return { preset: a, dist: utilEditDistance(value, a.name()) };
83357                   }).filter(function(a) {
83358                       return a.dist + Math.min(value.length - a.preset.name().length, 0) < 3;
83359                   }).sort(function(a, b) {
83360                       return a.dist - b.dist;
83361                   }).map(function(a) {
83362                       return a.preset;
83363                   });
83364
83365               // finds close matches to value in preset.terms
83366               var similar_terms = filter(searchable, function(a) {
83367                       return some(a.terms() || [], function(b) {
83368                           return utilEditDistance(value, b) + Math.min(value.length - b.length, 0) < 3;
83369                       });
83370                   });
83371
83372               var leading_suggestions = filter(suggestions, function(a) {
83373                       return leading(suggestionName(a.name()));
83374                   }).sort(function(a, b) {
83375                       a = suggestionName(a.name());
83376                       b = suggestionName(b.name());
83377                       var i = a.indexOf(value) - b.indexOf(value);
83378                       if (i === 0) return a.length - b.length;
83379                       else return i;
83380                   });
83381
83382               var similar_suggestions = suggestions.map(function(a) {
83383                       return { preset: a, dist: utilEditDistance(value, suggestionName(a.name())) };
83384                   }).filter(function(a) {
83385                       return a.dist + Math.min(value.length - suggestionName(a.preset.name()).length, 0) < 1;
83386                   }).sort(function(a, b) {
83387                       return a.dist - b.dist;
83388                   }).map(function(a) {
83389                       return a.preset;
83390                   });
83391
83392               var other = presets.item(geometry);
83393
83394               var results = leading_name.concat(
83395                   leading_terms,
83396                   leading_tag_values,
83397                   leading_suggestions.slice(0, maxSuggestionResults + 5),
83398                   similar_name,
83399                   similar_terms,
83400                   similar_suggestions.slice(0, maxSuggestionResults)
83401               ).slice(0, maxSearchResults - 1);
83402
83403               return presetCollection(uniq(results.concat(other)));
83404           }
83405       };
83406
83407
83408       return presets;
83409   }
83410
83411   function presetCategory(id, category, all) {
83412       category = clone(category);
83413
83414       category.id = id;
83415
83416
83417       category.members = presetCollection(category.members.map(function(id) {
83418           return all.item(id);
83419       }));
83420
83421
83422       category.matchGeometry = function(geometry) {
83423           return category.geometry.indexOf(geometry) >= 0;
83424       };
83425
83426
83427       category.matchScore = function() {
83428           return -1;
83429       };
83430
83431
83432       category.name = function() {
83433           return t('presets.categories.' + id + '.name', {'default': id});
83434       };
83435
83436
83437       category.terms = function() {
83438           return [];
83439       };
83440
83441
83442       return category;
83443   }
83444
83445   function presetField(id, field) {
83446       field = clone(field);
83447
83448       field.id = id;
83449
83450       // for use in classes, element ids, css selectors
83451       field.safeid = id.replace(/[^_a-zA-Z0-9\-]/g, '_');
83452
83453       field.matchGeometry = function(geometry) {
83454           return !field.geometry || field.geometry === geometry;
83455       };
83456
83457
83458       field.t = function(scope, options) {
83459           return t('presets.fields.' + id + '.' + scope, options);
83460       };
83461
83462
83463       field.label = function() {
83464           return field.t('label', {'default': id});
83465       };
83466
83467
83468       var placeholder = field.placeholder;
83469       field.placeholder = function() {
83470           return field.t('placeholder', {'default': placeholder});
83471       };
83472
83473
83474       return field;
83475   }
83476
83477   function presetPreset(id, preset, fields) {
83478       preset = clone(preset);
83479
83480       preset.id = id;
83481       preset.fields = (preset.fields || []).map(getFields);
83482       preset.geometry = (preset.geometry || []);
83483
83484
83485       function getFields(f) {
83486           return fields[f];
83487       }
83488
83489
83490       preset.matchGeometry = function(geometry) {
83491           return preset.geometry.indexOf(geometry) >= 0;
83492       };
83493
83494
83495       preset.originalScore = preset.matchScore || 1;
83496
83497
83498       preset.matchScore = function(entity) {
83499           var tags = preset.tags;
83500           var score = 0;
83501
83502           for (var t$$1 in tags) {
83503               if (entity.tags[t$$1] === tags[t$$1]) {
83504                   score += preset.originalScore;
83505               } else if (tags[t$$1] === '*' && t$$1 in entity.tags) {
83506                   score += preset.originalScore / 2;
83507               } else {
83508                   return -1;
83509               }
83510           }
83511
83512           return score;
83513       };
83514
83515
83516       preset.t = function(scope, options) {
83517           return t('presets.presets.' + id + '.' + scope, options);
83518       };
83519
83520
83521       var origName = preset.name || '';
83522       preset.name = function() {
83523           if (preset.suggestion) {
83524               id = id.split('/');
83525               id = id[0] + '/' + id[1];
83526               return origName + ' - ' + t('presets.presets.' + id + '.name');
83527           }
83528           return preset.t('name', { 'default': origName });
83529       };
83530
83531       var origTerms = (preset.terms || []).join();
83532       preset.terms = function() {
83533           return preset.t('terms', { 'default': origTerms }).toLowerCase().trim().split(/\s*,+\s*/);
83534       };
83535
83536
83537       preset.isFallback = function() {
83538           var tagCount = Object.keys(preset.tags).length;
83539           return tagCount === 0 || (tagCount === 1 && preset.tags.hasOwnProperty('area'));
83540       };
83541
83542
83543       var reference = preset.reference || {};
83544       preset.reference = function(geometry) {
83545           var key = reference.key || Object.keys(omit(preset.tags, 'name'))[0],
83546               value = reference.value || preset.tags[key];
83547
83548           if (geometry === 'relation' && key === 'type') {
83549               if (value in preset.tags) {
83550                   key = value;
83551                   value = preset.tags[key];
83552               } else {
83553                   return { rtype: value };
83554               }
83555           }
83556
83557           if (value === '*') {
83558               return { key: key };
83559           } else {
83560               return { key: key, value: value };
83561           }
83562       };
83563
83564
83565       preset.removeTags = preset.removeTags || preset.tags || {};
83566       preset.unsetTags = function(tags, geometry) {
83567           tags = omit(tags, Object.keys(preset.removeTags));
83568
83569           for (var f in preset.fields) {
83570               var field = preset.fields[f];
83571               if (field.matchGeometry(geometry) && field.default === tags[field.key]) {
83572                   delete tags[field.key];
83573               }
83574           }
83575
83576           delete tags.area;
83577           return tags;
83578       };
83579
83580
83581       preset.addTags = preset.addTags || preset.tags || {};
83582       preset.setTags = function(tags, geometry) {
83583           var addTags = preset.addTags;
83584           var k;
83585
83586           tags = clone(tags);
83587
83588           for (k in addTags) {
83589               if (addTags[k] === '*') {
83590                   tags[k] = 'yes';
83591               } else {
83592                   tags[k] = addTags[k];
83593               }
83594           }
83595
83596           // Add area=yes if necessary.
83597           // This is necessary if the geometry is already an area (e.g. user drew an area) AND any of:
83598           // 1. chosen preset could be either an area or a line (`barrier=city_wall`)
83599           // 2. chosen preset doesn't have a key in areaKeys (`railway=station`)
83600           if (!addTags.hasOwnProperty('area')) {
83601               delete tags.area;
83602               if (geometry === 'area') {
83603                   var needsAreaTag = true;
83604                   if (preset.geometry.indexOf('line') === -1) {
83605                       for (k in addTags) {
83606                           if (k in areaKeys) {
83607                               needsAreaTag = false;
83608                               break;
83609                           }
83610                       }
83611                   }
83612                   if (needsAreaTag) {
83613                       tags.area = 'yes';
83614                   }
83615               }
83616           }
83617
83618           for (var f in preset.fields) {
83619               var field = preset.fields[f];
83620               if (field.matchGeometry(geometry) && field.key && !tags[field.key] && field.default) {
83621                   tags[field.key] = field.default;
83622               }
83623           }
83624
83625           return tags;
83626       };
83627
83628
83629       return preset;
83630   }
83631
83632   function presetIndex() {
83633       // a presetCollection with methods for
83634       // loading new data and returning defaults
83635
83636       var all = presetCollection([]);
83637       var _defaults = { area: all, line: all, point: all, vertex: all, relation: all };
83638       var _fields = {};
83639       var _universal = [];
83640       var _recent = presetCollection([]);
83641
83642       // Index of presets by (geometry, tag key).
83643       var _index = {
83644           point: {},
83645           vertex: {},
83646           line: {},
83647           area: {},
83648           relation: {}
83649       };
83650
83651       all.match = function(entity, resolver) {
83652           return resolver.transient(entity, 'presetMatch', function() {
83653               var geometry = entity.geometry(resolver);
83654               var address;
83655
83656               // Treat entities on addr:interpolation lines as points, not vertices - #3241
83657               if (geometry === 'vertex' && entity.isOnAddressLine(resolver)) {
83658                   geometry = 'point';
83659               }
83660
83661               var geometryMatches = _index[geometry];
83662               var best = -1;
83663               var match;
83664
83665               for (var k in entity.tags) {
83666                   // If any part of an address is present,
83667                   // allow fallback to "Address" preset - #4353
83668                   if (k.match(/^addr:/) !== null && geometryMatches['addr:*']) {
83669                       address = geometryMatches['addr:*'][0];
83670                   }
83671
83672                   var keyMatches = geometryMatches[k];
83673                   if (!keyMatches) continue;
83674
83675                   for (var i = 0; i < keyMatches.length; i++) {
83676                       var score = keyMatches[i].matchScore(entity);
83677                       if (score > best) {
83678                           best = score;
83679                           match = keyMatches[i];
83680                       }
83681                   }
83682               }
83683
83684               if (address && (!match || match.isFallback())) {
83685                   match = address;
83686               }
83687
83688               return match || all.item(geometry);
83689           });
83690       };
83691
83692
83693       // Because of the open nature of tagging, iD will never have a complete
83694       // list of tags used in OSM, so we want it to have logic like "assume
83695       // that a closed way with an amenity tag is an area, unless the amenity
83696       // is one of these specific types". This function computes a structure
83697       // that allows testing of such conditions, based on the presets designated
83698       // as as supporting (or not supporting) the area geometry.
83699       //
83700       // The returned object L is a whitelist/blacklist of tags. A closed way
83701       // with a tag (k, v) is considered to be an area if `k in L && !(v in L[k])`
83702       // (see `Way#isArea()`). In other words, the keys of L form the whitelist,
83703       // and the subkeys form the blacklist.
83704       all.areaKeys = function() {
83705           var areaKeys = {};
83706           var ignore = ['barrier', 'highway', 'footway', 'railway', 'type'];  // probably a line..
83707           var presets = reject(all.collection, 'suggestion');
83708
83709           // whitelist
83710           presets.forEach(function(d) {
83711               for (var key in d.tags) break;
83712               if (!key) return;
83713               if (ignore.indexOf(key) !== -1) return;
83714
83715               if (d.geometry.indexOf('area') !== -1) {    // probably an area..
83716                   areaKeys[key] = areaKeys[key] || {};
83717               }
83718           });
83719
83720           // blacklist
83721           presets.forEach(function(d) {
83722               for (var key in d.tags) break;
83723               if (!key) return;
83724               if (ignore.indexOf(key) !== -1) return;
83725
83726               var value = d.tags[key];
83727               if (key in areaKeys &&                      // probably an area...
83728                   d.geometry.indexOf('line') !== -1 &&    // but sometimes a line
83729                   value !== '*') {
83730                   areaKeys[key][value] = true;
83731               }
83732           });
83733
83734           return areaKeys;
83735       };
83736
83737
83738       all.init = function() {
83739           var d = data.presets;
83740
83741           all.collection = [];
83742           _recent.collection = [];
83743           _fields = {};
83744           _universal = [];
83745           _index = { point: {}, vertex: {}, line: {}, area: {}, relation: {} };
83746
83747           if (d.fields) {
83748               forEach(d.fields, function(d, id) {
83749                   _fields[id] = presetField(id, d);
83750                   if (d.universal) {
83751                       _universal.push(_fields[id]);
83752                   }
83753               });
83754           }
83755
83756           // move the wikidata field to directly follow the wikipedia field
83757           _universal.splice(_universal.indexOf(_fields.wikidata), 1);
83758           _universal.splice(_universal.indexOf(_fields.wikipedia)+1, 0, _fields.wikidata);
83759
83760           if (d.presets) {
83761               forEach(d.presets, function(d, id) {
83762                   all.collection.push(presetPreset(id, d, _fields));
83763               });
83764           }
83765
83766           if (d.categories) {
83767               forEach(d.categories, function(d, id) {
83768                   all.collection.push(presetCategory(id, d, all));
83769               });
83770           }
83771
83772           if (d.defaults) {
83773               var getItem = bind$2(all.item, all);
83774               _defaults = {
83775                   area: presetCollection(d.defaults.area.map(getItem)),
83776                   line: presetCollection(d.defaults.line.map(getItem)),
83777                   point: presetCollection(d.defaults.point.map(getItem)),
83778                   vertex: presetCollection(d.defaults.vertex.map(getItem)),
83779                   relation: presetCollection(d.defaults.relation.map(getItem))
83780               };
83781           }
83782
83783           for (var i = 0; i < all.collection.length; i++) {
83784               var preset = all.collection[i];
83785               var geometry = preset.geometry;
83786
83787               for (var j = 0; j < geometry.length; j++) {
83788                   var g = _index[geometry[j]];
83789                   for (var k in preset.tags) {
83790                       (g[k] = g[k] || []).push(preset);
83791                   }
83792               }
83793           }
83794
83795           return all;
83796       };
83797
83798       all.field = function(id) {
83799           return _fields[id];
83800       };
83801
83802       all.universal = function() {
83803           return _universal;
83804       };
83805
83806       all.defaults = function(geometry, n) {
83807           var rec = _recent.matchGeometry(geometry).collection.slice(0, 4);
83808           var def = uniq(rec.concat(_defaults[geometry].collection)).slice(0, n - 1);
83809           return presetCollection(uniq(rec.concat(def).concat(all.item(geometry))));
83810       };
83811
83812       all.choose = function(preset) {
83813           if (preset.searchable !== false) {
83814               _recent = presetCollection(uniq([preset].concat(_recent.collection)));
83815           }
83816           return all;
83817       };
83818
83819       return all;
83820   }
83821
83822   var areaKeys = {};
83823
83824   function setAreaKeys(value) {
83825       areaKeys = value;
83826   }
83827
83828
83829   function coreContext() {
83830       var context = {};
83831       context.version = '2.12.1';
83832
83833       // create a special translation that contains the keys in place of the strings
83834       var tkeys = cloneDeep(en);
83835       var parents = [];
83836
83837       function traverser(v, k, obj) {
83838           parents.push(k);
83839           if (isObject(v)) {
83840               forOwn(v, traverser);
83841           } else if (isString(v)) {
83842               obj[k] = parents.join('.');
83843           }
83844           parents.pop();
83845       }
83846
83847       forOwn(tkeys, traverser);
83848       addTranslation('_tkeys_', tkeys);
83849
83850       addTranslation('en', en);
83851       setLocale('en');
83852
83853       var dispatch$$1 = dispatch('enter', 'exit', 'change');
83854
83855       // https://github.com/openstreetmap/iD/issues/772
83856       // http://mathiasbynens.be/notes/localstorage-pattern#comment-9
83857       var storage;
83858       try { storage = localStorage; } catch (e) {}  // eslint-disable-line no-empty
83859       storage = storage || (function() {
83860           var s = {};
83861           return {
83862               getItem: function(k) { return s[k]; },
83863               setItem: function(k, v) { s[k] = v; },
83864               removeItem: function(k) { delete s[k]; }
83865           };
83866       })();
83867
83868       context.storage = function(k, v) {
83869           try {
83870               if (arguments.length === 1) return storage.getItem(k);
83871               else if (v === null) storage.removeItem(k);
83872               else storage.setItem(k, v);
83873           } catch (e) {
83874               // localstorage quota exceeded
83875               /* eslint-disable no-console */
83876               if (typeof console !== 'undefined') console.error('localStorage quota exceeded');
83877               /* eslint-enable no-console */
83878           }
83879       };
83880
83881
83882       /* User interface and keybinding */
83883       var ui;
83884       context.ui = function() { return ui; };
83885
83886       var keybinding = utilKeybinding('context');
83887       context.keybinding = function() { return keybinding; };
83888       select(document).call(keybinding);
83889
83890
83891       /* Straight accessors. Avoid using these if you can. */
83892       var connection, history;
83893       context.connection = function() { return connection; };
83894       context.history = function() { return history; };
83895
83896
83897       /* Connection */
83898       context.preauth = function(options) {
83899           if (connection) {
83900               connection.switch(options);
83901           }
83902           return context;
83903       };
83904
83905       context.loadTiles = utilCallWhenIdle(function(projection, callback) {
83906           var cid;
83907           function done(err, result) {
83908               if (connection.getConnectionId() !== cid) {
83909                   if (callback) callback({ message: 'Connection Switched', status: -1 });
83910                   return;
83911               }
83912               if (!err) history.merge(result.data, result.extent);
83913               if (callback) callback(err, result);
83914           }
83915           if (connection && context.editable()) {
83916               cid = connection.getConnectionId();
83917               connection.loadTiles(projection, done);
83918           }
83919       });
83920
83921       context.loadEntity = function(entityID, callback) {
83922           var cid;
83923           function done(err, result) {
83924               if (connection.getConnectionId() !== cid) {
83925                   if (callback) callback({ message: 'Connection Switched', status: -1 });
83926                   return;
83927               }
83928               if (!err) history.merge(result.data, result.extent);
83929               if (callback) callback(err, result);
83930           }
83931           if (connection) {
83932               cid = connection.getConnectionId();
83933               connection.loadEntity(entityID, done);
83934           }
83935       };
83936
83937       context.zoomToEntity = function(entityID, zoomTo) {
83938           if (zoomTo !== false) {
83939               this.loadEntity(entityID, function(err, result) {
83940                   if (err) return;
83941                   var entity = find$1(result.data, function(e) { return e.id === entityID; });
83942                   if (entity) { map.zoomTo(entity); }
83943               });
83944           }
83945
83946           map.on('drawn.zoomToEntity', function() {
83947               if (!context.hasEntity(entityID)) return;
83948               map.on('drawn.zoomToEntity', null);
83949               context.on('enter.zoomToEntity', null);
83950               context.enter(modeSelect(context, [entityID]));
83951           });
83952
83953           context.on('enter.zoomToEntity', function() {
83954               if (mode.id !== 'browse') {
83955                   map.on('drawn.zoomToEntity', null);
83956                   context.on('enter.zoomToEntity', null);
83957               }
83958           });
83959       };
83960
83961       var minEditableZoom = 16;
83962       context.minEditableZoom = function(_) {
83963           if (!arguments.length) return minEditableZoom;
83964           minEditableZoom = _;
83965           if (connection) {
83966               connection.tileZoom(_);
83967           }
83968           return context;
83969       };
83970
83971
83972       /* History */
83973       var inIntro = false;
83974       context.inIntro = function(_) {
83975           if (!arguments.length) return inIntro;
83976           inIntro = _;
83977           return context;
83978       };
83979
83980       context.save = function() {
83981           // no history save, no message onbeforeunload
83982           if (inIntro || select('.modal').size()) return;
83983
83984           var canSave;
83985           if (mode && mode.id === 'save') {
83986               canSave = false;
83987
83988               // Attempt to prevent user from creating duplicate changes - see #5200
83989               if (services.osm && services.osm.isChangesetInflight()) {
83990                   history.clearSaved();
83991                   return;
83992               }
83993
83994           } else {
83995               canSave = context.selectedIDs().every(function(id) {
83996                   var entity = context.hasEntity(id);
83997                   return entity && !entity.isDegenerate();
83998               });
83999           }
84000
84001           if (canSave) {
84002               history.save();
84003           }
84004           if (history.hasChanges()) {
84005               return t('save.unsaved_changes');
84006           }
84007       };
84008
84009
84010       /* Graph */
84011       context.hasEntity = function(id) {
84012           return history.graph().hasEntity(id);
84013       };
84014       context.entity = function(id) {
84015           return history.graph().entity(id);
84016       };
84017       context.childNodes = function(way) {
84018           return history.graph().childNodes(way);
84019       };
84020       context.geometry = function(id) {
84021           return context.entity(id).geometry(history.graph());
84022       };
84023
84024
84025       /* Modes */
84026       var mode;
84027       context.mode = function() {
84028           return mode;
84029       };
84030       context.enter = function(newMode) {
84031           if (mode) {
84032               mode.exit();
84033               dispatch$$1.call('exit', this, mode);
84034           }
84035
84036           mode = newMode;
84037           mode.enter();
84038           dispatch$$1.call('enter', this, mode);
84039       };
84040
84041       context.selectedIDs = function() {
84042           if (mode && mode.selectedIDs) {
84043               return mode.selectedIDs();
84044           } else {
84045               return [];
84046           }
84047       };
84048
84049       context.activeID = function() {
84050           return mode && mode.activeID && mode.activeID();
84051       };
84052
84053       var _selectedNoteID;
84054       context.selectedNoteID = function(noteID) {
84055           if (!arguments.length) return _selectedNoteID;
84056           _selectedNoteID = noteID;
84057           return context;
84058       };
84059
84060
84061       /* Behaviors */
84062       context.install = function(behavior) {
84063           context.surface().call(behavior);
84064       };
84065       context.uninstall = function(behavior) {
84066           context.surface().call(behavior.off);
84067       };
84068
84069
84070       /* Copy/Paste */
84071       var copyIDs = [], copyGraph;
84072       context.copyGraph = function() { return copyGraph; };
84073       context.copyIDs = function(_) {
84074           if (!arguments.length) return copyIDs;
84075           copyIDs = _;
84076           copyGraph = history.graph();
84077           return context;
84078       };
84079
84080
84081       /* Background */
84082       var background;
84083       context.background = function() { return background; };
84084
84085
84086       /* Features */
84087       var features;
84088       context.features = function() { return features; };
84089       context.hasHiddenConnections = function(id) {
84090           var graph = history.graph(),
84091               entity = graph.entity(id);
84092           return features.hasHiddenConnections(entity, graph);
84093       };
84094
84095
84096       /* Presets */
84097       var presets;
84098       context.presets = function() { return presets; };
84099
84100
84101       /* Map */
84102       var map;
84103       context.map = function() { return map; };
84104       context.layers = function() { return map.layers; };
84105       context.surface = function() { return map.surface; };
84106       context.editable = function() { return map.editable(); };
84107       context.surfaceRect = function() {
84108           return map.surface.node().getBoundingClientRect();
84109       };
84110
84111
84112       /* Debug */
84113       var debugFlags = {
84114           tile: false,        // tile boundaries
84115           collision: false,   // label collision bounding boxes
84116           imagery: false,     // imagery bounding polygons
84117           community: false,   // community bounding polygons
84118           imperial: false,    // imperial (not metric) bounding polygons
84119           driveLeft: false,   // driveLeft bounding polygons
84120           target: false       // touch targets
84121       };
84122       context.debugFlags = function() {
84123           return debugFlags;
84124       };
84125       context.setDebug = function(flag, val) {
84126           if (arguments.length === 1) val = true;
84127           debugFlags[flag] = val;
84128           dispatch$$1.call('change');
84129           return context;
84130       };
84131       context.getDebug = function(flag) {
84132           return flag && debugFlags[flag];
84133       };
84134
84135
84136       /* Container */
84137       var container = select(document.body);
84138       context.container = function(_) {
84139           if (!arguments.length) return container;
84140           container = _;
84141           container.classed('id-container', true);
84142           return context;
84143       };
84144       var embed;
84145       context.embed = function(_) {
84146           if (!arguments.length) return embed;
84147           embed = _;
84148           return context;
84149       };
84150
84151
84152       /* Assets */
84153       var assetPath = '';
84154       context.assetPath = function(_) {
84155           if (!arguments.length) return assetPath;
84156           assetPath = _;
84157           return context;
84158       };
84159
84160       var assetMap = {};
84161       context.assetMap = function(_) {
84162           if (!arguments.length) return assetMap;
84163           assetMap = _;
84164           return context;
84165       };
84166
84167       context.asset = function(_) {
84168           var filename = assetPath + _;
84169           return assetMap[filename] || filename;
84170       };
84171
84172       context.imagePath = function(_) {
84173           return context.asset('img/' + _);
84174       };
84175
84176
84177       /* locales */
84178       // `locale` variable contains a "requested locale".
84179       // It won't become the `currentLocale` until after loadLocale() is called.
84180       var locale, localePath;
84181
84182       context.locale = function(loc, path) {
84183           if (!arguments.length) return currentLocale;
84184           locale = loc;
84185           localePath = path;
84186           return context;
84187       };
84188
84189       context.loadLocale = function(callback) {
84190           if (locale && locale !== 'en' && dataLocales.hasOwnProperty(locale)) {
84191               localePath = localePath || context.asset('locales/' + locale + '.json');
84192               d3_json(localePath, function(err, result) {
84193                   if (!err) {
84194                       addTranslation(locale, result[locale]);
84195                       setLocale(locale);
84196                       utilDetect(true);
84197                   }
84198                   if (callback) {
84199                       callback(err);
84200                   }
84201               });
84202           } else {
84203               if (locale) {
84204                   setLocale(locale);
84205                   utilDetect(true);
84206               }
84207               if (callback) {
84208                   callback();
84209               }
84210           }
84211       };
84212
84213
84214       /* reset (aka flush) */
84215       context.reset = context.flush = function() {
84216           context.debouncedSave.cancel();
84217           forEach(services, function(service) {
84218               if (service && typeof service.reset === 'function') {
84219                   service.reset(context);
84220               }
84221           });
84222           features.reset();
84223           history.reset();
84224           return context;
84225       };
84226
84227
84228       /* Init */
84229
84230       context.projection = geoRawMercator();
84231       context.curtainProjection = geoRawMercator();
84232
84233       locale = utilDetect().locale;
84234       if (locale && !dataLocales.hasOwnProperty(locale)) {
84235           locale = locale.split('-')[0];
84236       }
84237
84238       history = coreHistory(context);
84239       context.graph = history.graph;
84240       context.changes = history.changes;
84241       context.intersects = history.intersects;
84242
84243       // Debounce save, since it's a synchronous localStorage write,
84244       // and history changes can happen frequently (e.g. when dragging).
84245       context.debouncedSave = debounce(context.save, 350);
84246       function withDebouncedSave(fn) {
84247           return function() {
84248               var result = fn.apply(history, arguments);
84249               context.debouncedSave();
84250               return result;
84251           };
84252       }
84253
84254       context.perform = withDebouncedSave(history.perform);
84255       context.replace = withDebouncedSave(history.replace);
84256       context.pop = withDebouncedSave(history.pop);
84257       context.overwrite = withDebouncedSave(history.overwrite);
84258       context.undo = withDebouncedSave(history.undo);
84259       context.redo = withDebouncedSave(history.redo);
84260
84261       ui = uiInit(context);
84262
84263       connection = services.osm;
84264       background = rendererBackground(context);
84265       features = rendererFeatures(context);
84266       presets = presetIndex();
84267
84268       map = rendererMap(context);
84269       context.mouse = map.mouse;
84270       context.extent = map.extent;
84271       context.pan = map.pan;
84272       context.zoomIn = map.zoomIn;
84273       context.zoomOut = map.zoomOut;
84274       context.zoomInFurther = map.zoomInFurther;
84275       context.zoomOutFurther = map.zoomOutFurther;
84276       context.redrawEnable = map.redrawEnable;
84277
84278       forEach(services, function(service) {
84279           if (service && typeof service.init === 'function') {
84280               service.init(context);
84281           }
84282       });
84283
84284       background.init();
84285       features.init();
84286       presets.init();
84287       areaKeys = presets.areaKeys();
84288
84289
84290       return utilRebind(context, dispatch$$1, 'on');
84291   }
84292
84293   function osmWay() {
84294       if (!(this instanceof osmWay)) {
84295           return (new osmWay()).initialize(arguments);
84296       } else if (arguments.length) {
84297           this.initialize(arguments);
84298       }
84299   }
84300
84301
84302   osmEntity$$1.way = osmWay;
84303
84304   osmWay.prototype = Object.create(osmEntity$$1.prototype);
84305
84306
84307   assignIn(osmWay.prototype, {
84308       type: 'way',
84309       nodes: [],
84310
84311
84312       copy: function(resolver, copies) {
84313           if (copies[this.id]) return copies[this.id];
84314
84315           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
84316
84317           var nodes = this.nodes.map(function(id) {
84318               return resolver.entity(id).copy(resolver, copies).id;
84319           });
84320
84321           copy = copy.update({ nodes: nodes });
84322           copies[this.id] = copy;
84323
84324           return copy;
84325       },
84326
84327
84328       extent: function(resolver) {
84329           return resolver.transient(this, 'extent', function() {
84330               var extent = geoExtent$$1();
84331               for (var i = 0; i < this.nodes.length; i++) {
84332                   var node = resolver.hasEntity(this.nodes[i]);
84333                   if (node) {
84334                       extent._extend(node.extent());
84335                   }
84336               }
84337               return extent;
84338           });
84339       },
84340
84341
84342       first: function() {
84343           return this.nodes[0];
84344       },
84345
84346
84347       last: function() {
84348           return this.nodes[this.nodes.length - 1];
84349       },
84350
84351
84352       contains: function(node) {
84353           return this.nodes.indexOf(node) >= 0;
84354       },
84355
84356
84357       affix: function(node) {
84358           if (this.nodes[0] === node) return 'prefix';
84359           if (this.nodes[this.nodes.length - 1] === node) return 'suffix';
84360       },
84361
84362
84363       layer: function() {
84364           // explicit layer tag, clamp between -10, 10..
84365           if (isFinite(this.tags.layer)) {
84366               return Math.max(-10, Math.min(+(this.tags.layer), 10));
84367           }
84368
84369           // implied layer tag..
84370           if (this.tags.covered === 'yes') return -1;
84371           if (this.tags.location === 'overground') return 1;
84372           if (this.tags.location === 'underground') return -1;
84373           if (this.tags.location === 'underwater') return -10;
84374
84375           if (this.tags.power === 'line') return 10;
84376           if (this.tags.power === 'minor_line') return 10;
84377           if (this.tags.aerialway) return 10;
84378           if (this.tags.bridge) return 1;
84379           if (this.tags.cutting) return -1;
84380           if (this.tags.tunnel) return -1;
84381           if (this.tags.waterway) return -1;
84382           if (this.tags.man_made === 'pipeline') return -10;
84383           if (this.tags.boundary) return -10;
84384           return 0;
84385       },
84386
84387
84388       isOneWay: function() {
84389           // explicit oneway tag..
84390           var values = {
84391               'yes': true,
84392               '1': true,
84393               '-1': true,
84394               'reversible': true,
84395               'alternating': true,
84396               'no': false,
84397               '0': false
84398           };
84399           if (values[this.tags.oneway] !== undefined) {
84400               return values[this.tags.oneway];
84401           }
84402
84403           // implied oneway tag..
84404           for (var key in this.tags) {
84405               if (key in osmOneWayTags && (this.tags[key] in osmOneWayTags[key]))
84406                   return true;
84407           }
84408           return false;
84409       },
84410
84411       // Some identifier for tag that implies that this way is "sided",
84412       // i.e. the right side is the 'inside' (e.g. the right side of a
84413       // natural=cliff is lower).
84414       sidednessIdentifier: function() {
84415           for (var key in this.tags) {
84416               var value = this.tags[key];
84417               if (key in osmRightSideIsInsideTags && (value in osmRightSideIsInsideTags[key])) {
84418                   if (osmRightSideIsInsideTags[key][value] === true) {
84419                       return key;
84420                   } else {
84421                       // if the map's value is something other than a
84422                       // literal true, we should use it so we can
84423                       // special case some keys (e.g. natural=coastline
84424                       // is handled differently to other naturals).
84425                       return osmRightSideIsInsideTags[key][value];
84426                   }
84427               }
84428           }
84429
84430           return null;
84431       },
84432       isSided: function() {
84433           if (this.tags.two_sided === 'yes') {
84434               return false;
84435           }
84436
84437           return this.sidednessIdentifier() != null;
84438       },
84439
84440       lanes: function() {
84441           return osmLanes(this);
84442       },
84443
84444
84445       isClosed: function() {
84446           return this.nodes.length > 1 && this.first() === this.last();
84447       },
84448
84449
84450       isConvex: function(resolver) {
84451           if (!this.isClosed() || this.isDegenerate()) return null;
84452
84453           var nodes = uniq(resolver.childNodes(this));
84454           var coords = map$3(nodes, 'loc');
84455           var curr = 0;
84456           var prev = 0;
84457
84458           for (var i = 0; i < coords.length; i++) {
84459               var o = coords[(i+1) % coords.length];
84460               var a = coords[i];
84461               var b = coords[(i+2) % coords.length];
84462               var res = geoVecCross(a, b, o);
84463
84464               curr = (res > 0) ? 1 : (res < 0) ? -1 : 0;
84465               if (curr === 0) {
84466                   continue;
84467               } else if (prev && curr !== prev) {
84468                   return false;
84469               }
84470               prev = curr;
84471           }
84472           return true;
84473       },
84474
84475
84476       isArea: function() {
84477           // `highway` and `railway` are typically linear features, but there
84478           // are a few exceptions that should be treated as areas, even in the
84479           // absence of a proper `area=yes` or `areaKeys` tag.. see #4194
84480           var lineKeys = {
84481               highway: {
84482                   rest_area: true,
84483                   services: true
84484               },
84485               railway: {
84486                   roundhouse: true,
84487                   station: true,
84488                   traverser: true,
84489                   turntable: true,
84490                   wash: true
84491               }
84492           };
84493
84494           if (this.tags.area === 'yes')
84495               return true;
84496           if (!this.isClosed() || this.tags.area === 'no')
84497               return false;
84498           for (var key in this.tags) {
84499               if (key in areaKeys && !(this.tags[key] in areaKeys[key])) {
84500                   return true;
84501               }
84502               if (key in lineKeys && this.tags[key] in lineKeys[key]) {
84503                   return true;
84504               }
84505           }
84506           return false;
84507       },
84508
84509
84510       isDegenerate: function() {
84511           return uniq(this.nodes).length < (this.isArea() ? 3 : 2);
84512       },
84513
84514
84515       areAdjacent: function(n1, n2) {
84516           for (var i = 0; i < this.nodes.length; i++) {
84517               if (this.nodes[i] === n1) {
84518                   if (this.nodes[i - 1] === n2) return true;
84519                   if (this.nodes[i + 1] === n2) return true;
84520               }
84521           }
84522           return false;
84523       },
84524
84525
84526       geometry: function(graph) {
84527           return graph.transient(this, 'geometry', function() {
84528               return this.isArea() ? 'area' : 'line';
84529           });
84530       },
84531
84532
84533       // If this way is not closed, append the beginning node to the end of the nodelist to close it.
84534       close: function() {
84535           if (this.isClosed() || !this.nodes.length) return this;
84536
84537           var nodes = this.nodes.slice();
84538           nodes = nodes.filter(noRepeatNodes);
84539           nodes.push(nodes[0]);
84540           return this.update({ nodes: nodes });
84541       },
84542
84543
84544       // If this way is closed, remove any connector nodes from the end of the nodelist to unclose it.
84545       unclose: function() {
84546           if (!this.isClosed()) return this;
84547
84548           var nodes = this.nodes.slice();
84549           var connector = this.first();
84550           var i = nodes.length - 1;
84551
84552           // remove trailing connectors..
84553           while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
84554               nodes.splice(i, 1);
84555               i = nodes.length - 1;
84556           }
84557
84558           nodes = nodes.filter(noRepeatNodes);
84559           return this.update({ nodes: nodes });
84560       },
84561
84562
84563       // Adds a node (id) in front of the node which is currently at position index.
84564       // If index is undefined, the node will be added to the end of the way for linear ways,
84565       //   or just before the final connecting node for circular ways.
84566       // Consecutive duplicates are eliminated including existing ones.
84567       // Circularity is always preserved when adding a node.
84568       addNode: function(id, index) {
84569           var nodes = this.nodes.slice();
84570           var isClosed = this.isClosed();
84571           var max = isClosed ? nodes.length - 1 : nodes.length;
84572
84573           if (index === undefined) {
84574               index = max;
84575           }
84576
84577           if (index < 0 || index > max) {
84578               throw new RangeError('index ' + index + ' out of range 0..' + max);
84579           }
84580
84581           // If this is a closed way, remove all connector nodes except the first one
84582           // (there may be duplicates) and adjust index if necessary..
84583           if (isClosed) {
84584               var connector = this.first();
84585
84586               // leading connectors..
84587               var i = 1;
84588               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
84589                   nodes.splice(i, 1);
84590                   if (index > i) index--;
84591               }
84592
84593               // trailing connectors..
84594               i = nodes.length - 1;
84595               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
84596                   nodes.splice(i, 1);
84597                   if (index > i) index--;
84598                   i = nodes.length - 1;
84599               }
84600           }
84601
84602           nodes.splice(index, 0, id);
84603           nodes = nodes.filter(noRepeatNodes);
84604
84605           // If the way was closed before, append a connector node to keep it closed..
84606           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
84607               nodes.push(nodes[0]);
84608           }
84609
84610           return this.update({ nodes: nodes });
84611       },
84612
84613
84614       // Replaces the node which is currently at position index with the given node (id).
84615       // Consecutive duplicates are eliminated including existing ones.
84616       // Circularity is preserved when updating a node.
84617       updateNode: function(id, index) {
84618           var nodes = this.nodes.slice();
84619           var isClosed = this.isClosed();
84620           var max = nodes.length - 1;
84621
84622           if (index === undefined || index < 0 || index > max) {
84623               throw new RangeError('index ' + index + ' out of range 0..' + max);
84624           }
84625
84626           // If this is a closed way, remove all connector nodes except the first one
84627           // (there may be duplicates) and adjust index if necessary..
84628           if (isClosed) {
84629               var connector = this.first();
84630
84631               // leading connectors..
84632               var i = 1;
84633               while (i < nodes.length && nodes.length > 2 && nodes[i] === connector) {
84634                   nodes.splice(i, 1);
84635                   if (index > i) index--;
84636               }
84637
84638               // trailing connectors..
84639               i = nodes.length - 1;
84640               while (i > 0 && nodes.length > 1 && nodes[i] === connector) {
84641                   nodes.splice(i, 1);
84642                   if (index === i) index = 0;  // update leading connector instead
84643                   i = nodes.length - 1;
84644               }
84645           }
84646
84647           nodes.splice(index, 1, id);
84648           nodes = nodes.filter(noRepeatNodes);
84649
84650           // If the way was closed before, append a connector node to keep it closed..
84651           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
84652               nodes.push(nodes[0]);
84653           }
84654
84655           return this.update({nodes: nodes});
84656       },
84657
84658
84659       // Replaces each occurrence of node id needle with replacement.
84660       // Consecutive duplicates are eliminated including existing ones.
84661       // Circularity is preserved.
84662       replaceNode: function(needleID, replacementID) {
84663           var nodes = this.nodes.slice();
84664           var isClosed = this.isClosed();
84665
84666           for (var i = 0; i < nodes.length; i++) {
84667               if (nodes[i] === needleID) {
84668                   nodes[i] = replacementID;
84669               }
84670           }
84671
84672           nodes = nodes.filter(noRepeatNodes);
84673
84674           // If the way was closed before, append a connector node to keep it closed..
84675           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
84676               nodes.push(nodes[0]);
84677           }
84678
84679           return this.update({nodes: nodes});
84680       },
84681
84682
84683       // Removes each occurrence of node id.
84684       // Consecutive duplicates are eliminated including existing ones.
84685       // Circularity is preserved.
84686       removeNode: function(id) {
84687           var nodes = this.nodes.slice();
84688           var isClosed = this.isClosed();
84689
84690           nodes = nodes
84691               .filter(function(node) { return node !== id; })
84692               .filter(noRepeatNodes);
84693
84694           // If the way was closed before, append a connector node to keep it closed..
84695           if (isClosed && (nodes.length === 1 || nodes[0] !== nodes[nodes.length - 1])) {
84696               nodes.push(nodes[0]);
84697           }
84698
84699           return this.update({nodes: nodes});
84700       },
84701
84702
84703       asJXON: function(changeset_id) {
84704           var r = {
84705               way: {
84706                   '@id': this.osmId(),
84707                   '@version': this.version || 0,
84708                   nd: map$3(this.nodes, function(id) {
84709                       return { keyAttributes: { ref: osmEntity$$1.id.toOSM(id) } };
84710                   }),
84711                   tag: map$3(this.tags, function(v, k) {
84712                       return { keyAttributes: { k: k, v: v } };
84713                   })
84714               }
84715           };
84716           if (changeset_id) {
84717               r.way['@changeset'] = changeset_id;
84718           }
84719           return r;
84720       },
84721
84722
84723       asGeoJSON: function(resolver) {
84724           return resolver.transient(this, 'GeoJSON', function() {
84725               var coordinates = map$3(resolver.childNodes(this), 'loc');
84726               if (this.isArea() && this.isClosed()) {
84727                   return {
84728                       type: 'Polygon',
84729                       coordinates: [coordinates]
84730                   };
84731               } else {
84732                   return {
84733                       type: 'LineString',
84734                       coordinates: coordinates
84735                   };
84736               }
84737           });
84738       },
84739
84740
84741       area: function(resolver) {
84742           return resolver.transient(this, 'area', function() {
84743               var nodes = resolver.childNodes(this);
84744
84745               var json = {
84746                   type: 'Polygon',
84747                   coordinates: [map$3(nodes, 'loc')]
84748               };
84749
84750               if (!this.isClosed() && nodes.length) {
84751                   json.coordinates[0].push(nodes[0].loc);
84752               }
84753
84754               var area = d3_geoArea(json);
84755
84756               // Heuristic for detecting counterclockwise winding order. Assumes
84757               // that OpenStreetMap polygons are not hemisphere-spanning.
84758               if (area > 2 * Math.PI) {
84759                   json.coordinates[0] = json.coordinates[0].reverse();
84760                   area = d3_geoArea(json);
84761               }
84762
84763               return isNaN(area) ? 0 : area;
84764           });
84765       }
84766   });
84767
84768
84769   // Filter function to eliminate consecutive duplicates.
84770   function noRepeatNodes(node, i, arr) {
84771       return i === 0 || node !== arr[i - 1];
84772   }
84773
84774   // For fixing up rendering of multipolygons with tags on the outer member.
84775   // https://github.com/openstreetmap/iD/issues/613
84776   function osmIsSimpleMultipolygonOuterMember(entity, graph) {
84777       if (entity.type !== 'way' || Object.keys(entity.tags).filter(osmIsInterestingTag).length === 0)
84778           return false;
84779
84780       var parents = graph.parentRelations(entity);
84781       if (parents.length !== 1)
84782           return false;
84783
84784       var parent = parents[0];
84785       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
84786           return false;
84787
84788       var members = parent.members, member;
84789       for (var i = 0; i < members.length; i++) {
84790           member = members[i];
84791           if (member.id === entity.id && member.role && member.role !== 'outer')
84792               return false; // Not outer member
84793           if (member.id !== entity.id && (!member.role || member.role === 'outer'))
84794               return false; // Not a simple multipolygon
84795       }
84796
84797       return parent;
84798   }
84799
84800
84801   function osmSimpleMultipolygonOuterMember(entity, graph) {
84802       if (entity.type !== 'way')
84803           return false;
84804
84805       var parents = graph.parentRelations(entity);
84806       if (parents.length !== 1)
84807           return false;
84808
84809       var parent = parents[0];
84810       if (!parent.isMultipolygon() || Object.keys(parent.tags).filter(osmIsInterestingTag).length > 1)
84811           return false;
84812
84813       var members = parent.members, member, outerMember;
84814       for (var i = 0; i < members.length; i++) {
84815           member = members[i];
84816           if (!member.role || member.role === 'outer') {
84817               if (outerMember)
84818                   return false; // Not a simple multipolygon
84819               outerMember = member;
84820           }
84821       }
84822
84823       if (!outerMember)
84824           return false;
84825
84826       var outerEntity = graph.hasEntity(outerMember.id);
84827       if (!outerEntity || !Object.keys(outerEntity.tags).filter(osmIsInterestingTag).length)
84828           return false;
84829
84830       return outerEntity;
84831   }
84832
84833
84834   // Join `toJoin` array into sequences of connecting ways.
84835
84836   // Segments which share identical start/end nodes will, as much as possible,
84837   // be connected with each other.
84838   //
84839   // The return value is a nested array. Each constituent array contains elements
84840   // of `toJoin` which have been determined to connect.
84841   //
84842   // Each consitituent array also has a `nodes` property whose value is an
84843   // ordered array of member nodes, with appropriate order reversal and
84844   // start/end coordinate de-duplication.
84845   //
84846   // Members of `toJoin` must have, at minimum, `type` and `id` properties.
84847   // Thus either an array of `osmWay`s or a relation member array may be used.
84848   //
84849   // If an member is an `osmWay`, its tags and childnodes may be reversed via
84850   // `actionReverse` in the output.
84851   //
84852   // The returned sequences array also has an `actions` array property, containing
84853   // any reversal actions that should be applied to the graph, should the calling
84854   // code attempt to actually join the given ways.
84855   //
84856   // Incomplete members (those for which `graph.hasEntity(element.id)` returns
84857   // false) and non-way members are ignored.
84858   //
84859   function osmJoinWays(toJoin, graph) {
84860       function resolve(member) {
84861           return graph.childNodes(graph.entity(member.id));
84862       }
84863
84864       function reverse(item) {
84865           var action = actionReverse(item.id, { reverseOneway: true });
84866           sequences.actions.push(action);
84867           return (item instanceof osmWay) ? action(graph).entity(item.id) : item;
84868       }
84869
84870       // make a copy containing only the items to join
84871       toJoin = toJoin.filter(function(member) {
84872           return member.type === 'way' && graph.hasEntity(member.id);
84873       });
84874
84875       // Are the things we are joining relation members or `osmWays`?
84876       // If `osmWays`, skip the "prefer a forward path" code below (see #4872)
84877       var i;
84878       var joinAsMembers = true;
84879       for (i = 0; i < toJoin.length; i++) {
84880           if (toJoin[i] instanceof osmWay) {
84881               joinAsMembers = false;
84882               break;
84883           }
84884       }
84885
84886       var sequences = [];
84887       sequences.actions = [];
84888
84889       while (toJoin.length) {
84890           // start a new sequence
84891           var item = toJoin.shift();
84892           var currWays = [item];
84893           var currNodes = resolve(item).slice();
84894           var doneSequence = false;
84895
84896           // add to it
84897           while (toJoin.length && !doneSequence) {
84898               var start = currNodes[0];
84899               var end = currNodes[currNodes.length - 1];
84900               var fn = null;
84901               var nodes = null;
84902
84903               // Find the next way/member to join.
84904               for (i = 0; i < toJoin.length; i++) {
84905                   item = toJoin[i];
84906                   nodes = resolve(item);
84907
84908                   // (for member ordering only, not way ordering - see #4872)
84909                   // Strongly prefer to generate a forward path that preserves the order
84910                   // of the members array. For multipolygons and most relations, member
84911                   // order does not matter - but for routes, it does. (see #4589)
84912                   // If we started this sequence backwards (i.e. next member way attaches to
84913                   // the start node and not the end node), reverse the initial way before continuing.
84914                   if (joinAsMembers && currWays.length === 1 && nodes[0] !== end && nodes[nodes.length - 1] !== end &&
84915                       (nodes[nodes.length - 1] === start || nodes[0] === start)
84916                   ) {
84917                       currWays[0] = reverse(currWays[0]);
84918                       currNodes.reverse();
84919                       start = currNodes[0];
84920                       end = currNodes[currNodes.length - 1];
84921                   }
84922
84923                   if (nodes[0] === end) {
84924                       fn = currNodes.push;               // join to end
84925                       nodes = nodes.slice(1);
84926                       break;
84927                   } else if (nodes[nodes.length - 1] === end) {
84928                       fn = currNodes.push;               // join to end
84929                       nodes = nodes.slice(0, -1).reverse();
84930                       item = reverse(item);
84931                       break;
84932                   } else if (nodes[nodes.length - 1] === start) {
84933                       fn = currNodes.unshift;            // join to beginning
84934                       nodes = nodes.slice(0, -1);
84935                       break;
84936                   } else if (nodes[0] === start) {
84937                       fn = currNodes.unshift;            // join to beginning
84938                       nodes = nodes.slice(1).reverse();
84939                       item = reverse(item);
84940                       break;
84941                   } else {
84942                       fn = nodes = null;
84943                   }
84944               }
84945
84946               if (!nodes) {     // couldn't find a joinable way/member
84947                   doneSequence = true;
84948                   break;
84949               }
84950
84951               fn.apply(currWays, [item]);
84952               fn.apply(currNodes, nodes);
84953
84954               toJoin.splice(i, 1);
84955           }
84956
84957           currWays.nodes = currNodes;
84958           sequences.push(currWays);
84959       }
84960
84961       return sequences;
84962   }
84963
84964   function osmRelation() {
84965       if (!(this instanceof osmRelation)) {
84966           return (new osmRelation()).initialize(arguments);
84967       } else if (arguments.length) {
84968           this.initialize(arguments);
84969       }
84970   }
84971
84972
84973   osmEntity$$1.relation = osmRelation;
84974
84975   osmRelation.prototype = Object.create(osmEntity$$1.prototype);
84976
84977
84978   osmRelation.creationOrder = function(a, b) {
84979       var aId = parseInt(osmEntity$$1.id.toOSM(a.id), 10);
84980       var bId = parseInt(osmEntity$$1.id.toOSM(b.id), 10);
84981
84982       if (aId < 0 || bId < 0) return aId - bId;
84983       return bId - aId;
84984   };
84985
84986
84987   assignIn(osmRelation.prototype, {
84988       type: 'relation',
84989       members: [],
84990
84991
84992       copy: function(resolver, copies) {
84993           if (copies[this.id]) return copies[this.id];
84994
84995           var copy = osmEntity$$1.prototype.copy.call(this, resolver, copies);
84996
84997           var members = this.members.map(function(member) {
84998               return assignIn({}, member, { id: resolver.entity(member.id).copy(resolver, copies).id });
84999           });
85000
85001           copy = copy.update({members: members});
85002           copies[this.id] = copy;
85003
85004           return copy;
85005       },
85006
85007
85008       extent: function(resolver, memo) {
85009           return resolver.transient(this, 'extent', function() {
85010               if (memo && memo[this.id]) return geoExtent$$1();
85011               memo = memo || {};
85012               memo[this.id] = true;
85013
85014               var extent = geoExtent$$1();
85015               for (var i = 0; i < this.members.length; i++) {
85016                   var member = resolver.hasEntity(this.members[i].id);
85017                   if (member) {
85018                       extent._extend(member.extent(resolver, memo));
85019                   }
85020               }
85021               return extent;
85022           });
85023       },
85024
85025
85026       geometry: function(graph) {
85027           return graph.transient(this, 'geometry', function() {
85028               return this.isMultipolygon() ? 'area' : 'relation';
85029           });
85030       },
85031
85032
85033       isDegenerate: function() {
85034           return this.members.length === 0;
85035       },
85036
85037
85038       // Return an array of members, each extended with an 'index' property whose value
85039       // is the member index.
85040       indexedMembers: function() {
85041           var result = new Array(this.members.length);
85042           for (var i = 0; i < this.members.length; i++) {
85043               result[i] = assignIn({}, this.members[i], {index: i});
85044           }
85045           return result;
85046       },
85047
85048
85049       // Return the first member with the given role. A copy of the member object
85050       // is returned, extended with an 'index' property whose value is the member index.
85051       memberByRole: function(role) {
85052           for (var i = 0; i < this.members.length; i++) {
85053               if (this.members[i].role === role) {
85054                   return assignIn({}, this.members[i], {index: i});
85055               }
85056           }
85057       },
85058
85059       // Same as memberByRole, but returns all members with the given role
85060       membersByRole: function(role) {
85061           var result = [];
85062           for (var i = 0; i < this.members.length; i++) {
85063               if (this.members[i].role === role) {
85064                   result.push(assignIn({}, this.members[i], {index: i}));
85065               }
85066           }
85067           return result;
85068       },
85069
85070       // Return the first member with the given id. A copy of the member object
85071       // is returned, extended with an 'index' property whose value is the member index.
85072       memberById: function(id) {
85073           for (var i = 0; i < this.members.length; i++) {
85074               if (this.members[i].id === id) {
85075                   return assignIn({}, this.members[i], {index: i});
85076               }
85077           }
85078       },
85079
85080
85081       // Return the first member with the given id and role. A copy of the member object
85082       // is returned, extended with an 'index' property whose value is the member index.
85083       memberByIdAndRole: function(id, role) {
85084           for (var i = 0; i < this.members.length; i++) {
85085               if (this.members[i].id === id && this.members[i].role === role) {
85086                   return assignIn({}, this.members[i], {index: i});
85087               }
85088           }
85089       },
85090
85091
85092       addMember: function(member, index) {
85093           var members = this.members.slice();
85094           members.splice(index === undefined ? members.length : index, 0, member);
85095           return this.update({members: members});
85096       },
85097
85098
85099       updateMember: function(member, index) {
85100           var members = this.members.slice();
85101           members.splice(index, 1, assignIn({}, members[index], member));
85102           return this.update({members: members});
85103       },
85104
85105
85106       removeMember: function(index) {
85107           var members = this.members.slice();
85108           members.splice(index, 1);
85109           return this.update({members: members});
85110       },
85111
85112
85113       removeMembersWithID: function(id) {
85114           var members = reject(this.members, function(m) { return m.id === id; });
85115           return this.update({members: members});
85116       },
85117
85118
85119       // Wherever a member appears with id `needle.id`, replace it with a member
85120       // with id `replacement.id`, type `replacement.type`, and the original role,
85121       // By default, adding a duplicate member (by id and role) is prevented.
85122       // Return an updated relation.
85123       replaceMember: function(needle, replacement, keepDuplicates) {
85124           if (!this.memberById(needle.id))
85125               return this;
85126
85127           var members = [];
85128
85129           for (var i = 0; i < this.members.length; i++) {
85130               var member = this.members[i];
85131               if (member.id !== needle.id) {
85132                   members.push(member);
85133               } else if (keepDuplicates || !this.memberByIdAndRole(replacement.id, member.role)) {
85134                   members.push({id: replacement.id, type: replacement.type, role: member.role});
85135               }
85136           }
85137
85138           return this.update({members: members});
85139       },
85140
85141
85142       asJXON: function(changeset_id) {
85143           var r = {
85144               relation: {
85145                   '@id': this.osmId(),
85146                   '@version': this.version || 0,
85147                   member: map$3(this.members, function(member) {
85148                       return {
85149                           keyAttributes: {
85150                               type: member.type,
85151                               role: member.role,
85152                               ref: osmEntity$$1.id.toOSM(member.id)
85153                           }
85154                       };
85155                   }),
85156                   tag: map$3(this.tags, function(v, k) {
85157                       return { keyAttributes: { k: k, v: v } };
85158                   })
85159               }
85160           };
85161           if (changeset_id) r.relation['@changeset'] = changeset_id;
85162           return r;
85163       },
85164
85165
85166       asGeoJSON: function(resolver) {
85167           return resolver.transient(this, 'GeoJSON', function () {
85168               if (this.isMultipolygon()) {
85169                   return {
85170                       type: 'MultiPolygon',
85171                       coordinates: this.multipolygon(resolver)
85172                   };
85173               } else {
85174                   return {
85175                       type: 'FeatureCollection',
85176                       properties: this.tags,
85177                       features: this.members.map(function (member) {
85178                           return assignIn({role: member.role}, resolver.entity(member.id).asGeoJSON(resolver));
85179                       })
85180                   };
85181               }
85182           });
85183       },
85184
85185
85186       area: function(resolver) {
85187           return resolver.transient(this, 'area', function() {
85188               return d3_geoArea(this.asGeoJSON(resolver));
85189           });
85190       },
85191
85192
85193       isMultipolygon: function() {
85194           return this.tags.type === 'multipolygon';
85195       },
85196
85197
85198       isComplete: function(resolver) {
85199           for (var i = 0; i < this.members.length; i++) {
85200               if (!resolver.hasEntity(this.members[i].id)) {
85201                   return false;
85202               }
85203           }
85204           return true;
85205       },
85206
85207
85208       isRestriction: function() {
85209           return !!(this.tags.type && this.tags.type.match(/^restriction:?/));
85210       },
85211
85212
85213       isValidRestriction: function() {
85214           if (!this.isRestriction()) return false;
85215
85216           var froms = this.members.filter(function(m) { return m.role === 'from'; });
85217           var vias = this.members.filter(function(m) { return m.role === 'via'; });
85218           var tos = this.members.filter(function(m) { return m.role === 'to'; });
85219
85220           if (froms.length !== 1 && this.tags.restriction !== 'no_entry') return false;
85221           if (froms.some(function(m) { return m.type !== 'way'; })) return false;
85222
85223           if (tos.length !== 1 && this.tags.restriction !== 'no_exit') return false;
85224           if (tos.some(function(m) { return m.type !== 'way'; })) return false;
85225
85226           if (vias.length === 0) return false;
85227           if (vias.length > 1 && vias.some(function(m) { return m.type !== 'way'; })) return false;
85228
85229           return true;
85230       },
85231
85232
85233       // Returns an array [A0, ... An], each Ai being an array of node arrays [Nds0, ... Ndsm],
85234       // where Nds0 is an outer ring and subsequent Ndsi's (if any i > 0) being inner rings.
85235       //
85236       // This corresponds to the structure needed for rendering a multipolygon path using a
85237       // `evenodd` fill rule, as well as the structure of a GeoJSON MultiPolygon geometry.
85238       //
85239       // In the case of invalid geometries, this function will still return a result which
85240       // includes the nodes of all way members, but some Nds may be unclosed and some inner
85241       // rings not matched with the intended outer ring.
85242       //
85243       multipolygon: function(resolver) {
85244           var outers = this.members.filter(function(m) { return 'outer' === (m.role || 'outer'); });
85245           var inners = this.members.filter(function(m) { return 'inner' === m.role; });
85246
85247           outers = osmJoinWays(outers, resolver);
85248           inners = osmJoinWays(inners, resolver);
85249
85250           outers = outers.map(function(outer) { return map$3(outer.nodes, 'loc'); });
85251           inners = inners.map(function(inner) { return map$3(inner.nodes, 'loc'); });
85252
85253           var result = outers.map(function(o) {
85254               // Heuristic for detecting counterclockwise winding order. Assumes
85255               // that OpenStreetMap polygons are not hemisphere-spanning.
85256               return [d3_geoArea({ type: 'Polygon', coordinates: [o] }) > 2 * Math.PI ? o.reverse() : o];
85257           });
85258
85259           function findOuter(inner) {
85260               var o, outer;
85261
85262               for (o = 0; o < outers.length; o++) {
85263                   outer = outers[o];
85264                   if (geoPolygonContainsPolygon(outer, inner))
85265                       return o;
85266               }
85267
85268               for (o = 0; o < outers.length; o++) {
85269                   outer = outers[o];
85270                   if (geoPolygonIntersectsPolygon(outer, inner, false))
85271                       return o;
85272               }
85273           }
85274
85275           for (var i = 0; i < inners.length; i++) {
85276               var inner = inners[i];
85277
85278               if (d3_geoArea({ type: 'Polygon', coordinates: [inner] }) < 2 * Math.PI) {
85279                   inner = inner.reverse();
85280               }
85281
85282               var o = findOuter(inners[i]);
85283               if (o !== undefined)
85284                   result[o].push(inners[i]);
85285               else
85286                   result.push([inners[i]]); // Invalid geometry
85287           }
85288
85289           return result;
85290       }
85291   });
85292
85293   function osmTurn(turn) {
85294       if (!(this instanceof osmTurn)) {
85295           return new osmTurn(turn);
85296       }
85297       assignIn(this, turn);
85298   }
85299
85300
85301   function osmIntersection(graph, startVertexId, maxDistance) {
85302       maxDistance = maxDistance || 30;    // in meters
85303       var vgraph = coreGraph$$1();           // virtual graph
85304       var i, j, k;
85305
85306
85307       function memberOfRestriction(entity) {
85308           return graph.parentRelations(entity)
85309               .some(function(r) { return r.isRestriction(); });
85310       }
85311
85312       function isRoad(way) {
85313           if (way.isArea() || way.isDegenerate()) return false;
85314           var roads = {
85315               'motorway': true,
85316               'motorway_link': true,
85317               'trunk': true,
85318               'trunk_link': true,
85319               'primary': true,
85320               'primary_link': true,
85321               'secondary': true,
85322               'secondary_link': true,
85323               'tertiary': true,
85324               'tertiary_link': true,
85325               'residential': true,
85326               'unclassified': true,
85327               'living_street': true,
85328               'service': true,
85329               'road': true,
85330               'track': true
85331           };
85332           return roads[way.tags.highway];
85333       }
85334
85335
85336       var startNode = graph.entity(startVertexId);
85337       var checkVertices = [startNode];
85338       var checkWays;
85339       var vertices = [];
85340       var vertexIds = [];
85341       var vertex;
85342       var ways = [];
85343       var wayIds = [];
85344       var way;
85345       var nodes = [];
85346       var node;
85347       var parents = [];
85348       var parent;
85349
85350       // `actions` will store whatever actions must be performed to satisfy
85351       // preconditions for adding a turn restriction to this intersection.
85352       //  - Remove any existing degenerate turn restrictions (missing from/to, etc)
85353       //  - Reverse oneways so that they are drawn in the forward direction
85354       //  - Split ways on key vertices
85355       var actions = [];
85356
85357
85358       // STEP 1:  walk the graph outwards from starting vertex to search
85359       //  for more key vertices and ways to include in the intersection..
85360
85361       while (checkVertices.length) {
85362           vertex = checkVertices.pop();
85363
85364           // check this vertex for parent ways that are roads
85365           checkWays = graph.parentWays(vertex);
85366           var hasWays = false;
85367           for (i = 0; i < checkWays.length; i++) {
85368               way = checkWays[i];
85369               if (!isRoad(way) && !memberOfRestriction(way)) continue;
85370
85371               ways.push(way);   // it's a road, or it's already in a turn restriction
85372               hasWays = true;
85373
85374               // check the way's children for more key vertices
85375               nodes = uniq(graph.childNodes(way));
85376               for (j = 0; j < nodes.length; j++) {
85377                   node = nodes[j];
85378                   if (node === vertex) continue;                                           // same thing
85379                   if (vertices.indexOf(node) !== -1) continue;                             // seen it already
85380                   if (node.loc && startNode.loc &&
85381                       geoSphericalDistance(node.loc, startNode.loc) > maxDistance) continue;   // too far from start
85382
85383                   // a key vertex will have parents that are also roads
85384                   var hasParents = false;
85385                   parents = graph.parentWays(node);
85386                   for (k = 0; k < parents.length; k++) {
85387                       parent = parents[k];
85388                       if (parent === way) continue;                 // same thing
85389                       if (ways.indexOf(parent) !== -1) continue;    // seen it already
85390                       if (!isRoad(parent)) continue;                // not a road
85391                       hasParents = true;
85392                       break;
85393                   }
85394
85395                   if (hasParents) {
85396                       checkVertices.push(node);
85397                   }
85398               }
85399           }
85400
85401           if (hasWays) {
85402               vertices.push(vertex);
85403           }
85404       }
85405
85406       vertices = uniq(vertices);
85407       ways = uniq(ways);
85408
85409
85410       // STEP 2:  Build a virtual graph containing only the entities in the intersection..
85411       // Everything done after this step should act on the virtual graph
85412       // Any actions that must be performed later to the main graph go in `actions` array
85413       ways.forEach(function(way) {
85414           graph.childNodes(way).forEach(function(node) {
85415               vgraph = vgraph.replace(node);
85416           });
85417
85418           vgraph = vgraph.replace(way);
85419
85420           graph.parentRelations(way).forEach(function(relation) {
85421               if (relation.isRestriction()) {
85422                   if (relation.isValidRestriction(graph)) {
85423                       vgraph = vgraph.replace(relation);
85424                   } else if (relation.isComplete(graph)) {
85425                       actions.push(actionDeleteRelation(relation.id));
85426                   }
85427               }
85428           });
85429       });
85430
85431
85432       // STEP 3:  Force all oneways to be drawn in the forward direction
85433       ways.forEach(function(w) {
85434           var way = vgraph.entity(w.id);
85435           if (way.tags.oneway === '-1') {
85436               var action = actionReverse(way.id, { reverseOneway: true });
85437               actions.push(action);
85438               vgraph = action(vgraph);
85439           }
85440       });
85441
85442
85443       // STEP 4:  Split ways on key vertices
85444       var origCount = osmEntity$$1.id.next.way;
85445       vertices.forEach(function(v) {
85446           // This is an odd way to do it, but we need to find all the ways that
85447           // will be split here, then split them one at a time to ensure that these
85448           // actions can be replayed on the main graph exactly in the same order.
85449           // (It is unintuitive, but the order of ways returned from graph.parentWays()
85450           // is arbitrary, depending on how the main graph and vgraph were built)
85451           var splitAll = actionSplit(v.id);
85452           if (!splitAll.disabled(vgraph)) {
85453               splitAll.ways(vgraph).forEach(function(way) {
85454                   var splitOne = actionSplit(v.id).limitWays([way.id]);
85455                   actions.push(splitOne);
85456                   vgraph = splitOne(vgraph);
85457               });
85458           }
85459       });
85460
85461       // In here is where we should also split the intersection at nearby junction.
85462       //   for https://github.com/mapbox/iD-internal/issues/31
85463       // nearbyVertices.forEach(function(v) {
85464       // });
85465
85466       // Reasons why we reset the way id count here:
85467       //  1. Continuity with way ids created by the splits so that we can replay
85468       //     these actions later if the user decides to create a turn restriction
85469       //  2. Avoids churning way ids just by hovering over a vertex
85470       //     and displaying the turn restriction editor
85471       osmEntity$$1.id.next.way = origCount;
85472
85473
85474       // STEP 5:  Update arrays to point to vgraph entities
85475       vertexIds = vertices.map(function(v) { return v.id; });
85476       vertices = [];
85477       ways = [];
85478
85479       vertexIds.forEach(function(id) {
85480           var vertex = vgraph.entity(id);
85481           var parents = vgraph.parentWays(vertex);
85482           vertices.push(vertex);
85483           ways = ways.concat(parents);
85484       });
85485
85486       vertices = uniq(vertices);
85487       ways = uniq(ways);
85488
85489       vertexIds = vertices.map(function(v) { return v.id; });
85490       wayIds = ways.map(function(w) { return w.id; });
85491
85492
85493       // STEP 6:  Update the ways with some metadata that will be useful for
85494       // walking the intersection graph later and rendering turn arrows.
85495
85496       function withMetadata(way, vertexIds) {
85497           var __oneWay = way.isOneWay();
85498
85499           // which affixes are key vertices?
85500           var __first = (vertexIds.indexOf(way.first()) !== -1);
85501           var __last = (vertexIds.indexOf(way.last()) !== -1);
85502
85503           // what roles is this way eligible for?
85504           var __via = (__first && __last);
85505           var __from = ((__first && !__oneWay) || __last);
85506           var __to = (__first || (__last && !__oneWay));
85507
85508           return way.update({
85509               __first:  __first,
85510               __last:  __last,
85511               __from:  __from,
85512               __via: __via,
85513               __to:  __to,
85514               __oneWay:  __oneWay
85515           });
85516       }
85517
85518       ways = [];
85519       wayIds.forEach(function(id) {
85520           var way = withMetadata(vgraph.entity(id), vertexIds);
85521           vgraph = vgraph.replace(way);
85522           ways.push(way);
85523       });
85524
85525
85526       // STEP 7:  Simplify - This is an iterative process where we:
85527       //  1. Find trivial vertices with only 2 parents
85528       //  2. trim off the leaf way from those vertices and remove from vgraph
85529
85530       var keepGoing;
85531       var removeWayIds = [];
85532       var removeVertexIds = [];
85533
85534       do {
85535           keepGoing = false;
85536           checkVertices = vertexIds.slice();
85537
85538           for (i = 0; i < checkVertices.length; i++) {
85539               var vertexId = checkVertices[i];
85540               vertex = vgraph.hasEntity(vertexId);
85541
85542               if (!vertex) {
85543                   if (vertexIds.indexOf(vertexId) !== -1) {
85544                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
85545                   }
85546                   removeVertexIds.push(vertexId);
85547                   continue;
85548               }
85549
85550               parents = vgraph.parentWays(vertex);
85551               if (parents.length < 3) {
85552                   if (vertexIds.indexOf(vertexId) !== -1) {
85553                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
85554                   }
85555               }
85556
85557               if (parents.length === 2) {     // vertex with 2 parents is trivial
85558                   var a = parents[0];
85559                   var b = parents[1];
85560                   var aIsLeaf = a && !a.__via;
85561                   var bIsLeaf = b && !b.__via;
85562                   var leaf, survivor;
85563
85564                   if (aIsLeaf && !bIsLeaf) {
85565                       leaf = a;
85566                       survivor = b;
85567                   } else if (!aIsLeaf && bIsLeaf) {
85568                       leaf = b;
85569                       survivor = a;
85570                   }
85571
85572                   if (leaf && survivor) {
85573                       survivor = withMetadata(survivor, vertexIds);      // update survivor way
85574                       vgraph = vgraph.replace(survivor).remove(leaf);    // update graph
85575                       removeWayIds.push(leaf.id);
85576                       keepGoing = true;
85577                   }
85578               }
85579
85580               parents = vgraph.parentWays(vertex);
85581
85582               if (parents.length < 2) {     // vertex is no longer a key vertex
85583                   if (vertexIds.indexOf(vertexId) !== -1) {
85584                       vertexIds.splice(vertexIds.indexOf(vertexId), 1);   // stop checking this one
85585                   }
85586                   removeVertexIds.push(vertexId);
85587                   keepGoing = true;
85588               }
85589
85590               if (parents.length < 1) {     // vertex is no longer attached to anything
85591                   vgraph = vgraph.remove(vertex);
85592               }
85593
85594           }
85595       } while (keepGoing);
85596
85597
85598       vertices = vertices
85599           .filter(function(vertex) { return removeVertexIds.indexOf(vertex.id) === -1; })
85600           .map(function(vertex) { return vgraph.entity(vertex.id); });
85601       ways = ways
85602           .filter(function(way) { return removeWayIds.indexOf(way.id) === -1; })
85603           .map(function(way) { return vgraph.entity(way.id); });
85604
85605
85606       // OK!  Here is our intersection..
85607       var intersection = {
85608           graph: vgraph,
85609           actions: actions,
85610           vertices: vertices,
85611           ways: ways,
85612       };
85613
85614
85615
85616       // Get all the valid turns through this intersection given a starting way id.
85617       // This operates on the virtual graph for everything.
85618       //
85619       // Basically, walk through all possible paths from starting way,
85620       //   honoring the existing turn restrictions as we go (watch out for loops!)
85621       //
85622       // For each path found, generate and return a `osmTurn` datastructure.
85623       //
85624       intersection.turns = function(fromWayId, maxViaWay) {
85625           if (!fromWayId) return [];
85626           if (!maxViaWay) maxViaWay = 0;
85627
85628           var vgraph = intersection.graph;
85629           var keyVertexIds = intersection.vertices.map(function(v) { return v.id; });
85630
85631           var start = vgraph.entity(fromWayId);
85632           if (!start || !(start.__from || start.__via)) return [];
85633
85634           // maxViaWay=0   from-*-to              (0 vias)
85635           // maxViaWay=1   from-*-via-*-to        (1 via max)
85636           // maxViaWay=2   from-*-via-*-via-*-to  (2 vias max)
85637           var maxPathLength = (maxViaWay * 2) + 3;
85638           var turns = [];
85639
85640           step(start);
85641           return turns;
85642
85643
85644           // traverse the intersection graph and find all the valid paths
85645           function step(entity, currPath, currRestrictions, matchedRestriction) {
85646               currPath = clone(currPath || []);
85647               if (currPath.length >= maxPathLength) return;
85648               currPath.push(entity.id);
85649               currRestrictions = clone(currRestrictions || []);
85650               var i, j;
85651
85652               if (entity.type === 'node') {
85653                   var parents = vgraph.parentWays(entity);
85654                   var nextWays = [];
85655
85656                   // which ways can we step into?
85657                   for (i = 0; i < parents.length; i++) {
85658                       var way = parents[i];
85659
85660                       // if next way is a oneway incoming to this vertex, skip
85661                       if (way.__oneWay && way.nodes[0] !== entity.id) continue;
85662
85663                       // if we have seen it before (allowing for an initial u-turn), skip
85664                       if (currPath.indexOf(way.id) !== -1 && currPath.length >= 3) continue;
85665
85666                       // Check all "current" restrictions (where we've already walked the `FROM`)
85667                       var restrict = undefined;
85668                       for (j = 0; j < currRestrictions.length; j++) {
85669                           var restriction = currRestrictions[j];
85670                           var f = restriction.memberByRole('from');
85671                           var v = restriction.membersByRole('via');
85672                           var t = restriction.memberByRole('to');
85673                           var isOnly = /^only_/.test(restriction.tags.restriction);
85674
85675                           // Does the current path match this turn restriction?
85676                           var matchesFrom = (f.id === fromWayId);
85677                           var matchesViaTo = false;
85678                           var isAlongOnlyPath = false;
85679
85680                           if (t.id === way.id) {     // match TO
85681
85682                               if (v.length === 1 && v[0].type === 'node') {    // match VIA node
85683                                   matchesViaTo = (v[0].id === entity.id && (
85684                                       (matchesFrom && currPath.length === 2) ||
85685                                       (!matchesFrom && currPath.length > 2)
85686                                   ));
85687
85688                               } else {                                         // match all VIA ways
85689                                   var pathVias = [];
85690                                   for (k = 2; k < currPath.length; k +=2 ) {   // k = 2 skips FROM
85691                                       pathVias.push(currPath[k]);              // (path goes way-node-way...)
85692                                   }
85693                                   var restrictionVias = [];
85694                                   for (k = 0; k < v.length; k++) {
85695                                       if (v[k].type === 'way') {
85696                                           restrictionVias.push(v[k].id);
85697                                       }
85698                                   }
85699                                   var diff = difference(pathVias, restrictionVias);
85700                                   matchesViaTo = !diff.length;
85701                               }
85702
85703                           } else if (isOnly) {
85704                               for (k = 0; k < v.length; k++) {
85705                                   // way doesn't match TO, but is one of the via ways along the path of an "only"
85706                                   if (v[k].type === 'way' && v[k].id === way.id) {
85707                                       isAlongOnlyPath = true;
85708                                       break;
85709                                   }
85710                               }
85711                           }
85712
85713                           if (matchesViaTo) {
85714                               if (isOnly) {
85715                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, only: true, end: true };
85716                               } else {
85717                                   restrict = { id: restriction.id, direct: matchesFrom, from: f.id, no: true, end: true };
85718                               }
85719                           } else {    // indirect - caused by a different nearby restriction
85720                               if (isAlongOnlyPath) {
85721                                   restrict = { id: restriction.id, direct: false, from: f.id, only: true, end: false };
85722                               } else if (isOnly) {
85723                                   restrict = { id: restriction.id, direct: false, from: f.id, no: true, end: true };
85724                               }
85725                           }
85726
85727                           // stop looking if we find a "direct" restriction (matching FROM, VIA, TO)
85728                           if (restrict && restrict.direct)
85729                               break;
85730                       }
85731
85732                       nextWays.push({ way: way, restrict: restrict });
85733                   }
85734
85735                   nextWays.forEach(function(nextWay) {
85736                       step(nextWay.way, currPath, currRestrictions, nextWay.restrict);
85737                   });
85738
85739
85740               } else {  // entity.type === 'way'
85741                   if (currPath.length >= 3) {     // this is a "complete" path..
85742                       var turnPath = clone(currPath);
85743
85744                       // an indirect restriction - only include the partial path (starting at FROM)
85745                       if (matchedRestriction && matchedRestriction.direct === false) {
85746                           for (i = 0; i < turnPath.length; i++) {
85747                               if (turnPath[i] === matchedRestriction.from) {
85748                                   turnPath = turnPath.slice(i);
85749                                   break;
85750                               }
85751                           }
85752                       }
85753
85754                       var turn = pathToTurn(turnPath);
85755                       if (turn) {
85756                           if (matchedRestriction) {
85757                               turn.restrictionID = matchedRestriction.id;
85758                               turn.no = matchedRestriction.no;
85759                               turn.only = matchedRestriction.only;
85760                               turn.direct = matchedRestriction.direct;
85761                           }
85762                           turns.push(osmTurn(turn));
85763                       }
85764
85765                       if (currPath[0] === currPath[2]) return;   // if we made a u-turn - stop here
85766                   }
85767
85768                   if (matchedRestriction && matchedRestriction.end) return;  // don't advance any further
85769
85770                   // which nodes can we step into?
85771                   var n1 = vgraph.entity(entity.first());
85772                   var n2 = vgraph.entity(entity.last());
85773                   var dist = n1.loc && n2.loc && geoSphericalDistance(n1.loc, n2.loc);
85774                   var nextNodes = [];
85775
85776                   if (currPath.length > 1) {
85777                       if (dist > maxDistance) return;   // the next node is too far
85778                       if (!entity.__via) return;        // this way is a leaf / can't be a via
85779                   }
85780
85781                   if (!entity.__oneWay &&                     // bidirectional..
85782                       keyVertexIds.indexOf(n1.id) !== -1 &&   // key vertex..
85783                       currPath.indexOf(n1.id) === -1) {       // haven't seen it yet..
85784                       nextNodes.push(n1);                     // can advance to first node
85785                   }
85786                   if (keyVertexIds.indexOf(n2.id) !== -1 &&   // key vertex..
85787                       currPath.indexOf(n2.id) === -1) {       // haven't seen it yet..
85788                       nextNodes.push(n2);                     // can advance to last node
85789                   }
85790
85791                   nextNodes.forEach(function(nextNode) {
85792                       // gather restrictions FROM this way
85793                       var fromRestrictions = vgraph.parentRelations(entity).filter(function(r) {
85794                           if (!r.isRestriction()) return false;
85795
85796                           var f = r.memberByRole('from');
85797                           if (!f || f.id !== entity.id) return false;
85798
85799                           var isOnly = /^only_/.test(r.tags.restriction);
85800                           if (!isOnly) return true;
85801
85802                           // `only_` restrictions only matter along the direction of the VIA - #4849
85803                           var isOnlyVia = false;
85804                           var v = r.membersByRole('via');
85805                           if (v.length === 1 && v[0].type === 'node') {   // via node
85806                               isOnlyVia = (v[0].id === nextNode.id);
85807                           } else {                                        // via way(s)
85808                               for (var i = 0; i < v.length; i++) {
85809                                   if (v[i].type !== 'way') continue;
85810                                   var viaWay = vgraph.entity(v[i].id);
85811                                   if (viaWay.first() === nextNode.id || viaWay.last() === nextNode.id) {
85812                                       isOnlyVia = true;
85813                                       break;
85814                                   }
85815                               }
85816                           }
85817                           return isOnlyVia;
85818                       });
85819
85820                       step(nextNode, currPath, currRestrictions.concat(fromRestrictions), false);
85821                   });
85822               }
85823           }
85824
85825
85826           // assumes path is alternating way-node-way of odd length
85827           function pathToTurn(path) {
85828               if (path.length < 3) return;
85829               var fromWayId, fromNodeId, fromVertexId;
85830               var toWayId, toNodeId, toVertexId;
85831               var viaWayIds, viaNodeId, isUturn;
85832
85833               fromWayId = path[0];
85834               toWayId = path[path.length - 1];
85835
85836               if (path.length === 3 && fromWayId === toWayId) {  // u turn
85837                   var way = vgraph.entity(fromWayId);
85838                   if (way.__oneWay) return null;
85839
85840                   isUturn = true;
85841                   viaNodeId = fromVertexId = toVertexId = path[1];
85842                   fromNodeId = toNodeId = adjacentNode(fromWayId, viaNodeId);
85843
85844               } else {
85845                   isUturn = false;
85846                   fromVertexId = path[1];
85847                   fromNodeId = adjacentNode(fromWayId, fromVertexId);
85848                   toVertexId = path[path.length - 2];
85849                   toNodeId = adjacentNode(toWayId, toVertexId);
85850
85851                   if (path.length === 3) {
85852                       viaNodeId = path[1];
85853                   } else {
85854                       viaWayIds = path.filter(function(entityId) { return entityId[0] === 'w'; });
85855                       viaWayIds = viaWayIds.slice(1, viaWayIds.length - 1);  // remove first, last
85856                   }
85857               }
85858
85859               return {
85860                   key:  path.join('_'),
85861                   path: path,
85862                   from: { node: fromNodeId, way:  fromWayId, vertex: fromVertexId },
85863                   via:  { node: viaNodeId,  ways: viaWayIds },
85864                   to:   { node: toNodeId,   way:  toWayId, vertex: toVertexId },
85865                   u:    isUturn
85866               };
85867
85868
85869               function adjacentNode(wayId, affixId) {
85870                   var nodes = vgraph.entity(wayId).nodes;
85871                   return affixId === nodes[0] ? nodes[1] : nodes[nodes.length - 2];
85872               }
85873           }
85874
85875       };
85876
85877       return intersection;
85878   }
85879
85880
85881   function osmInferRestriction(graph, turn, projection) {
85882       var fromWay = graph.entity(turn.from.way);
85883       var fromNode = graph.entity(turn.from.node);
85884       var fromVertex = graph.entity(turn.from.vertex);
85885       var toWay = graph.entity(turn.to.way);
85886       var toNode = graph.entity(turn.to.node);
85887       var toVertex = graph.entity(turn.to.vertex);
85888
85889       var fromOneWay = (fromWay.tags.oneway === 'yes');
85890       var toOneWay = (toWay.tags.oneway === 'yes');
85891       var angle = (geoAngle(fromVertex, fromNode, projection) -
85892                   geoAngle(toVertex, toNode, projection)) * 180 / Math.PI;
85893
85894       while (angle < 0)
85895           angle += 360;
85896
85897       if (fromNode === toNode)
85898           return 'no_u_turn';
85899       if ((angle < 23 || angle > 336) && fromOneWay && toOneWay)
85900           return 'no_u_turn';   // wider tolerance for u-turn if both ways are oneway
85901       if ((angle < 40 || angle > 319) && fromOneWay && toOneWay && turn.from.vertex !== turn.to.vertex)
85902           return 'no_u_turn';   // even wider tolerance for u-turn if there is a via way (from !== to)
85903       if (angle < 158)
85904           return 'no_right_turn';
85905       if (angle > 202)
85906           return 'no_left_turn';
85907
85908       return 'no_straight_on';
85909   }
85910
85911   function actionAddMember(relationId, member, memberIndex, insertPair) {
85912
85913       return function action(graph) {
85914           var relation = graph.entity(relationId);
85915
85916           // There are some special rules for Public Transport v2 routes.
85917           var isPTv2 = /stop|platform/.test(member.role);
85918
85919           if ((isNaN(memberIndex) || insertPair) && member.type === 'way' && !isPTv2) {
85920               // Try to perform sensible inserts based on how the ways join together
85921               graph = addWayMember(relation, graph);
85922           } else {
85923               // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
85924               // Stops and Platforms for PTv2 should be ordered first.
85925               // hack: We do not currently have the ability to place them in the exactly correct order.
85926               if (isPTv2 && isNaN(memberIndex)) {
85927                   memberIndex = 0;
85928               }
85929
85930               graph = graph.replace(relation.addMember(member, memberIndex));
85931           }
85932
85933           return graph;
85934       };
85935
85936
85937       // Add a way member into the relation "wherever it makes sense".
85938       // In this situation we were not supplied a memberIndex.
85939       function addWayMember(relation, graph) {
85940           var groups, tempWay, item, i, j, k;
85941
85942           // remove PTv2 stops and platforms before doing anything.
85943           var PTv2members = [];
85944           var members = [];
85945           for (i = 0; i < relation.members.length; i++) {
85946               var m = relation.members[i];
85947               if (/stop|platform/.test(m.role)) {
85948                   PTv2members.push(m);
85949               } else {
85950                   members.push(m);
85951               }
85952           }
85953           relation = relation.update({ members: members });
85954
85955
85956           if (insertPair) {
85957               // We're adding a member that must stay paired with an existing member.
85958               // (This feature is used by `actionSplit`)
85959               //
85960               // This is tricky because the members may exist multiple times in the
85961               // member list, and with different A-B/B-A ordering and different roles.
85962               // (e.g. a bus route that loops out and back - #4589).
85963               //
85964               // Replace the existing member with a temporary way,
85965               // so that `osmJoinWays` can treat the pair like a single way.
85966               tempWay = osmWay({ id: 'wTemp', nodes: insertPair.nodes });
85967               graph = graph.replace(tempWay);
85968               var tempMember = { id: tempWay.id, type: 'way', role: member.role };
85969               var tempRelation = relation.replaceMember({id: insertPair.originalID}, tempMember, true);
85970               groups = groupBy(tempRelation.members, function(m) { return m.type; });
85971               groups.way = groups.way || [];
85972
85973           } else {
85974               // Add the member anywhere, one time. Just push and let `osmJoinWays` decide where to put it.
85975               groups = groupBy(relation.members, function(m) { return m.type; });
85976               groups.way = groups.way || [];
85977               groups.way.push(member);
85978           }
85979
85980           members = withIndex(groups.way);
85981           var joined = osmJoinWays(members, graph);
85982
85983           // `joined` might not contain all of the way members,
85984           // But will contain only the completed (downloaded) members
85985           for (i = 0; i < joined.length; i++) {
85986               var segment = joined[i];
85987               var nodes = segment.nodes.slice();
85988               var startIndex = segment[0].index;
85989
85990               // j = array index in `members` where this segment starts
85991               for (j = 0; j < members.length; j++) {
85992                   if (members[j].index === startIndex) {
85993                       break;
85994                   }
85995               }
85996
85997               // k = each member in segment
85998               for (k = 0; k < segment.length; k++) {
85999                   item = segment[k];
86000                   var way = graph.entity(item.id);
86001
86002                   // If this is a paired item, generate members in correct order and role
86003                   if (tempWay && item.id === tempWay.id) {
86004                       if (nodes[0].id === insertPair.nodes[0]) {
86005                           item.pair = [
86006                               { id: insertPair.originalID, type: 'way', role: item.role },
86007                               { id: insertPair.insertedID, type: 'way', role: item.role }
86008                           ];
86009                       } else {
86010                           item.pair = [
86011                               { id: insertPair.insertedID, type: 'way', role: item.role },
86012                               { id: insertPair.originalID, type: 'way', role: item.role }
86013                           ];
86014                       }
86015                   }
86016
86017                   // reorder `members` if necessary
86018                   if (k > 0) {
86019                       if (j+k >= members.length || item.index !== members[j+k].index) {
86020                           moveMember(members, item.index, j+k);
86021                       }
86022                   }
86023
86024                   nodes.splice(0, way.nodes.length - 1);
86025               }
86026           }
86027
86028           if (tempWay) {
86029               graph = graph.remove(tempWay);
86030           }
86031
86032           // Final pass: skip dead items, split pairs, remove index properties
86033           var wayMembers = [];
86034           for (i = 0; i < members.length; i++) {
86035               item = members[i];
86036               if (item.index === -1) continue;
86037
86038               if (item.pair) {
86039                   wayMembers.push(item.pair[0]);
86040                   wayMembers.push(item.pair[1]);
86041               } else {
86042                   wayMembers.push(omit(item, 'index'));
86043               }
86044           }
86045
86046           // Put stops and platforms first, then nodes, ways, relations
86047           // This is recommended for Public Transport v2 routes:
86048           // see https://wiki.openstreetmap.org/wiki/Public_transport#Service_routes
86049           var newMembers = PTv2members.concat( (groups.node || []), wayMembers, (groups.relation || []) );
86050
86051           return graph.replace(relation.update({members: newMembers}));
86052
86053
86054           // `moveMember()` changes the `members` array in place by splicing
86055           // the item with `.index = findIndex` to where it belongs,
86056           // and marking the old position as "dead" with `.index = -1`
86057           //
86058           // j=5, k=0                jk
86059           // segment                 5 4 7 6
86060           // members       0 1 2 3 4 5 6 7 8 9        keep 5 in j+k
86061           //
86062           // j=5, k=1                j k
86063           // segment                 5 4 7 6
86064           // members       0 1 2 3 4 5 6 7 8 9        move 4 to j+k
86065           // members       0 1 2 3 x 5 4 6 7 8 9      moved
86066           //
86067           // j=5, k=2                j   k
86068           // segment                 5 4 7 6
86069           // members       0 1 2 3 x 5 4 6 7 8 9      move 7 to j+k
86070           // members       0 1 2 3 x 5 4 7 6 x 8 9    moved
86071           //
86072           // j=5, k=3                j     k
86073           // segment                 5 4 7 6
86074           // members       0 1 2 3 x 5 4 7 6 x 8 9    keep 6 in j+k
86075           //
86076           function moveMember(arr, findIndex, toIndex) {
86077               for (var i = 0; i < arr.length; i++) {
86078                   if (arr[i].index === findIndex) {
86079                       break;
86080                   }
86081               }
86082
86083               var item = clone(arr[i]);
86084               arr[i].index = -1;   // mark as dead
86085               item.index = toIndex;
86086               arr.splice(toIndex, 0, item);
86087           }
86088
86089
86090           // This is the same as `Relation.indexedMembers`,
86091           // Except we don't want to index all the members, only the ways
86092           function withIndex(arr) {
86093               var result = new Array(arr.length);
86094               for (var i = 0; i < arr.length; i++) {
86095                   result[i] = arr[i];
86096                   result[i].index = i;
86097               }
86098               return result;
86099           }
86100       }
86101
86102   }
86103
86104   function actionAddMidpoint(midpoint, node) {
86105       return function(graph) {
86106           graph = graph.replace(node.move(midpoint.loc));
86107
86108           var parents = intersection(
86109               graph.parentWays(graph.entity(midpoint.edge[0])),
86110               graph.parentWays(graph.entity(midpoint.edge[1])));
86111
86112           parents.forEach(function(way) {
86113               for (var i = 0; i < way.nodes.length - 1; i++) {
86114                   if (geoEdgeEqual([way.nodes[i], way.nodes[i + 1]], midpoint.edge)) {
86115                       graph = graph.replace(graph.entity(way.id).addNode(node.id, i + 1));
86116
86117                       // Add only one midpoint on doubled-back segments,
86118                       // turning them into self-intersections.
86119                       return;
86120                   }
86121               }
86122           });
86123
86124           return graph;
86125       };
86126   }
86127
86128   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/AddNodeToWayAction.as
86129   function actionAddVertex(wayId, nodeId, index) {
86130       return function(graph) {
86131           return graph.replace(graph.entity(wayId).addNode(nodeId, index));
86132       };
86133   }
86134
86135   function actionChangeMember(relationId, member, memberIndex) {
86136       return function(graph) {
86137           return graph.replace(graph.entity(relationId).updateMember(member, memberIndex));
86138       };
86139   }
86140
86141   function actionChangePreset(entityID, oldPreset, newPreset) {
86142       return function action(graph) {
86143           var entity = graph.entity(entityID);
86144           var geometry = entity.geometry(graph);
86145           var tags = entity.tags;
86146
86147           if (oldPreset) tags = oldPreset.unsetTags(tags, geometry);
86148           if (newPreset) tags = newPreset.setTags(tags, geometry);
86149
86150           return graph.replace(entity.update({tags: tags}));
86151       };
86152   }
86153
86154   function actionChangeTags(entityId, tags) {
86155       return function(graph) {
86156           var entity = graph.entity(entityId);
86157           return graph.replace(entity.update({tags: tags}));
86158       };
86159   }
86160
86161   function actionCircularize(wayId, projection, maxAngle) {
86162       maxAngle = (maxAngle || 20) * Math.PI / 180;
86163
86164
86165       var action = function(graph, t) {
86166           if (t === null || !isFinite(t)) t = 1;
86167           t = Math.min(Math.max(+t, 0), 1);
86168
86169           var way = graph.entity(wayId),
86170               origNodes = {};
86171
86172           graph.childNodes(way).forEach(function(node) {
86173               if (!origNodes[node.id]) origNodes[node.id] = node;
86174           });
86175
86176           if (!way.isConvex(graph)) {
86177               graph = action.makeConvex(graph);
86178           }
86179
86180           var nodes = uniq(graph.childNodes(way)),
86181               keyNodes = nodes.filter(function(n) { return graph.parentWays(n).length !== 1; }),
86182               points = nodes.map(function(n) { return projection(n.loc); }),
86183               keyPoints = keyNodes.map(function(n) { return projection(n.loc); }),
86184               centroid = (points.length === 2) ? geoVecInterp(points[0], points[1], 0.5) : d3_polygonCentroid(points),
86185               radius = d3_median(points, function(p) { return geoVecLength(centroid, p); }),
86186               sign = d3_polygonArea(points) > 0 ? 1 : -1,
86187               ids;
86188
86189           // we need atleast two key nodes for the algorithm to work
86190           if (!keyNodes.length) {
86191               keyNodes = [nodes[0]];
86192               keyPoints = [points[0]];
86193           }
86194
86195           if (keyNodes.length === 1) {
86196               var index = nodes.indexOf(keyNodes[0]),
86197                   oppositeIndex = Math.floor((index + nodes.length / 2) % nodes.length);
86198
86199               keyNodes.push(nodes[oppositeIndex]);
86200               keyPoints.push(points[oppositeIndex]);
86201           }
86202
86203           // key points and nodes are those connected to the ways,
86204           // they are projected onto the circle, inbetween nodes are moved
86205           // to constant intervals between key nodes, extra inbetween nodes are
86206           // added if necessary.
86207           for (var i = 0; i < keyPoints.length; i++) {
86208               var nextKeyNodeIndex = (i + 1) % keyNodes.length,
86209                   startNode = keyNodes[i],
86210                   endNode = keyNodes[nextKeyNodeIndex],
86211                   startNodeIndex = nodes.indexOf(startNode),
86212                   endNodeIndex = nodes.indexOf(endNode),
86213                   numberNewPoints = -1,
86214                   indexRange = endNodeIndex - startNodeIndex,
86215                   nearNodes = {},
86216                   inBetweenNodes = [],
86217                   startAngle, endAngle, totalAngle, eachAngle,
86218                   angle, loc, node, origNode, j;
86219
86220               if (indexRange < 0) {
86221                   indexRange += nodes.length;
86222               }
86223
86224               // position this key node
86225               var distance = geoVecLength(centroid, keyPoints[i]);
86226               if (distance === 0) { distance = 1e-4; }
86227               keyPoints[i] = [
86228                   centroid[0] + (keyPoints[i][0] - centroid[0]) / distance * radius,
86229                   centroid[1] + (keyPoints[i][1] - centroid[1]) / distance * radius
86230               ];
86231               loc = projection.invert(keyPoints[i]);
86232               node = keyNodes[i];
86233               origNode = origNodes[node.id];
86234               node = node.move(geoVecInterp(origNode.loc, loc, t));
86235               graph = graph.replace(node);
86236
86237               // figure out the between delta angle we want to match to
86238               startAngle = Math.atan2(keyPoints[i][1] - centroid[1], keyPoints[i][0] - centroid[0]);
86239               endAngle = Math.atan2(keyPoints[nextKeyNodeIndex][1] - centroid[1], keyPoints[nextKeyNodeIndex][0] - centroid[0]);
86240               totalAngle = endAngle - startAngle;
86241
86242               // detects looping around -pi/pi
86243               if (totalAngle * sign > 0) {
86244                   totalAngle = -sign * (2 * Math.PI - Math.abs(totalAngle));
86245               }
86246
86247               do {
86248                   numberNewPoints++;
86249                   eachAngle = totalAngle / (indexRange + numberNewPoints);
86250               } while (Math.abs(eachAngle) > maxAngle);
86251
86252
86253               // move existing nodes
86254               for (j = 1; j < indexRange; j++) {
86255                   angle = startAngle + j * eachAngle;
86256                   loc = projection.invert([
86257                       centroid[0] + Math.cos(angle) * radius,
86258                       centroid[1] + Math.sin(angle) * radius
86259                   ]);
86260
86261                   node = nodes[(j + startNodeIndex) % nodes.length];
86262                   origNode = origNodes[node.id];
86263                   nearNodes[node.id] = angle;
86264
86265                   node = node.move(geoVecInterp(origNode.loc, loc, t));
86266                   graph = graph.replace(node);
86267               }
86268
86269               // add new inbetween nodes if necessary
86270               for (j = 0; j < numberNewPoints; j++) {
86271                   angle = startAngle + (indexRange + j) * eachAngle;
86272                   loc = projection.invert([
86273                       centroid[0] + Math.cos(angle) * radius,
86274                       centroid[1] + Math.sin(angle) * radius
86275                   ]);
86276
86277                   // choose a nearnode to use as the original
86278                   var min$$1 = Infinity;
86279                   for (var nodeId in nearNodes) {
86280                       var nearAngle = nearNodes[nodeId],
86281                           dist = Math.abs(nearAngle - angle);
86282                       if (dist < min$$1) {
86283                           dist = min$$1;
86284                           origNode = origNodes[nodeId];
86285                       }
86286                   }
86287
86288                   node = osmNode({ loc: geoVecInterp(origNode.loc, loc, t) });
86289                   graph = graph.replace(node);
86290
86291                   nodes.splice(endNodeIndex + j, 0, node);
86292                   inBetweenNodes.push(node.id);
86293               }
86294
86295               // Check for other ways that share these keyNodes..
86296               // If keyNodes are adjacent in both ways,
86297               // we can add inBetween nodes to that shared way too..
86298               if (indexRange === 1 && inBetweenNodes.length) {
86299                   var startIndex1 = way.nodes.lastIndexOf(startNode.id),
86300                       endIndex1 = way.nodes.lastIndexOf(endNode.id),
86301                       wayDirection1 = (endIndex1 - startIndex1);
86302                   if (wayDirection1 < -1) { wayDirection1 = 1; }
86303
86304                   /* eslint-disable no-loop-func */
86305                   forEach(without(graph.parentWays(keyNodes[i]), way), function(sharedWay) {
86306                       if (sharedWay.areAdjacent(startNode.id, endNode.id)) {
86307                           var startIndex2 = sharedWay.nodes.lastIndexOf(startNode.id),
86308                               endIndex2 = sharedWay.nodes.lastIndexOf(endNode.id),
86309                               wayDirection2 = (endIndex2 - startIndex2),
86310                               insertAt = endIndex2;
86311                           if (wayDirection2 < -1) { wayDirection2 = 1; }
86312
86313                           if (wayDirection1 !== wayDirection2) {
86314                               inBetweenNodes.reverse();
86315                               insertAt = startIndex2;
86316                           }
86317                           for (j = 0; j < inBetweenNodes.length; j++) {
86318                               sharedWay = sharedWay.addNode(inBetweenNodes[j], insertAt + j);
86319                           }
86320                           graph = graph.replace(sharedWay);
86321                       }
86322                   });
86323                   /* eslint-enable no-loop-func */
86324               }
86325
86326           }
86327
86328           // update the way to have all the new nodes
86329           ids = nodes.map(function(n) { return n.id; });
86330           ids.push(ids[0]);
86331
86332           way = way.update({nodes: ids});
86333           graph = graph.replace(way);
86334
86335           return graph;
86336       };
86337
86338
86339       action.makeConvex = function(graph) {
86340           var way = graph.entity(wayId),
86341               nodes = uniq(graph.childNodes(way)),
86342               points = nodes.map(function(n) { return projection(n.loc); }),
86343               sign = d3_polygonArea(points) > 0 ? 1 : -1,
86344               hull = d3_polygonHull(points);
86345
86346           // D3 convex hulls go counterclockwise..
86347           if (sign === -1) {
86348               nodes.reverse();
86349               points.reverse();
86350           }
86351
86352           for (var i = 0; i < hull.length - 1; i++) {
86353               var startIndex = points.indexOf(hull[i]),
86354                   endIndex = points.indexOf(hull[i+1]),
86355                   indexRange = (endIndex - startIndex);
86356
86357               if (indexRange < 0) {
86358                   indexRange += nodes.length;
86359               }
86360
86361               // move interior nodes to the surface of the convex hull..
86362               for (var j = 1; j < indexRange; j++) {
86363                   var point = geoVecInterp(hull[i], hull[i+1], j / indexRange),
86364                       node = nodes[(j + startIndex) % nodes.length].move(projection.invert(point));
86365                   graph = graph.replace(node);
86366               }
86367           }
86368           return graph;
86369       };
86370
86371
86372       action.disabled = function(graph) {
86373           if (!graph.entity(wayId).isClosed())
86374               return 'not_closed';
86375       };
86376
86377
86378       action.transitionable = true;
86379
86380
86381       return action;
86382   }
86383
86384   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteWayAction.as
86385   function actionDeleteWay(wayId) {
86386
86387
86388       function canDeleteNode(node, graph) {
86389           return !graph.parentWays(node).length &&
86390               !graph.parentRelations(node).length &&
86391               !node.hasInterestingTags();
86392       }
86393
86394
86395       var action = function(graph) {
86396           var way = graph.entity(wayId);
86397
86398           graph.parentRelations(way)
86399               .forEach(function(parent) {
86400                   parent = parent.removeMembersWithID(wayId);
86401                   graph = graph.replace(parent);
86402
86403                   if (parent.isDegenerate()) {
86404                       graph = actionDeleteRelation(parent.id)(graph);
86405                   }
86406               });
86407
86408           uniq(way.nodes).forEach(function(nodeId) {
86409               graph = graph.replace(way.removeNode(nodeId));
86410
86411               var node = graph.entity(nodeId);
86412               if (canDeleteNode(node, graph)) {
86413                   graph = graph.remove(node);
86414               }
86415           });
86416
86417           return graph.remove(way);
86418       };
86419
86420
86421       return action;
86422   }
86423
86424   function actionDeleteMultiple(ids) {
86425       var actions = {
86426           way: actionDeleteWay,
86427           node: actionDeleteNode,
86428           relation: actionDeleteRelation
86429       };
86430
86431
86432       var action = function(graph) {
86433           ids.forEach(function(id) {
86434               if (graph.hasEntity(id)) { // It may have been deleted aready.
86435                   graph = actions[graph.entity(id).type](id)(graph);
86436               }
86437           });
86438
86439           return graph;
86440       };
86441
86442
86443       return action;
86444   }
86445
86446   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteRelationAction.as
86447   function actionDeleteRelation(relationId) {
86448
86449
86450       function canDeleteEntity(entity, graph) {
86451           return !graph.parentWays(entity).length &&
86452               !graph.parentRelations(entity).length &&
86453               !entity.hasInterestingTags();
86454       }
86455
86456
86457       var action = function(graph) {
86458           var relation = graph.entity(relationId);
86459
86460           graph.parentRelations(relation)
86461               .forEach(function(parent) {
86462                   parent = parent.removeMembersWithID(relationId);
86463                   graph = graph.replace(parent);
86464
86465                   if (parent.isDegenerate()) {
86466                       graph = actionDeleteRelation(parent.id)(graph);
86467                   }
86468               });
86469
86470           uniq(map$3(relation.members, 'id')).forEach(function(memberId) {
86471               graph = graph.replace(relation.removeMembersWithID(memberId));
86472
86473               var entity = graph.entity(memberId);
86474               if (canDeleteEntity(entity, graph)) {
86475                   graph = actionDeleteMultiple([memberId])(graph);
86476               }
86477           });
86478
86479           return graph.remove(relation);
86480       };
86481
86482
86483       return action;
86484   }
86485
86486   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/DeleteNodeAction.as
86487   function actionDeleteNode(nodeId) {
86488       var action = function(graph) {
86489           var node = graph.entity(nodeId);
86490
86491           graph.parentWays(node)
86492               .forEach(function(parent) {
86493                   parent = parent.removeNode(nodeId);
86494                   graph = graph.replace(parent);
86495
86496                   if (parent.isDegenerate()) {
86497                       graph = actionDeleteWay(parent.id)(graph);
86498                   }
86499               });
86500
86501           graph.parentRelations(node)
86502               .forEach(function(parent) {
86503                   parent = parent.removeMembersWithID(nodeId);
86504                   graph = graph.replace(parent);
86505
86506                   if (parent.isDegenerate()) {
86507                       graph = actionDeleteRelation(parent.id)(graph);
86508                   }
86509               });
86510
86511           return graph.remove(node);
86512       };
86513
86514
86515       return action;
86516   }
86517
86518   // Connect the ways at the given nodes.
86519   //
86520   // First choose a node to be the survivor, with preference given
86521   // to an existing (not new) node.
86522   //
86523   // Tags and relation memberships of of non-surviving nodes are merged
86524   // to the survivor.
86525   //
86526   // This is the inverse of `iD.actionDisconnect`.
86527   //
86528   // Reference:
86529   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeNodesAction.as
86530   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/MergeNodesAction.java
86531   //
86532   function actionConnect(nodeIDs) {
86533       var action = function(graph) {
86534           var survivor;
86535           var node;
86536           var parents;
86537           var i, j;
86538
86539           // Choose a survivor node, prefer an existing (not new) node - #4974
86540           for (i = 0; i < nodeIDs.length; i++) {
86541               survivor = graph.entity(nodeIDs[i]);
86542               if (survivor.version) break;  // found one
86543           }
86544
86545           // Replace all non-surviving nodes with the survivor and merge tags.
86546           for (i = 0; i < nodeIDs.length; i++) {
86547               node = graph.entity(nodeIDs[i]);
86548               if (node.id === survivor.id) continue;
86549
86550               parents = graph.parentWays(node);
86551               for (j = 0; j < parents.length; j++) {
86552                   if (!parents[j].areAdjacent(node.id, survivor.id)) {
86553                       graph = graph.replace(parents[j].replaceNode(node.id, survivor.id));
86554                   }
86555               }
86556
86557               parents = graph.parentRelations(node);
86558               for (j = 0; j < parents.length; j++) {
86559                   graph = graph.replace(parents[j].replaceMember(node, survivor));
86560               }
86561
86562               survivor = survivor.mergeTags(node.tags);
86563               graph = actionDeleteNode(node.id)(graph);
86564           }
86565
86566           graph = graph.replace(survivor);
86567
86568           return graph;
86569       };
86570
86571
86572       action.disabled = function(graph) {
86573           var seen = {};
86574           var restrictionIDs = [];
86575           var survivor;
86576           var node, way;
86577           var relations, relation, role;
86578           var i, j, k;
86579
86580           // Choose a survivor node, prefer an existing (not new) node - #4974
86581           for (i = 0; i < nodeIDs.length; i++) {
86582               survivor = graph.entity(nodeIDs[i]);
86583               if (survivor.version) break;  // found one
86584           }
86585
86586           // 1. disable if the nodes being connected have conflicting relation roles
86587           for (i = 0; i < nodeIDs.length; i++) {
86588               node = graph.entity(nodeIDs[i]);
86589               relations = graph.parentRelations(node);
86590
86591               for (j = 0; j < relations.length; j++) {
86592                   relation = relations[j];
86593                   role = relation.memberById(node.id).role || '';
86594
86595                   // if this node is a via node in a restriction, remember for later
86596                   if (relation.isValidRestriction()) {
86597                       restrictionIDs.push(relation.id);
86598                   }
86599
86600                   if (seen[relation.id] !== undefined && seen[relation.id] !== role) {
86601                       return 'relation';
86602                   } else {
86603                       seen[relation.id] = role;
86604                   }
86605               }
86606           }
86607
86608           // gather restrictions for parent ways
86609           for (i = 0; i < nodeIDs.length; i++) {
86610               node = graph.entity(nodeIDs[i]);
86611
86612               var parents = graph.parentWays(node);
86613               for (j = 0; j < parents.length; j++) {
86614                   var parent = parents[j];
86615                   relations = graph.parentRelations(parent);
86616
86617                   for (k = 0; k < relations.length; k++) {
86618                       relation = relations[k];
86619                       if (relation.isValidRestriction()) {
86620                           restrictionIDs.push(relation.id);
86621                       }
86622                   }
86623               }
86624           }
86625
86626
86627           // test restrictions
86628           restrictionIDs = uniq(restrictionIDs);
86629           for (i = 0; i < restrictionIDs.length; i++) {
86630               relation = graph.entity(restrictionIDs[i]);
86631               if (!relation.isComplete(graph)) continue;
86632
86633               var memberWays = relation.members
86634                   .filter(function(m) { return m.type === 'way'; })
86635                   .map(function(m) { return graph.entity(m.id); });
86636
86637               memberWays = uniq(memberWays);
86638               var f = relation.memberByRole('from');
86639               var t = relation.memberByRole('to');
86640               var isUturn = (f.id === t.id);
86641
86642               // 2a. disable if connection would damage a restriction
86643               // (a key node is a node at the junction of ways)
86644               var nodes = { from: [], via: [], to: [], keyfrom: [], keyto: [] };
86645               for (j = 0; j < relation.members.length; j++) {
86646                   collectNodes(relation.members[j], nodes);
86647               }
86648
86649               nodes.keyfrom = uniq(nodes.keyfrom.filter(hasDuplicates));
86650               nodes.keyto = uniq(nodes.keyto.filter(hasDuplicates));
86651
86652               var filter = keyNodeFilter(nodes.keyfrom, nodes.keyto);
86653               nodes.from = nodes.from.filter(filter);
86654               nodes.via = nodes.via.filter(filter);
86655               nodes.to = nodes.to.filter(filter);
86656
86657               var connectFrom = false;
86658               var connectVia = false;
86659               var connectTo = false;
86660               var connectKeyFrom = false;
86661               var connectKeyTo = false;
86662
86663               for (j = 0; j < nodeIDs.length; j++) {
86664                   var n = nodeIDs[j];
86665                   if (nodes.from.indexOf(n) !== -1)    { connectFrom = true; }
86666                   if (nodes.via.indexOf(n) !== -1)     { connectVia = true; }
86667                   if (nodes.to.indexOf(n) !== -1)      { connectTo = true; }
86668                   if (nodes.keyfrom.indexOf(n) !== -1) { connectKeyFrom = true; }
86669                   if (nodes.keyto.indexOf(n) !== -1)   { connectKeyTo = true; }
86670               }
86671               if (connectFrom && connectTo && !isUturn) { return 'restriction'; }
86672               if (connectFrom && connectVia) { return 'restriction'; }
86673               if (connectTo   && connectVia) { return 'restriction'; }
86674
86675               // connecting to a key node -
86676               // if both nodes are on a member way (i.e. part of the turn restriction),
86677               // the connecting node must be adjacent to the key node.
86678               if (connectKeyFrom || connectKeyTo) {
86679                   if (nodeIDs.length !== 2) { return 'restriction'; }
86680
86681                   var n0 = null;
86682                   var n1 = null;
86683                   for (j = 0; j < memberWays.length; j++) {
86684                       way = memberWays[j];
86685                       if (way.contains(nodeIDs[0])) { n0 = nodeIDs[0]; }
86686                       if (way.contains(nodeIDs[1])) { n1 = nodeIDs[1]; }
86687                   }
86688
86689                   if (n0 && n1) {    // both nodes are part of the restriction
86690                       var ok = false;
86691                       for (j = 0; j < memberWays.length; j++) {
86692                           way = memberWays[j];
86693                           if (way.areAdjacent(n0, n1)) {
86694                               ok = true;
86695                               break;
86696                           }
86697                       }
86698                       if (!ok) {
86699                           return 'restriction';
86700                       }
86701                   }
86702               }
86703
86704               // 2b. disable if nodes being connected will destroy a member way in a restriction
86705               // (to test, make a copy and try actually connecting the nodes)
86706               for (j = 0; j < memberWays.length; j++) {
86707                   way = memberWays[j].update({});   // make copy
86708                   for (k = 0; k < nodeIDs.length; k++) {
86709                       if (nodeIDs[k] === survivor.id) continue;
86710
86711                       if (way.areAdjacent(nodeIDs[k], survivor.id)) {
86712                           way = way.removeNode(nodeIDs[k]);
86713                       } else {
86714                           way = way.replaceNode(nodeIDs[k], survivor.id);
86715                       }
86716                   }
86717                   if (way.isDegenerate()) {
86718                       return 'restriction';
86719                   }
86720               }
86721           }
86722
86723           return false;
86724
86725
86726           // if a key node appears multiple times (indexOf !== lastIndexOf) it's a FROM-VIA or TO-VIA junction
86727           function hasDuplicates(n, i, arr) {
86728               return arr.indexOf(n) !== arr.lastIndexOf(n);
86729           }
86730
86731           function keyNodeFilter(froms, tos) {
86732               return function(n) {
86733                   return froms.indexOf(n) === -1 && tos.indexOf(n) === -1;
86734               };
86735           }
86736
86737           function collectNodes(member, collection) {
86738               var entity = graph.hasEntity(member.id);
86739               if (!entity) return;
86740
86741               var role = member.role || '';
86742               if (!collection[role]) {
86743                   collection[role] = [];
86744               }
86745
86746               if (member.type === 'node') {
86747                   collection[role].push(member.id);
86748                   if (role === 'via') {
86749                       collection.keyfrom.push(member.id);
86750                       collection.keyto.push(member.id);
86751                   }
86752
86753               } else if (member.type === 'way') {
86754                   collection[role].push.apply(collection[role], entity.nodes);
86755                   if (role === 'from' || role === 'via') {
86756                       collection.keyfrom.push(entity.first());
86757                       collection.keyfrom.push(entity.last());
86758                   }
86759                   if (role === 'to' || role === 'via') {
86760                       collection.keyto.push(entity.first());
86761                       collection.keyto.push(entity.last());
86762                   }
86763               }
86764           }
86765       };
86766
86767
86768       return action;
86769   }
86770
86771   function actionCopyEntities(ids, fromGraph) {
86772       var copies = {};
86773
86774
86775       var action = function(graph) {
86776           ids.forEach(function(id) {
86777               fromGraph.entity(id).copy(fromGraph, copies);
86778           });
86779
86780           for (var id in copies) {
86781               graph = graph.replace(copies[id]);
86782           }
86783
86784           return graph;
86785       };
86786
86787
86788       action.copies = function() {
86789           return copies;
86790       };
86791
86792
86793       return action;
86794   }
86795
86796   function actionDeleteMember(relationId, memberIndex) {
86797       return function(graph) {
86798           var relation = graph.entity(relationId)
86799               .removeMember(memberIndex);
86800
86801           graph = graph.replace(relation);
86802
86803           if (relation.isDegenerate())
86804               graph = actionDeleteRelation(relation.id)(graph);
86805
86806           return graph;
86807       };
86808   }
86809
86810   function actionDeprecateTags(entityId) {
86811
86812       return function(graph) {
86813           var entity = graph.entity(entityId),
86814               newtags = clone(entity.tags),
86815               change = false,
86816               rule;
86817
86818           // This handles dataDeprecated tags with a single condition
86819           for (var i = 0; i < dataDeprecated.length; i++) {
86820
86821               rule = dataDeprecated[i];
86822               var match = toPairs(rule.old)[0],
86823                   replacements = rule.replace ? toPairs(rule.replace) : null;
86824
86825               if (entity.tags[match[0]] && match[1] === '*') {
86826
86827                   var value = entity.tags[match[0]];
86828                   if (replacements && !newtags[replacements[0][0]]) {
86829                       newtags[replacements[0][0]] = value;
86830                   }
86831                   delete newtags[match[0]];
86832                   change = true;
86833
86834               } else if (entity.tags[match[0]] === match[1]) {
86835                   newtags = assign({}, rule.replace || {}, omit(newtags, match[0]));
86836                   change = true;
86837               }
86838           }
86839
86840           if (change) {
86841               return graph.replace(entity.update({tags: newtags}));
86842           } else {
86843               return graph;
86844           }
86845       };
86846   }
86847
86848   function actionDiscardTags(difference) {
86849
86850       return function(graph) {
86851           function discardTags(entity) {
86852               var tags = {};
86853               var keys = Object.keys(entity.tags);
86854               var discarded = false;
86855
86856               for (var i = 0; i < keys.length; i++) {
86857                   var k = keys[i];
86858                   if (dataDiscarded[k] || !entity.tags[k]) {
86859                       discarded = true;
86860                   } else {
86861                       tags[k] = entity.tags[k];
86862                   }
86863               }
86864
86865               if (discarded) {
86866                   graph = graph.replace(entity.update({ tags: tags }));
86867               }
86868           }
86869
86870           difference.modified().forEach(discardTags);
86871           difference.created().forEach(discardTags);
86872
86873           return graph;
86874       };
86875   }
86876
86877   // Disconect the ways at the given node.
86878   //
86879   // Optionally, disconnect only the given ways.
86880   //
86881   // For testing convenience, accepts an ID to assign to the (first) new node.
86882   // Normally, this will be undefined and the way will automatically
86883   // be assigned a new ID.
86884   //
86885   // This is the inverse of `iD.actionConnect`.
86886   //
86887   // Reference:
86888   //   https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/UnjoinNodeAction.as
86889   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/UnGlueAction.java
86890   //
86891   function actionDisconnect(nodeId, newNodeId) {
86892       var wayIds;
86893
86894
86895       var action = function(graph) {
86896           var node = graph.entity(nodeId);
86897           var connections = action.connections(graph);
86898
86899           connections.forEach(function(connection) {
86900               var way = graph.entity(connection.wayID);
86901               var newNode = osmNode({id: newNodeId, loc: node.loc, tags: node.tags});
86902
86903               graph = graph.replace(newNode);
86904               if (connection.index === 0 && way.isArea()) {
86905                   // replace shared node with shared node..
86906                   graph = graph.replace(way.replaceNode(way.nodes[0], newNode.id));
86907               } else if (way.isClosed() && connection.index === way.nodes.length - 1) {
86908                   // replace closing node with new new node..
86909                   graph = graph.replace(way.unclose().addNode(newNode.id));
86910               } else {
86911                   // replace shared node with multiple new nodes..
86912                   graph = graph.replace(way.updateNode(newNode.id, connection.index));
86913               }
86914           });
86915
86916           return graph;
86917       };
86918
86919
86920       action.connections = function(graph) {
86921           var candidates = [];
86922           var keeping = false;
86923           var parentWays = graph.parentWays(graph.entity(nodeId));
86924
86925           parentWays.forEach(function(way) {
86926               if (wayIds && wayIds.indexOf(way.id) === -1) {
86927                   keeping = true;
86928                   return;
86929               }
86930               if (way.isArea() && (way.nodes[0] === nodeId)) {
86931                   candidates.push({ wayID: way.id, index: 0 });
86932               } else {
86933                   way.nodes.forEach(function(waynode, index) {
86934                       if (waynode === nodeId) {
86935                           candidates.push({ wayID: way.id, index: index });
86936                       }
86937                   });
86938               }
86939           });
86940
86941           return keeping ? candidates : candidates.slice(1);
86942       };
86943
86944
86945       action.disabled = function(graph) {
86946           var connections = action.connections(graph);
86947           if (connections.length === 0 || (wayIds && wayIds.length !== connections.length))
86948               return 'not_connected';
86949
86950           var parentWays = graph.parentWays(graph.entity(nodeId));
86951           var seenRelationIds = {};
86952           var sharedRelation;
86953
86954           parentWays.forEach(function(way) {
86955               if (wayIds && wayIds.indexOf(way.id) === -1)
86956                   return;
86957
86958               var relations = graph.parentRelations(way);
86959               relations.forEach(function(relation) {
86960                   if (relation.id in seenRelationIds) {
86961                       sharedRelation = relation;
86962                   } else {
86963                       seenRelationIds[relation.id] = true;
86964                   }
86965               });
86966           });
86967
86968           if (sharedRelation)
86969               return 'relation';
86970       };
86971
86972
86973       action.limitWays = function(_) {
86974           if (!arguments.length) return wayIds;
86975           wayIds = _;
86976           return action;
86977       };
86978
86979
86980       return action;
86981   }
86982
86983   // Join ways at the end node they share.
86984   //
86985   // This is the inverse of `iD.actionSplit`.
86986   //
86987   // Reference:
86988   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MergeWaysAction.as
86989   //   https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/actions/CombineWayAction.java
86990   //
86991   function actionJoin(ids) {
86992
86993       function groupEntitiesByGeometry(graph) {
86994           var entities = ids.map(function(id) { return graph.entity(id); });
86995           return assignIn({line: []}, groupBy(entities, function(entity) { return entity.geometry(graph); }));
86996       }
86997
86998
86999       var action = function(graph) {
87000           var ways = ids.map(graph.entity, graph);
87001           var survivorID = ways[0].id;
87002
87003           // Prefer to keep an existing way.
87004           for (var i = 0; i < ways.length; i++) {
87005               if (!ways[i].isNew()) {
87006                   survivorID = ways[i].id;
87007                   break;
87008               }
87009           }
87010
87011           var sequences = osmJoinWays(ways, graph);
87012           var joined = sequences[0];
87013
87014           // We might need to reverse some of these ways before joining them.  #4688
87015           // `joined.actions` property will contain any actions we need to apply.
87016           graph = sequences.actions.reduce(function(g, action) { return action(g); }, graph);
87017
87018           var survivor = graph.entity(survivorID);
87019           survivor = survivor.update({ nodes: joined.nodes.map(function(n) { return n.id; }) });
87020           graph = graph.replace(survivor);
87021
87022           joined.forEach(function(way) {
87023               if (way.id === survivorID) return;
87024
87025               graph.parentRelations(way).forEach(function(parent) {
87026                   graph = graph.replace(parent.replaceMember(way, survivor));
87027               });
87028
87029               survivor = survivor.mergeTags(way.tags);
87030
87031               graph = graph.replace(survivor);
87032               graph = actionDeleteWay(way.id)(graph);
87033           });
87034
87035           return graph;
87036       };
87037
87038
87039       action.disabled = function(graph) {
87040           var geometries = groupEntitiesByGeometry(graph);
87041           if (ids.length < 2 || ids.length !== geometries.line.length)
87042               return 'not_eligible';
87043
87044           var joined = osmJoinWays(ids.map(graph.entity, graph), graph);
87045           if (joined.length > 1)
87046               return 'not_adjacent';
87047
87048           var nodeIds = joined[0].nodes.map(function(n) { return n.id; }).slice(1, -1);
87049           var relation;
87050           var tags = {};
87051           var conflicting = false;
87052
87053           joined[0].forEach(function(way) {
87054               var parents = graph.parentRelations(way);
87055               parents.forEach(function(parent) {
87056                   if (parent.isRestriction() && parent.members.some(function(m) { return nodeIds.indexOf(m.id) >= 0; }))
87057                       relation = parent;
87058               });
87059
87060               for (var k in way.tags) {
87061                   if (!(k in tags)) {
87062                       tags[k] = way.tags[k];
87063                   } else if (tags[k] && osmIsInterestingTag(k) && tags[k] !== way.tags[k]) {
87064                       conflicting = true;
87065                   }
87066               }
87067           });
87068
87069           if (relation)
87070               return 'restriction';
87071
87072           if (conflicting)
87073               return 'conflicting_tags';
87074       };
87075
87076
87077       return action;
87078   }
87079
87080   function actionMerge(ids) {
87081
87082       function groupEntitiesByGeometry(graph) {
87083           var entities = ids.map(function(id) { return graph.entity(id); });
87084           return assignIn({point: [], area: [], line: [], relation: []},
87085               groupBy(entities, function(entity) { return entity.geometry(graph); }));
87086       }
87087
87088
87089       var action = function(graph) {
87090           var geometries = groupEntitiesByGeometry(graph),
87091               target = geometries.area[0] || geometries.line[0],
87092               points = geometries.point;
87093
87094           points.forEach(function(point) {
87095               target = target.mergeTags(point.tags);
87096               graph = graph.replace(target);
87097
87098               graph.parentRelations(point).forEach(function(parent) {
87099                   graph = graph.replace(parent.replaceMember(point, target));
87100               });
87101
87102               var nodes = uniq(graph.childNodes(target)),
87103                   removeNode = point;
87104
87105               for (var i = 0; i < nodes.length; i++) {
87106                   var node = nodes[i];
87107                   if (graph.parentWays(node).length > 1 ||
87108                       graph.parentRelations(node).length ||
87109                       node.hasInterestingTags()) {
87110                       continue;
87111                   }
87112
87113                   // Found an uninteresting child node on the target way.
87114                   // Move orig point into its place to preserve point's history. #3683
87115                   graph = graph.replace(point.update({ tags: {}, loc: node.loc }));
87116                   target = target.replaceNode(node.id, point.id);
87117                   graph = graph.replace(target);
87118                   removeNode = node;
87119                   break;
87120               }
87121
87122               graph = graph.remove(removeNode);
87123           });
87124
87125           return graph;
87126       };
87127
87128
87129       action.disabled = function(graph) {
87130           var geometries = groupEntitiesByGeometry(graph);
87131           if (geometries.point.length === 0 ||
87132               (geometries.area.length + geometries.line.length) !== 1 ||
87133               geometries.relation.length !== 0)
87134               return 'not_eligible';
87135       };
87136
87137
87138       return action;
87139   }
87140
87141   // `actionMergeNodes` is just a combination of:
87142   //
87143   // 1. move all the nodes to a common location
87144   // 2. `actionConnect` them
87145
87146   function actionMergeNodes(nodeIDs) {
87147
87148       // If there is a single "interesting" node, use that as the location.
87149       // Otherwise return the average location of all the nodes.
87150       function chooseLoc(graph) {
87151           if (!nodeIDs.length) return null;
87152           var sum = [0,0];
87153           var interestingCount = 0;
87154           var interestingLoc;
87155
87156           for (var i = 0; i < nodeIDs.length; i++) {
87157               var node = graph.entity(nodeIDs[i]);
87158               if (node.hasInterestingTags()) {
87159                   interestingLoc = (++interestingCount === 1) ? node.loc : null;
87160               }
87161               sum = geoVecAdd(sum, node.loc);
87162           }
87163
87164           return interestingLoc || geoVecScale(sum, 1 / nodeIDs.length);
87165       }
87166
87167
87168       var action = function(graph) {
87169           if (nodeIDs.length < 2) return graph;
87170           var toLoc = chooseLoc(graph);
87171
87172           for (var i = 0; i < nodeIDs.length; i++) {
87173               var node = graph.entity(nodeIDs[i]);
87174               graph = graph.replace(node.move(toLoc));
87175           }
87176
87177           return actionConnect(nodeIDs)(graph);
87178       };
87179
87180
87181       action.disabled = function(graph) {
87182           if (nodeIDs.length < 2) return 'not_eligible';
87183
87184           for (var i = 0; i < nodeIDs.length; i++) {
87185               var entity = graph.entity(nodeIDs[i]);
87186               if (entity.type !== 'node') return 'not_eligible';
87187           }
87188
87189           return actionConnect(nodeIDs).disabled(graph);
87190       };
87191
87192       return action;
87193   }
87194
87195   function actionMergePolygon(ids, newRelationId) {
87196
87197       function groupEntities(graph) {
87198           var entities = ids.map(function (id) { return graph.entity(id); });
87199           return assignIn({
87200                   closedWay: [],
87201                   multipolygon: [],
87202                   other: []
87203               }, groupBy(entities, function(entity) {
87204                   if (entity.type === 'way' && entity.isClosed()) {
87205                       return 'closedWay';
87206                   } else if (entity.type === 'relation' && entity.isMultipolygon()) {
87207                       return 'multipolygon';
87208                   } else {
87209                       return 'other';
87210                   }
87211               }));
87212       }
87213
87214
87215       var action = function(graph) {
87216           var entities = groupEntities(graph);
87217
87218           // An array representing all the polygons that are part of the multipolygon.
87219           //
87220           // Each element is itself an array of objects with an id property, and has a
87221           // locs property which is an array of the locations forming the polygon.
87222           var polygons = entities.multipolygon.reduce(function(polygons, m) {
87223               return polygons.concat(osmJoinWays(m.members, graph));
87224           }, []).concat(entities.closedWay.map(function(d) {
87225               var member = [{id: d.id}];
87226               member.nodes = graph.childNodes(d);
87227               return member;
87228           }));
87229
87230           // contained is an array of arrays of boolean values,
87231           // where contained[j][k] is true iff the jth way is
87232           // contained by the kth way.
87233           var contained = polygons.map(function(w, i) {
87234               return polygons.map(function(d, n) {
87235                   if (i === n) return null;
87236                   return geoPolygonContainsPolygon(
87237                       map$3(d.nodes, 'loc'),
87238                       map$3(w.nodes, 'loc'));
87239               });
87240           });
87241
87242           // Sort all polygons as either outer or inner ways
87243           var members = [],
87244               outer = true;
87245
87246           while (polygons.length) {
87247               extractUncontained(polygons);
87248               polygons = polygons.filter(isContained);
87249               contained = contained.filter(isContained).map(filterContained);
87250           }
87251
87252           function isContained(d, i) {
87253               return some(contained[i]);
87254           }
87255
87256           function filterContained(d) {
87257               return d.filter(isContained);
87258           }
87259
87260           function extractUncontained(polygons) {
87261               polygons.forEach(function(d, i) {
87262                   if (!isContained(d, i)) {
87263                       d.forEach(function(member) {
87264                           members.push({
87265                               type: 'way',
87266                               id: member.id,
87267                               role: outer ? 'outer' : 'inner'
87268                           });
87269                       });
87270                   }
87271               });
87272               outer = !outer;
87273           }
87274
87275           // Move all tags to one relation
87276           var relation = entities.multipolygon[0] ||
87277               osmRelation({ id: newRelationId, tags: { type: 'multipolygon' }});
87278
87279           entities.multipolygon.slice(1).forEach(function(m) {
87280               relation = relation.mergeTags(m.tags);
87281               graph = graph.remove(m);
87282           });
87283
87284           entities.closedWay.forEach(function(way) {
87285               function isThisOuter(m) {
87286                   return m.id === way.id && m.role !== 'inner';
87287               }
87288               if (members.some(isThisOuter)) {
87289                   relation = relation.mergeTags(way.tags);
87290                   graph = graph.replace(way.update({ tags: {} }));
87291               }
87292           });
87293
87294           return graph.replace(relation.update({
87295               members: members,
87296               tags: omit(relation.tags, 'area')
87297           }));
87298       };
87299
87300
87301       action.disabled = function(graph) {
87302           var entities = groupEntities(graph);
87303           if (entities.other.length > 0 ||
87304               entities.closedWay.length + entities.multipolygon.length < 2)
87305               return 'not_eligible';
87306           if (!entities.multipolygon.every(function(r) { return r.isComplete(graph); }))
87307               return 'incomplete_relation';
87308       };
87309
87310
87311       return action;
87312   }
87313
87314   // Text diff algorithm following Hunt and McIlroy 1976.
87315   // J. W. Hunt and M. D. McIlroy, An algorithm for differential file
87316   // comparison, Bell Telephone Laboratories CSTR #41 (1976)
87317   // http://www.cs.dartmouth.edu/~doug/
87318   //
87319   // Expects two arrays of strings.
87320   function LCS(file1, file2) {
87321     var equivalenceClasses;
87322     var file2indices;
87323     var newCandidate;
87324     var candidates;
87325     var line;
87326     var c, i, j, jX, r, s;
87327
87328     equivalenceClasses = {};
87329     for (j = 0; j < file2.length; j++) {
87330       line = file2[j];
87331       if (equivalenceClasses[line]) {
87332         equivalenceClasses[line].push(j);
87333       } else {
87334         equivalenceClasses[line] = [j];
87335       }
87336     }
87337
87338     candidates = [
87339       { file1index: -1, file2index: -1, chain: null }
87340     ];
87341
87342     for (i = 0; i < file1.length; i++) {
87343       line = file1[i];
87344       file2indices = equivalenceClasses[line] || [];
87345
87346       r = 0;
87347       c = candidates[0];
87348
87349       for (jX = 0; jX < file2indices.length; jX++) {
87350         j = file2indices[jX];
87351
87352         for (s = r; s < candidates.length; s++) {
87353           if ((candidates[s].file2index < j) && ((s === candidates.length - 1) || (candidates[s + 1].file2index > j))) {
87354             break;
87355           }
87356         }
87357
87358         if (s < candidates.length) {
87359           newCandidate = { file1index: i, file2index: j, chain: candidates[s] };
87360           if (r === candidates.length) {
87361             candidates.push(c);
87362           } else {
87363             candidates[r] = c;
87364           }
87365           r = s + 1;
87366           c = newCandidate;
87367           if (r === candidates.length) {
87368             break; // no point in examining further (j)s
87369           }
87370         }
87371       }
87372
87373       candidates[r] = c;
87374     }
87375
87376     // At this point, we know the LCS: it's in the reverse of the
87377     // linked-list through .chain of candidates[candidates.length - 1].
87378
87379     return candidates[candidates.length - 1];
87380   }
87381
87382
87383   // We apply the LCS to give a simple representation of the
87384   // offsets and lengths of mismatched chunks in the input
87385   // files. This is used by diff3MergeIndices below.
87386   function diffIndices(file1, file2) {
87387     var result = [];
87388     var tail1 = file1.length;
87389     var tail2 = file2.length;
87390
87391     for (var candidate = LCS(file1, file2);
87392        candidate !== null;
87393        candidate = candidate.chain)
87394     {
87395       var mismatchLength1 = tail1 - candidate.file1index - 1;
87396       var mismatchLength2 = tail2 - candidate.file2index - 1;
87397       tail1 = candidate.file1index;
87398       tail2 = candidate.file2index;
87399
87400       if (mismatchLength1 || mismatchLength2) {
87401         result.push({
87402           file1: [tail1 + 1, mismatchLength1],
87403           file2: [tail2 + 1, mismatchLength2]
87404         });
87405       }
87406     }
87407
87408     result.reverse();
87409     return result;
87410   }
87411
87412
87413   // Given three files, A, O, and B, where both A and B are
87414   // independently derived from O, returns a fairly complicated
87415   // internal representation of merge decisions it's taken. The
87416   // interested reader may wish to consult
87417   //
87418   // Sanjeev Khanna, Keshav Kunal, and Benjamin C. Pierce.
87419   // 'A Formal Investigation of ' In Arvind and Prasad,
87420   // editors, Foundations of Software Technology and Theoretical
87421   // Computer Science (FSTTCS), December 2007.
87422   //
87423   // (http://www.cis.upenn.edu/~bcpierce/papers/diff3-short.pdf)
87424   function diff3MergeIndices(a, o, b) {
87425     var i;
87426     var m1 = diffIndices(o, a);
87427     var m2 = diffIndices(o, b);
87428
87429     var hunks = [];
87430     function addHunk(h, side) {
87431       hunks.push([h.file1[0], side, h.file1[1], h.file2[0], h.file2[1]]);
87432     }
87433     for (i = 0; i < m1.length; i++) { addHunk(m1[i], 0); }
87434     for (i = 0; i < m2.length; i++) { addHunk(m2[i], 2); }
87435     hunks.sort(function (x, y) { return x[0] - y[0]; });
87436
87437     var result = [];
87438     var commonOffset = 0;
87439     function copyCommon(targetOffset) {
87440       if (targetOffset > commonOffset) {
87441         result.push([1, commonOffset, targetOffset - commonOffset]);
87442         commonOffset = targetOffset;
87443       }
87444     }
87445
87446     for (var hunkIndex = 0; hunkIndex < hunks.length; hunkIndex++) {
87447       var firstHunkIndex = hunkIndex;
87448       var hunk = hunks[hunkIndex];
87449       var regionLhs = hunk[0];
87450       var regionRhs = regionLhs + hunk[2];
87451       while (hunkIndex < hunks.length - 1) {
87452         var maybeOverlapping = hunks[hunkIndex + 1];
87453         var maybeLhs = maybeOverlapping[0];
87454         if (maybeLhs > regionRhs) {
87455           break;
87456         }
87457         regionRhs = Math.max(regionRhs, maybeLhs + maybeOverlapping[2]);
87458         hunkIndex++;
87459       }
87460
87461       copyCommon(regionLhs);
87462       if (firstHunkIndex === hunkIndex) {
87463         // The 'overlap' was only one hunk long, meaning that
87464         // there's no conflict here. Either a and o were the
87465         // same, or b and o were the same.
87466         if (hunk[4] > 0) {
87467           result.push([hunk[1], hunk[3], hunk[4]]);
87468         }
87469       } else {
87470         // A proper conflict. Determine the extents of the
87471         // regions involved from a, o and b. Effectively merge
87472         // all the hunks on the left into one giant hunk, and
87473         // do the same for the right; then, correct for skew
87474         // in the regions of o that each side changed, and
87475         // report appropriate spans for the three sides.
87476         var regions = {
87477           0: [a.length, -1, o.length, -1],
87478           2: [b.length, -1, o.length, -1]
87479         };
87480         for (i = firstHunkIndex; i <= hunkIndex; i++) {
87481           hunk = hunks[i];
87482           var side = hunk[1];
87483           var r = regions[side];
87484           var oLhs = hunk[0];
87485           var oRhs = oLhs + hunk[2];
87486           var abLhs = hunk[3];
87487           var abRhs = abLhs + hunk[4];
87488           r[0] = Math.min(abLhs, r[0]);
87489           r[1] = Math.max(abRhs, r[1]);
87490           r[2] = Math.min(oLhs, r[2]);
87491           r[3] = Math.max(oRhs, r[3]);
87492         }
87493         var aLhs = regions[0][0] + (regionLhs - regions[0][2]);
87494         var aRhs = regions[0][1] + (regionRhs - regions[0][3]);
87495         var bLhs = regions[2][0] + (regionLhs - regions[2][2]);
87496         var bRhs = regions[2][1] + (regionRhs - regions[2][3]);
87497         result.push([-1,
87498                      aLhs,      aRhs      - aLhs,
87499                      regionLhs, regionRhs - regionLhs,
87500                      bLhs,      bRhs      - bLhs]);
87501       }
87502       commonOffset = regionRhs;
87503     }
87504
87505     copyCommon(o.length);
87506     return result;
87507   }
87508
87509
87510   // Applies the output of diff3MergeIndices to actually
87511   // construct the merged file; the returned result alternates
87512   // between 'ok' and 'conflict' blocks.
87513   function diff3Merge(a, o, b, excludeFalseConflicts) {
87514     var result = [];
87515     var files = [a, o, b];
87516     var indices = diff3MergeIndices(a, o, b);
87517
87518     var okLines = [];
87519     function flushOk() {
87520       if (okLines.length) {
87521         result.push({ok: okLines});
87522       }
87523       okLines = [];
87524     }
87525     function pushOk(xs) {
87526       for (var j = 0; j < xs.length; j++) {
87527         okLines.push(xs[j]);
87528       }
87529     }
87530
87531     function isTrueConflict(rec) {
87532       if (rec[2] !== rec[6]) return true;
87533       var aoff = rec[1];
87534       var boff = rec[5];
87535       for (var j = 0; j < rec[2]; j++) {
87536         if (a[j + aoff] !== b[j + boff]) {
87537           return true;
87538         }
87539       }
87540       return false;
87541     }
87542
87543     for (var i = 0; i < indices.length; i++) {
87544       var x = indices[i];
87545       var side = x[0];
87546       if (side === -1) {
87547         if (excludeFalseConflicts && !isTrueConflict(x)) {
87548           pushOk(files[0].slice(x[1], x[1] + x[2]));
87549         } else {
87550           flushOk();
87551           result.push({
87552             conflict: {
87553               a: a.slice(x[1], x[1] + x[2]),
87554               aIndex: x[1],
87555               o: o.slice(x[3], x[3] + x[4]),
87556               oIndex: x[3],
87557               b: b.slice(x[5], x[5] + x[6]),
87558               bIndex: x[5]
87559             }
87560           });
87561         }
87562       } else {
87563         pushOk(files[side].slice(x[1], x[1] + x[2]));
87564       }
87565     }
87566
87567     flushOk();
87568     return result;
87569   }
87570
87571   function actionMergeRemoteChanges(id, localGraph, remoteGraph, formatUser) {
87572       var _option = 'safe';  // 'safe', 'force_local', 'force_remote'
87573       var _conflicts = [];
87574
87575
87576       function user(d) {
87577           return isFunction(formatUser) ? formatUser(d) : d;
87578       }
87579
87580
87581       function mergeLocation(remote, target) {
87582           function pointEqual(a, b) {
87583               var epsilon = 1e-6;
87584               return (Math.abs(a[0] - b[0]) < epsilon) && (Math.abs(a[1] - b[1]) < epsilon);
87585           }
87586
87587           if (_option === 'force_local' || pointEqual(target.loc, remote.loc)) {
87588               return target;
87589           }
87590           if (_option === 'force_remote') {
87591               return target.update({loc: remote.loc});
87592           }
87593
87594           _conflicts.push(t('merge_remote_changes.conflict.location', { user: user(remote.user) }));
87595           return target;
87596       }
87597
87598
87599       function mergeNodes(base, remote, target) {
87600           if (_option === 'force_local' || isEqual(target.nodes, remote.nodes)) {
87601               return target;
87602           }
87603           if (_option === 'force_remote') {
87604               return target.update({nodes: remote.nodes});
87605           }
87606
87607           var ccount = _conflicts.length;
87608           var o = base.nodes || [];
87609           var a = target.nodes || [];
87610           var b = remote.nodes || [];
87611           var nodes = [];
87612           var hunks = diff3Merge(a, o, b, true);
87613
87614           for (var i = 0; i < hunks.length; i++) {
87615               var hunk = hunks[i];
87616               if (hunk.ok) {
87617                   nodes.push.apply(nodes, hunk.ok);
87618               } else {
87619                   // for all conflicts, we can assume c.a !== c.b
87620                   // because `diff3Merge` called with `true` option to exclude false conflicts..
87621                   var c = hunk.conflict;
87622                   if (isEqual(c.o, c.a)) {  // only changed remotely
87623                       nodes.push.apply(nodes, c.b);
87624                   } else if (isEqual(c.o, c.b)) {  // only changed locally
87625                       nodes.push.apply(nodes, c.a);
87626                   } else {       // changed both locally and remotely
87627                       _conflicts.push(t('merge_remote_changes.conflict.nodelist', { user: user(remote.user) }));
87628                       break;
87629                   }
87630               }
87631           }
87632
87633           return (_conflicts.length === ccount) ? target.update({nodes: nodes}) : target;
87634       }
87635
87636
87637       function mergeChildren(targetWay, children, updates, graph) {
87638           function isUsed(node, targetWay) {
87639               var parentWays = map$3(graph.parentWays(node), 'id');
87640               return node.hasInterestingTags() ||
87641                   without(parentWays, targetWay.id).length > 0 ||
87642                   graph.parentRelations(node).length > 0;
87643           }
87644
87645           var ccount = _conflicts.length;
87646
87647           for (var i = 0; i < children.length; i++) {
87648               var id = children[i];
87649               var node = graph.hasEntity(id);
87650
87651               // remove unused childNodes..
87652               if (targetWay.nodes.indexOf(id) === -1) {
87653                   if (node && !isUsed(node, targetWay)) {
87654                       updates.removeIds.push(id);
87655                   }
87656                   continue;
87657               }
87658
87659               // restore used childNodes..
87660               var local = localGraph.hasEntity(id);
87661               var remote = remoteGraph.hasEntity(id);
87662               var target;
87663
87664               if (_option === 'force_remote' && remote && remote.visible) {
87665                   updates.replacements.push(remote);
87666
87667               } else if (_option === 'force_local' && local) {
87668                   target = osmEntity$$1(local);
87669                   if (remote) {
87670                       target = target.update({ version: remote.version });
87671                   }
87672                   updates.replacements.push(target);
87673
87674               } else if (_option === 'safe' && local && remote && local.version !== remote.version) {
87675                   target = osmEntity$$1(local, { version: remote.version });
87676                   if (remote.visible) {
87677                       target = mergeLocation(remote, target);
87678                   } else {
87679                       _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
87680                   }
87681
87682                   if (_conflicts.length !== ccount) break;
87683                   updates.replacements.push(target);
87684               }
87685           }
87686
87687           return targetWay;
87688       }
87689
87690
87691       function updateChildren(updates, graph) {
87692           for (var i = 0; i < updates.replacements.length; i++) {
87693               graph = graph.replace(updates.replacements[i]);
87694           }
87695           if (updates.removeIds.length) {
87696               graph = actionDeleteMultiple(updates.removeIds)(graph);
87697           }
87698           return graph;
87699       }
87700
87701
87702       function mergeMembers(remote, target) {
87703           if (_option === 'force_local' || isEqual(target.members, remote.members)) {
87704               return target;
87705           }
87706           if (_option === 'force_remote') {
87707               return target.update({members: remote.members});
87708           }
87709
87710           _conflicts.push(t('merge_remote_changes.conflict.memberlist', { user: user(remote.user) }));
87711           return target;
87712       }
87713
87714
87715       function mergeTags(base, remote, target) {
87716           function ignoreKey(k) {
87717               return dataDiscarded[k];
87718           }
87719
87720           if (_option === 'force_local' || isEqual(target.tags, remote.tags)) {
87721               return target;
87722           }
87723           if (_option === 'force_remote') {
87724               return target.update({tags: remote.tags});
87725           }
87726
87727           var ccount = _conflicts.length;
87728           var o = base.tags || {};
87729           var a = target.tags || {};
87730           var b = remote.tags || {};
87731           var keys = reject(union(keys$1(o), keys$1(a), keys$1(b)), ignoreKey);
87732           var tags = clone(a);
87733           var changed = false;
87734
87735           for (var i = 0; i < keys.length; i++) {
87736               var k = keys[i];
87737
87738               if (o[k] !== b[k] && a[k] !== b[k]) {    // changed remotely..
87739                   if (o[k] !== a[k]) {      // changed locally..
87740                       _conflicts.push(t('merge_remote_changes.conflict.tags',
87741                           { tag: k, local: a[k], remote: b[k], user: user(remote.user) }));
87742
87743                   } else {                  // unchanged locally, accept remote change..
87744                       if (b.hasOwnProperty(k)) {
87745                           tags[k] = b[k];
87746                       } else {
87747                           delete tags[k];
87748                       }
87749                       changed = true;
87750                   }
87751               }
87752           }
87753
87754           return (changed && _conflicts.length === ccount) ? target.update({tags: tags}) : target;
87755       }
87756
87757
87758       //  `graph.base()` is the common ancestor of the two graphs.
87759       //  `localGraph` contains user's edits up to saving
87760       //  `remoteGraph` contains remote edits to modified nodes
87761       //  `graph` must be a descendent of `localGraph` and may include
87762       //      some conflict resolution actions performed on it.
87763       //
87764       //                  --- ... --- `localGraph` -- ... -- `graph`
87765       //                 /
87766       //  `graph.base()` --- ... --- `remoteGraph`
87767       //
87768       var action = function(graph) {
87769           var updates = { replacements: [], removeIds: [] };
87770           var base = graph.base().entities[id];
87771           var local = localGraph.entity(id);
87772           var remote = remoteGraph.entity(id);
87773           var target = osmEntity$$1(local, { version: remote.version });
87774
87775           // delete/undelete
87776           if (!remote.visible) {
87777               if (_option === 'force_remote') {
87778                   return actionDeleteMultiple([id])(graph);
87779
87780               } else if (_option === 'force_local') {
87781                   if (target.type === 'way') {
87782                       target = mergeChildren(target, uniq(local.nodes), updates, graph);
87783                       graph = updateChildren(updates, graph);
87784                   }
87785                   return graph.replace(target);
87786
87787               } else {
87788                   _conflicts.push(t('merge_remote_changes.conflict.deleted', { user: user(remote.user) }));
87789                   return graph;  // do nothing
87790               }
87791           }
87792
87793           // merge
87794           if (target.type === 'node') {
87795               target = mergeLocation(remote, target);
87796
87797           } else if (target.type === 'way') {
87798               // pull in any child nodes that may not be present locally..
87799               graph.rebase(remoteGraph.childNodes(remote), [graph], false);
87800               target = mergeNodes(base, remote, target);
87801               target = mergeChildren(target, union(local.nodes, remote.nodes), updates, graph);
87802
87803           } else if (target.type === 'relation') {
87804               target = mergeMembers(remote, target);
87805           }
87806
87807           target = mergeTags(base, remote, target);
87808
87809           if (!_conflicts.length) {
87810               graph = updateChildren(updates, graph).replace(target);
87811           }
87812
87813           return graph;
87814       };
87815
87816
87817       action.withOption = function(opt) {
87818           _option = opt;
87819           return action;
87820       };
87821
87822
87823       action.conflicts = function() {
87824           return _conflicts;
87825       };
87826
87827
87828       return action;
87829   }
87830
87831   // https://github.com/openstreetmap/josm/blob/mirror/src/org/openstreetmap/josm/command/MoveCommand.java
87832   // https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/MoveNodeAction.as
87833   function actionMove(moveIds, tryDelta, projection, cache) {
87834       var _delta = tryDelta;
87835
87836       function setupCache(graph) {
87837           function canMove(nodeId) {
87838               // Allow movement of any node that is in the selectedIDs list..
87839               if (moveIds.indexOf(nodeId) !== -1) return true;
87840
87841               // Allow movement of a vertex where 2 ways meet..
87842               var parents = map$3(graph.parentWays(graph.entity(nodeId)), 'id');
87843               if (parents.length < 3) return true;
87844
87845               // Restrict movement of a vertex where >2 ways meet, unless all parentWays are moving too..
87846               var parentsMoving = every(parents, function(id) { return cache.moving[id]; });
87847               if (!parentsMoving) delete cache.moving[nodeId];
87848
87849               return parentsMoving;
87850           }
87851
87852           function cacheEntities(ids) {
87853               for (var i = 0; i < ids.length; i++) {
87854                   var id = ids[i];
87855                   if (cache.moving[id]) continue;
87856                   cache.moving[id] = true;
87857
87858                   var entity = graph.hasEntity(id);
87859                   if (!entity) continue;
87860
87861                   if (entity.type === 'node') {
87862                       cache.nodes.push(id);
87863                       cache.startLoc[id] = entity.loc;
87864                   } else if (entity.type === 'way') {
87865                       cache.ways.push(id);
87866                       cacheEntities(entity.nodes);
87867                   } else {
87868                       cacheEntities(entity.members.map(function(member) {
87869                           return member.id;
87870                       }));
87871                   }
87872               }
87873           }
87874
87875           function cacheIntersections(ids) {
87876               function isEndpoint(way, id) {
87877                   return !way.isClosed() && !!way.affix(id);
87878               }
87879
87880               for (var i = 0; i < ids.length; i++) {
87881                   var id = ids[i];
87882
87883                   // consider only intersections with 1 moved and 1 unmoved way.
87884                   var childNodes = graph.childNodes(graph.entity(id));
87885                   for (var j = 0; j < childNodes.length; j++) {
87886                       var node = childNodes[j];
87887                       var parents = graph.parentWays(node);
87888                       if (parents.length !== 2) continue;
87889
87890                       var moved = graph.entity(id);
87891                       var unmoved = null;
87892                       for (var k = 0; k < parents.length; k++) {
87893                           var way = parents[k];
87894                           if (!cache.moving[way.id]) {
87895                               unmoved = way;
87896                               break;
87897                           }
87898                       }
87899                       if (!unmoved) continue;
87900
87901                       // exclude ways that are overly connected..
87902                       if (intersection(moved.nodes, unmoved.nodes).length > 2) continue;
87903                       if (moved.isArea() || unmoved.isArea()) continue;
87904
87905                       cache.intersections.push({
87906                           nodeId: node.id,
87907                           movedId: moved.id,
87908                           unmovedId: unmoved.id,
87909                           movedIsEP: isEndpoint(moved, node.id),
87910                           unmovedIsEP: isEndpoint(unmoved, node.id)
87911                       });
87912                   }
87913               }
87914           }
87915
87916
87917           if (!cache) {
87918               cache = {};
87919           }
87920           if (!cache.ok) {
87921               cache.moving = {};
87922               cache.intersections = [];
87923               cache.replacedVertex = {};
87924               cache.startLoc = {};
87925               cache.nodes = [];
87926               cache.ways = [];
87927
87928               cacheEntities(moveIds);
87929               cacheIntersections(cache.ways);
87930               cache.nodes = filter(cache.nodes, canMove);
87931
87932               cache.ok = true;
87933           }
87934       }
87935
87936
87937       // Place a vertex where the moved vertex used to be, to preserve way shape..
87938       //
87939       //  Start:
87940       //      b ---- e
87941       //     / \
87942       //    /   \
87943       //   /     \
87944       //  a       c
87945       //
87946       //      *               node '*' added to preserve shape
87947       //     / \
87948       //    /   b ---- e      way `b,e` moved here:
87949       //   /     \
87950       //  a       c
87951       //
87952       //
87953       function replaceMovedVertex(nodeId, wayId, graph, delta) {
87954           var way = graph.entity(wayId);
87955           var moved = graph.entity(nodeId);
87956           var movedIndex = way.nodes.indexOf(nodeId);
87957           var len, prevIndex, nextIndex;
87958
87959           if (way.isClosed()) {
87960               len = way.nodes.length - 1;
87961               prevIndex = (movedIndex + len - 1) % len;
87962               nextIndex = (movedIndex + len + 1) % len;
87963           } else {
87964               len = way.nodes.length;
87965               prevIndex = movedIndex - 1;
87966               nextIndex = movedIndex + 1;
87967           }
87968
87969           var prev = graph.hasEntity(way.nodes[prevIndex]);
87970           var next = graph.hasEntity(way.nodes[nextIndex]);
87971
87972           // Don't add orig vertex at endpoint..
87973           if (!prev || !next) return graph;
87974
87975           var key = wayId + '_' + nodeId;
87976           var orig = cache.replacedVertex[key];
87977           if (!orig) {
87978               orig = osmNode();
87979               cache.replacedVertex[key] = orig;
87980               cache.startLoc[orig.id] = cache.startLoc[nodeId];
87981           }
87982
87983           var start, end;
87984           if (delta) {
87985               start = projection(cache.startLoc[nodeId]);
87986               end = projection.invert(geoVecAdd(start, delta));
87987           } else {
87988               end = cache.startLoc[nodeId];
87989           }
87990           orig = orig.move(end);
87991
87992           var angle = Math.abs(geoAngle(orig, prev, projection) -
87993                   geoAngle(orig, next, projection)) * 180 / Math.PI;
87994
87995           // Don't add orig vertex if it would just make a straight line..
87996           if (angle > 175 && angle < 185) return graph;
87997
87998           // moving forward or backward along way?
87999           var p1 = [prev.loc, orig.loc, moved.loc, next.loc].map(projection);
88000           var p2 = [prev.loc, moved.loc, orig.loc, next.loc].map(projection);
88001           var d1 = geoPathLength(p1);
88002           var d2 = geoPathLength(p2);
88003           var insertAt = (d1 <= d2) ? movedIndex : nextIndex;
88004
88005           // moving around closed loop?
88006           if (way.isClosed() && insertAt === 0) insertAt = len;
88007
88008           way = way.addNode(orig.id, insertAt);
88009           return graph.replace(orig).replace(way);
88010       }
88011
88012
88013       // Remove duplicate vertex that might have been added by
88014       // replaceMovedVertex.  This is done after the unzorro checks.
88015       function removeDuplicateVertices(wayId, graph) {
88016           var way = graph.entity(wayId);
88017           var epsilon = 1e-6;
88018           var prev, curr;
88019
88020           function isInteresting(node, graph) {
88021               return graph.parentWays(node).length > 1 ||
88022                   graph.parentRelations(node).length ||
88023                   node.hasInterestingTags();
88024           }
88025
88026           for (var i = 0; i < way.nodes.length; i++) {
88027               curr = graph.entity(way.nodes[i]);
88028
88029               if (prev && curr && geoVecEqual(prev.loc, curr.loc, epsilon)) {
88030                   if (!isInteresting(prev, graph)) {
88031                       way = way.removeNode(prev.id);
88032                       graph = graph.replace(way).remove(prev);
88033                   } else if (!isInteresting(curr, graph)) {
88034                       way = way.removeNode(curr.id);
88035                       graph = graph.replace(way).remove(curr);
88036                   }
88037               }
88038
88039               prev = curr;
88040           }
88041
88042           return graph;
88043       }
88044
88045
88046       // Reorder nodes around intersections that have moved..
88047       //
88048       //  Start:                way1.nodes: b,e         (moving)
88049       //  a - b - c ----- d     way2.nodes: a,b,c,d     (static)
88050       //      |                 vertex: b
88051       //      e                 isEP1: true,  isEP2, false
88052       //
88053       //  way1 `b,e` moved here:
88054       //  a ----- c = b - d
88055       //              |
88056       //              e
88057       //
88058       //  reorder nodes         way1.nodes: b,e
88059       //  a ----- c - b - d     way2.nodes: a,c,b,d
88060       //              |
88061       //              e
88062       //
88063       function unZorroIntersection(intersection$$1, graph) {
88064           var vertex = graph.entity(intersection$$1.nodeId);
88065           var way1 = graph.entity(intersection$$1.movedId);
88066           var way2 = graph.entity(intersection$$1.unmovedId);
88067           var isEP1 = intersection$$1.movedIsEP;
88068           var isEP2 = intersection$$1.unmovedIsEP;
88069
88070           // don't move the vertex if it is the endpoint of both ways.
88071           if (isEP1 && isEP2) return graph;
88072
88073           var nodes1 = without(graph.childNodes(way1), vertex);
88074           var nodes2 = without(graph.childNodes(way2), vertex);
88075
88076           if (way1.isClosed() && way1.first() === vertex.id) nodes1.push(nodes1[0]);
88077           if (way2.isClosed() && way2.first() === vertex.id) nodes2.push(nodes2[0]);
88078
88079           var edge1 = !isEP1 && geoChooseEdge(nodes1, projection(vertex.loc), projection);
88080           var edge2 = !isEP2 && geoChooseEdge(nodes2, projection(vertex.loc), projection);
88081           var loc;
88082
88083           // snap vertex to nearest edge (or some point between them)..
88084           if (!isEP1 && !isEP2) {
88085               var epsilon = 1e-6, maxIter = 10;
88086               for (var i = 0; i < maxIter; i++) {
88087                   loc = geoVecInterp(edge1.loc, edge2.loc, 0.5);
88088                   edge1 = geoChooseEdge(nodes1, projection(loc), projection);
88089                   edge2 = geoChooseEdge(nodes2, projection(loc), projection);
88090                   if (Math.abs(edge1.distance - edge2.distance) < epsilon) break;
88091               }
88092           } else if (!isEP1) {
88093               loc = edge1.loc;
88094           } else {
88095               loc = edge2.loc;
88096           }
88097
88098           graph = graph.replace(vertex.move(loc));
88099
88100           // if zorro happened, reorder nodes..
88101           if (!isEP1 && edge1.index !== way1.nodes.indexOf(vertex.id)) {
88102               way1 = way1.removeNode(vertex.id).addNode(vertex.id, edge1.index);
88103               graph = graph.replace(way1);
88104           }
88105           if (!isEP2 && edge2.index !== way2.nodes.indexOf(vertex.id)) {
88106               way2 = way2.removeNode(vertex.id).addNode(vertex.id, edge2.index);
88107               graph = graph.replace(way2);
88108           }
88109
88110           return graph;
88111       }
88112
88113
88114       function cleanupIntersections(graph) {
88115           for (var i = 0; i < cache.intersections.length; i++) {
88116               var obj = cache.intersections[i];
88117               graph = replaceMovedVertex(obj.nodeId, obj.movedId, graph, _delta);
88118               graph = replaceMovedVertex(obj.nodeId, obj.unmovedId, graph, null);
88119               graph = unZorroIntersection(obj, graph);
88120               graph = removeDuplicateVertices(obj.movedId, graph);
88121               graph = removeDuplicateVertices(obj.unmovedId, graph);
88122           }
88123
88124           return graph;
88125       }
88126
88127
88128       // check if moving way endpoint can cross an unmoved way, if so limit delta..
88129       function limitDelta(graph) {
88130           function moveNode(loc) {
88131               return geoVecAdd(projection(loc), _delta);
88132           }
88133
88134           for (var i = 0; i < cache.intersections.length; i++) {
88135               var obj = cache.intersections[i];
88136
88137               // Don't limit movement if this is vertex joins 2 endpoints..
88138               if (obj.movedIsEP && obj.unmovedIsEP) continue;
88139               // Don't limit movement if this vertex is not an endpoint anyway..
88140               if (!obj.movedIsEP) continue;
88141
88142               var node = graph.entity(obj.nodeId);
88143               var start = projection(node.loc);
88144               var end = geoVecAdd(start, _delta);
88145               var movedNodes = graph.childNodes(graph.entity(obj.movedId));
88146               var movedPath = map$3(map$3(movedNodes, 'loc'), moveNode);
88147               var unmovedNodes = graph.childNodes(graph.entity(obj.unmovedId));
88148               var unmovedPath = map$3(map$3(unmovedNodes, 'loc'), projection);
88149               var hits = geoPathIntersections(movedPath, unmovedPath);
88150
88151               for (var j = 0; i < hits.length; i++) {
88152                   if (isEqual(hits[j], end)) continue;
88153                   var edge = geoChooseEdge(unmovedNodes, end, projection);
88154                   _delta = geoVecSubtract(projection(edge.loc), start);
88155               }
88156           }
88157       }
88158
88159
88160       var action = function(graph) {
88161           if (_delta[0] === 0 && _delta[1] === 0) return graph;
88162
88163           setupCache(graph);
88164
88165           if (cache.intersections.length) {
88166               limitDelta(graph);
88167           }
88168
88169           for (var i = 0; i < cache.nodes.length; i++) {
88170               var node = graph.entity(cache.nodes[i]);
88171               var start = projection(node.loc);
88172               var end = geoVecAdd(start, _delta);
88173               graph = graph.replace(node.move(projection.invert(end)));
88174           }
88175
88176           if (cache.intersections.length) {
88177               graph = cleanupIntersections(graph);
88178           }
88179
88180           return graph;
88181       };
88182
88183
88184       action.delta = function() {
88185           return _delta;
88186       };
88187
88188
88189       return action;
88190   }
88191
88192   function actionMoveNode(nodeID, toLoc) {
88193
88194       var action = function(graph, t) {
88195           if (t === null || !isFinite(t)) t = 1;
88196           t = Math.min(Math.max(+t, 0), 1);
88197
88198           var node = graph.entity(nodeID);
88199           return graph.replace(
88200               node.move(geoVecInterp(node.loc, toLoc, t))
88201           );
88202       };
88203
88204       action.transitionable = true;
88205
88206       return action;
88207   }
88208
88209   function actionNoop() {
88210       return function(graph) {
88211           return graph;
88212       };
88213   }
88214
88215   /*
88216    * Based on https://github.com/openstreetmap/potlatch2/blob/master/net/systemeD/potlatch2/tools/Quadrilateralise.as
88217    */
88218   function actionOrthogonalize(wayId, projection) {
88219       var threshold = 12, // degrees within right or straight to alter
88220           lowerThreshold = Math.cos((90 - threshold) * Math.PI / 180),
88221           upperThreshold = Math.cos(threshold * Math.PI / 180);
88222
88223
88224       var action = function(graph, t) {
88225           if (t === null || !isFinite(t)) t = 1;
88226           t = Math.min(Math.max(+t, 0), 1);
88227
88228           var way = graph.entity(wayId),
88229               nodes = graph.childNodes(way),
88230               points = uniq(nodes).map(function(n) { return projection(n.loc); }),
88231               corner = {i: 0, dotp: 1},
88232               epsilon = 1e-4,
88233               node, loc, score, motions, i, j;
88234
88235           if (points.length === 3) {   // move only one vertex for right triangle
88236               for (i = 0; i < 1000; i++) {
88237                   motions = points.map(calcMotion);
88238                   points[corner.i] = addPoints(points[corner.i], motions[corner.i]);
88239                   score = corner.dotp;
88240                   if (score < epsilon) {
88241                       break;
88242                   }
88243               }
88244
88245               node = graph.entity(nodes[corner.i].id);
88246               loc = projection.invert(points[corner.i]);
88247               graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
88248
88249           } else {
88250               var best,
88251                   originalPoints = clone(points);
88252               score = Infinity;
88253
88254               for (i = 0; i < 1000; i++) {
88255                   motions = points.map(calcMotion);
88256                   for (j = 0; j < motions.length; j++) {
88257                       points[j] = addPoints(points[j],motions[j]);
88258                   }
88259                   var newScore = squareness(points);
88260                   if (newScore < score) {
88261                       best = clone(points);
88262                       score = newScore;
88263                   }
88264                   if (score < epsilon) {
88265                       break;
88266                   }
88267               }
88268
88269               points = best;
88270
88271               for (i = 0; i < points.length; i++) {
88272                   // only move the points that actually moved
88273                   if (originalPoints[i][0] !== points[i][0] || originalPoints[i][1] !== points[i][1]) {
88274                       loc = projection.invert(points[i]);
88275                       node = graph.entity(nodes[i].id);
88276                       graph = graph.replace(node.move(geoVecInterp(node.loc, loc, t)));
88277                   }
88278               }
88279
88280               // remove empty nodes on straight sections
88281               for (i = 0; t === 1 && i < points.length; i++) {
88282                   node = graph.entity(nodes[i].id);
88283
88284                   if (graph.parentWays(node).length > 1 ||
88285                       graph.parentRelations(node).length ||
88286                       node.hasInterestingTags()) {
88287                       continue;
88288                   }
88289
88290                   var dotp = normalizedDotProduct(i, points);
88291                   if (dotp < -1 + epsilon) {
88292                       graph = actionDeleteNode(node.id)(graph);
88293                   }
88294               }
88295           }
88296
88297           return graph;
88298
88299
88300           function calcMotion(b, i, array) {
88301               var a = array[(i - 1 + array.length) % array.length],
88302                   c = array[(i + 1) % array.length],
88303                   p = subtractPoints(a, b),
88304                   q = subtractPoints(c, b),
88305                   scale, dotp;
88306
88307               scale = 2 * Math.min(geoVecLength(p, [0, 0]), geoVecLength(q, [0, 0]));
88308               p = normalizePoint(p, 1.0);
88309               q = normalizePoint(q, 1.0);
88310
88311               dotp = filterDotProduct(p[0] * q[0] + p[1] * q[1]);
88312
88313               // nasty hack to deal with almost-straight segments (angle is closer to 180 than to 90/270).
88314               if (array.length > 3) {
88315                   if (dotp < -0.707106781186547) {
88316                       dotp += 1.0;
88317                   }
88318               } else if (dotp && Math.abs(dotp) < corner.dotp) {
88319                   corner.i = i;
88320                   corner.dotp = Math.abs(dotp);
88321               }
88322
88323               return normalizePoint(addPoints(p, q), 0.1 * dotp * scale);
88324           }
88325       };
88326
88327
88328       function squareness(points) {
88329           return points.reduce(function(sum, val, i, array) {
88330               var dotp = normalizedDotProduct(i, array);
88331
88332               dotp = filterDotProduct(dotp);
88333               return sum + 2.0 * Math.min(Math.abs(dotp - 1.0), Math.min(Math.abs(dotp), Math.abs(dotp + 1)));
88334           }, 0);
88335       }
88336
88337
88338       function normalizedDotProduct(i, points) {
88339           var a = points[(i - 1 + points.length) % points.length],
88340               b = points[i],
88341               c = points[(i + 1) % points.length],
88342               p = subtractPoints(a, b),
88343               q = subtractPoints(c, b);
88344
88345           p = normalizePoint(p, 1.0);
88346           q = normalizePoint(q, 1.0);
88347
88348           return p[0] * q[0] + p[1] * q[1];
88349       }
88350
88351
88352       function subtractPoints(a, b) {
88353           return [a[0] - b[0], a[1] - b[1]];
88354       }
88355
88356
88357       function addPoints(a, b) {
88358           return [a[0] + b[0], a[1] + b[1]];
88359       }
88360
88361
88362       function normalizePoint(point, scale) {
88363           var vector = [0, 0];
88364           var length = Math.sqrt(point[0] * point[0] + point[1] * point[1]);
88365           if (length !== 0) {
88366               vector[0] = point[0] / length;
88367               vector[1] = point[1] / length;
88368           }
88369
88370           vector[0] *= scale;
88371           vector[1] *= scale;
88372
88373           return vector;
88374       }
88375
88376
88377       function filterDotProduct(dotp) {
88378           if (lowerThreshold > Math.abs(dotp) || Math.abs(dotp) > upperThreshold) {
88379               return dotp;
88380           }
88381
88382           return 0;
88383       }
88384
88385
88386       action.disabled = function(graph) {
88387           var way = graph.entity(wayId),
88388               nodes = graph.childNodes(way),
88389               points = uniq(nodes).map(function(n) { return projection(n.loc); });
88390
88391           if (squareness(points)) {
88392               return false;
88393           }
88394
88395           return 'not_squarish';
88396       };
88397
88398
88399       action.transitionable = true;
88400
88401
88402       return action;
88403   }
88404
88405   // `actionRestrictTurn` creates a turn restriction relation.
88406   //
88407   // `turn` must be an `osmTurn` object
88408   // see osm/intersection.js, pathToTurn()
88409   //
88410   // This specifies a restriction of type `restriction` when traveling from
88411   // `turn.from.way` toward `turn.to.way` via `turn.via.node` OR `turn.via.ways`.
88412   // (The action does not check that these entities form a valid intersection.)
88413   //
88414   // From, to, and via ways should be split before calling this action.
88415   // (old versions of the code would split the ways here, but we no longer do it)
88416   //
88417   // For testing convenience, accepts a restrictionID to assign to the new
88418   // relation. Normally, this will be undefined and the relation will
88419   // automatically be assigned a new ID.
88420   //
88421   function actionRestrictTurn(turn, restrictionType, restrictionID) {
88422
88423       return function(graph) {
88424           var fromWay = graph.entity(turn.from.way);
88425           var toWay = graph.entity(turn.to.way);
88426           var viaNode = turn.via.node && graph.entity(turn.via.node);
88427           var viaWays = turn.via.ways && turn.via.ways.map(function(id) { return graph.entity(id); });
88428           var members = [];
88429
88430           members.push({ id: fromWay.id, type: 'way',  role: 'from' });
88431
88432           if (viaNode) {
88433               members.push({ id: viaNode.id,  type: 'node', role: 'via' });
88434           } else if (viaWays) {
88435               viaWays.forEach(function(viaWay) {
88436                   members.push({ id: viaWay.id,  type: 'way', role: 'via' });
88437               });
88438           }
88439
88440           members.push({ id: toWay.id, type: 'way',  role: 'to' });
88441
88442           return graph.replace(osmRelation({
88443               id: restrictionID,
88444               tags: {
88445                   type: 'restriction',
88446                   restriction: restrictionType
88447               },
88448               members: members
88449           }));
88450       };
88451   }
88452
88453   function actionRevert(id) {
88454       var action = function(graph) {
88455           var entity = graph.hasEntity(id),
88456               base = graph.base().entities[id];
88457
88458           if (entity && !base) {    // entity will be removed..
88459               if (entity.type === 'node') {
88460                   graph.parentWays(entity)
88461                       .forEach(function(parent) {
88462                           parent = parent.removeNode(id);
88463                           graph = graph.replace(parent);
88464
88465                           if (parent.isDegenerate()) {
88466                               graph = actionDeleteWay(parent.id)(graph);
88467                           }
88468                       });
88469               }
88470
88471               graph.parentRelations(entity)
88472                   .forEach(function(parent) {
88473                       parent = parent.removeMembersWithID(id);
88474                       graph = graph.replace(parent);
88475
88476                       if (parent.isDegenerate()) {
88477                           graph = actionDeleteRelation(parent.id)(graph);
88478                       }
88479                   });
88480           }
88481
88482           return graph.revert(id);
88483       };
88484
88485       return action;
88486   }
88487
88488   function actionRotate(rotateIds, pivot, angle, projection) {
88489
88490       var action = function(graph) {
88491           return graph.update(function(graph) {
88492               utilGetAllNodes(rotateIds, graph).forEach(function(node) {
88493                   var point = geoRotate([projection(node.loc)], angle, pivot)[0];
88494                   graph = graph.replace(node.move(projection.invert(point)));
88495               });
88496           });
88497       };
88498
88499       return action;
88500   }
88501
88502   /* Built-in method references for those with the same name as other `lodash` methods. */
88503   var nativeMax$8 = Math.max;
88504
88505   /**
88506    * Gets the index at which the first occurrence of `value` is found in `array`
88507    * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)
88508    * for equality comparisons. If `fromIndex` is negative, it's used as the
88509    * offset from the end of `array`.
88510    *
88511    * @static
88512    * @memberOf _
88513    * @since 0.1.0
88514    * @category Array
88515    * @param {Array} array The array to inspect.
88516    * @param {*} value The value to search for.
88517    * @param {number} [fromIndex=0] The index to search from.
88518    * @returns {number} Returns the index of the matched value, else `-1`.
88519    * @example
88520    *
88521    * _.indexOf([1, 2, 1, 2], 2);
88522    * // => 1
88523    *
88524    * // Search from the `fromIndex`.
88525    * _.indexOf([1, 2, 1, 2], 2, 2);
88526    * // => 3
88527    */
88528   function indexOf(array, value, fromIndex) {
88529     var length = array == null ? 0 : array.length;
88530     if (!length) {
88531       return -1;
88532     }
88533     var index = fromIndex == null ? 0 : toInteger(fromIndex);
88534     if (index < 0) {
88535       index = nativeMax$8(length + index, 0);
88536     }
88537     return baseIndexOf(array, value, index);
88538   }
88539
88540   // Split a way at the given node.
88541   //
88542   // Optionally, split only the given ways, if multiple ways share
88543   // the given node.
88544   //
88545   // This is the inverse of `iD.actionJoin`.
88546   //
88547   // For testing convenience, accepts an ID to assign to the new way.
88548   // Normally, this will be undefined and the way will automatically
88549   // be assigned a new ID.
88550   //
88551   // Reference:
88552   //   https://github.com/systemed/potlatch2/blob/master/net/systemeD/halcyon/connection/actions/SplitWayAction.as
88553   //
88554   function actionSplit(nodeId, newWayIds) {
88555       var _wayIDs;
88556
88557       // If the way is closed, we need to search for a partner node
88558       // to split the way at.
88559       //
88560       // The following looks for a node that is both far away from
88561       // the initial node in terms of way segment length and nearby
88562       // in terms of beeline-distance. This assures that areas get
88563       // split on the most "natural" points (independent of the number
88564       // of nodes).
88565       // For example: bone-shaped areas get split across their waist
88566       // line, circles across the diameter.
88567       function splitArea(nodes, idxA, graph) {
88568           var lengths = new Array(nodes.length);
88569           var length;
88570           var i;
88571           var best = 0;
88572           var idxB;
88573
88574           function wrap(index) {
88575               return utilWrap(index, nodes.length);
88576           }
88577
88578           function dist(nA, nB) {
88579               var locA = graph.entity(nA).loc;
88580               var locB = graph.entity(nB).loc;
88581               var epsilon = 1e-6;
88582               return (locA && locB) ? geoSphericalDistance(locA, locB) : epsilon;
88583           }
88584
88585           // calculate lengths
88586           length = 0;
88587           for (i = wrap(idxA+1); i !== idxA; i = wrap(i+1)) {
88588               length += dist(nodes[i], nodes[wrap(i-1)]);
88589               lengths[i] = length;
88590           }
88591
88592           length = 0;
88593           for (i = wrap(idxA-1); i !== idxA; i = wrap(i-1)) {
88594               length += dist(nodes[i], nodes[wrap(i+1)]);
88595               if (length < lengths[i])
88596                   lengths[i] = length;
88597           }
88598
88599           // determine best opposite node to split
88600           for (i = 0; i < nodes.length; i++) {
88601               var cost = lengths[i] / dist(nodes[idxA], nodes[i]);
88602               if (cost > best) {
88603                   idxB = i;
88604                   best = cost;
88605               }
88606           }
88607
88608           return idxB;
88609       }
88610
88611
88612       function split(graph, wayA, newWayId) {
88613           var wayB = osmWay({id: newWayId, tags: wayA.tags});   // `wayB` is the NEW way
88614           var origNodes = wayA.nodes.slice();
88615           var nodesA;
88616           var nodesB;
88617           var isArea = wayA.isArea();
88618           var isOuter = osmIsSimpleMultipolygonOuterMember(wayA, graph);
88619
88620           if (wayA.isClosed()) {
88621               var nodes = wayA.nodes.slice(0, -1);
88622               var idxA = indexOf(nodes, nodeId);
88623               var idxB = splitArea(nodes, idxA, graph);
88624
88625               if (idxB < idxA) {
88626                   nodesA = nodes.slice(idxA).concat(nodes.slice(0, idxB + 1));
88627                   nodesB = nodes.slice(idxB, idxA + 1);
88628               } else {
88629                   nodesA = nodes.slice(idxA, idxB + 1);
88630                   nodesB = nodes.slice(idxB).concat(nodes.slice(0, idxA + 1));
88631               }
88632           } else {
88633               var idx = indexOf(wayA.nodes, nodeId, 1);
88634               nodesA = wayA.nodes.slice(0, idx + 1);
88635               nodesB = wayA.nodes.slice(idx);
88636           }
88637
88638           wayA = wayA.update({nodes: nodesA});
88639           wayB = wayB.update({nodes: nodesB});
88640
88641           graph = graph.replace(wayA);
88642           graph = graph.replace(wayB);
88643
88644           graph.parentRelations(wayA).forEach(function(relation) {
88645               var member;
88646
88647               // Turn restrictions - make sure:
88648               // 1. Splitting a FROM/TO way - only `wayA` OR `wayB` remains in relation
88649               //    (whichever one is connected to the VIA node/ways)
88650               // 2. Splitting a VIA way - `wayB` remains in relation as a VIA way
88651               if (relation.isRestriction()) {
88652                   var f = relation.memberByRole('from');
88653                   var v = relation.membersByRole('via');
88654                   var t = relation.memberByRole('to');
88655                   var i;
88656
88657                   // 1. split a FROM/TO
88658                   if (f.id === wayA.id || t.id === wayA.id) {
88659                       var keepB = false;
88660                       if (v.length === 1 && v[0].type === 'node') {   // check via node
88661                           keepB = wayB.contains(v[0].id);
88662                       } else {                                        // check via way(s)
88663                           for (i = 0; i < v.length; i++) {
88664                               if (v[i].type === 'way') {
88665                                   var wayVia = graph.hasEntity(v[i].id);
88666                                   if (wayVia && intersection(wayB.nodes, wayVia.nodes).length) {
88667                                       keepB = true;
88668                                       break;
88669                                   }
88670                               }
88671                           }
88672                       }
88673
88674                       if (keepB) {
88675                           relation = relation.replaceMember(wayA, wayB);
88676                           graph = graph.replace(relation);
88677                       }
88678
88679                   // 2. split a VIA
88680                   } else {
88681                       for (i = 0; i < v.length; i++) {
88682                           if (v[i].type === 'way' && v[i].id === wayA.id) {
88683                               member = {
88684                                   id: wayB.id,
88685                                   type: 'way',
88686                                   role: 'via'
88687                               };
88688                               graph = actionAddMember(relation.id, member, v[i].index + 1)(graph);
88689                               break;
88690                           }
88691                       }
88692                   }
88693
88694               // All other relations (Routes, Multipolygons, etc):
88695               // 1. Both `wayA` and `wayB` remain in the relation
88696               // 2. But must be inserted as a pair (see `actionAddMember` for details)
88697               } else {
88698                   if (relation === isOuter) {
88699                       graph = graph.replace(relation.mergeTags(wayA.tags));
88700                       graph = graph.replace(wayA.update({tags: {}}));
88701                       graph = graph.replace(wayB.update({tags: {}}));
88702                   }
88703
88704                   member = {
88705                       id: wayB.id,
88706                       type: 'way',
88707                       role: relation.memberById(wayA.id).role
88708                   };
88709
88710                   var insertPair = {
88711                       originalID: wayA.id,
88712                       insertedID: wayB.id,
88713                       nodes: origNodes
88714                   };
88715
88716                   graph = actionAddMember(relation.id, member, undefined, insertPair)(graph);
88717               }
88718           });
88719
88720           if (!isOuter && isArea) {
88721               var multipolygon = osmRelation({
88722                   tags: assignIn({}, wayA.tags, {type: 'multipolygon'}),
88723                   members: [
88724                       {id: wayA.id, role: 'outer', type: 'way'},
88725                       {id: wayB.id, role: 'outer', type: 'way'}
88726                   ]
88727               });
88728
88729               graph = graph.replace(multipolygon);
88730               graph = graph.replace(wayA.update({tags: {}}));
88731               graph = graph.replace(wayB.update({tags: {}}));
88732           }
88733
88734           return graph;
88735       }
88736
88737
88738       var action = function(graph) {
88739           var candidates = action.ways(graph);
88740           for (var i = 0; i < candidates.length; i++) {
88741               graph = split(graph, candidates[i], newWayIds && newWayIds[i]);
88742           }
88743           return graph;
88744       };
88745
88746
88747       action.ways = function(graph) {
88748           var node = graph.entity(nodeId);
88749           var parents = graph.parentWays(node);
88750           var hasLines = some(parents, function(parent) { return parent.geometry(graph) === 'line'; });
88751
88752           return parents.filter(function(parent) {
88753               if (_wayIDs && _wayIDs.indexOf(parent.id) === -1)
88754                   return false;
88755
88756               if (!_wayIDs && hasLines && parent.geometry(graph) !== 'line')
88757                   return false;
88758
88759               if (parent.isClosed()) {
88760                   return true;
88761               }
88762
88763               for (var i = 1; i < parent.nodes.length - 1; i++) {
88764                   if (parent.nodes[i] === nodeId) {
88765                       return true;
88766                   }
88767               }
88768
88769               return false;
88770           });
88771       };
88772
88773
88774       action.disabled = function(graph) {
88775           var candidates = action.ways(graph);
88776           if (candidates.length === 0 || (_wayIDs && _wayIDs.length !== candidates.length))
88777               return 'not_eligible';
88778       };
88779
88780
88781       action.limitWays = function(_) {
88782           if (!arguments.length) return _wayIDs;
88783           _wayIDs = _;
88784           return action;
88785       };
88786
88787
88788       return action;
88789   }
88790
88791   /*
88792    * Based on https://github.com/openstreetmap/potlatch2/net/systemeD/potlatch2/tools/Straighten.as
88793    */
88794   function actionStraighten(wayId, projection) {
88795
88796       function positionAlongWay(n, s, e) {
88797           return ((n[0] - s[0]) * (e[0] - s[0]) + (n[1] - s[1]) * (e[1] - s[1])) /
88798                   (Math.pow(e[0] - s[0], 2) + Math.pow(e[1] - s[1], 2));
88799       }
88800
88801
88802       var action = function(graph, t) {
88803           if (t === null || !isFinite(t)) t = 1;
88804           t = Math.min(Math.max(+t, 0), 1);
88805
88806           var way = graph.entity(wayId),
88807               nodes = graph.childNodes(way),
88808               points = nodes.map(function(n) { return projection(n.loc); }),
88809               startPoint = points[0],
88810               endPoint = points[points.length-1],
88811               toDelete = [],
88812               i;
88813
88814           for (i = 1; i < points.length-1; i++) {
88815               var node = nodes[i],
88816                   point = points[i];
88817
88818               if (t < 1 || graph.parentWays(node).length > 1 ||
88819                   graph.parentRelations(node).length ||
88820                   node.hasInterestingTags()) {
88821
88822                   var u = positionAlongWay(point, startPoint, endPoint),
88823                       p = [
88824                           startPoint[0] + u * (endPoint[0] - startPoint[0]),
88825                           startPoint[1] + u * (endPoint[1] - startPoint[1])
88826                       ],
88827                       loc2 = projection.invert(p);
88828
88829                   graph = graph.replace(node.move(geoVecInterp(node.loc, loc2, t)));
88830
88831               } else {
88832                   // safe to delete
88833                   if (toDelete.indexOf(node) === -1) {
88834                       toDelete.push(node);
88835                   }
88836               }
88837           }
88838
88839           for (i = 0; i < toDelete.length; i++) {
88840               graph = actionDeleteNode(toDelete[i].id)(graph);
88841           }
88842
88843           return graph;
88844       };
88845
88846
88847       action.disabled = function(graph) {
88848           // check way isn't too bendy
88849           var way = graph.entity(wayId),
88850               nodes = graph.childNodes(way),
88851               points = nodes.map(function(n) { return projection(n.loc); }),
88852               startPoint = points[0],
88853               endPoint = points[points.length-1],
88854               threshold = 0.2 * geoVecLength(startPoint, endPoint),
88855               i;
88856
88857           if (threshold === 0) {
88858               return 'too_bendy';
88859           }
88860
88861           for (i = 1; i < points.length-1; i++) {
88862               var point = points[i],
88863                   u = positionAlongWay(point, startPoint, endPoint),
88864                   p0 = startPoint[0] + u * (endPoint[0] - startPoint[0]),
88865                   p1 = startPoint[1] + u * (endPoint[1] - startPoint[1]),
88866                   dist = Math.sqrt(Math.pow(p0 - point[0], 2) + Math.pow(p1 - point[1], 2));
88867
88868               // to bendy if point is off by 20% of total start/end distance in projected space
88869               if (isNaN(dist) || dist > threshold) {
88870                   return 'too_bendy';
88871               }
88872           }
88873       };
88874
88875
88876       action.transitionable = true;
88877
88878
88879       return action;
88880   }
88881
88882   // `actionUnrestrictTurn` deletes a turn restriction relation.
88883   //
88884   // `turn` must be an `osmTurn` object with a `restrictionID` property.
88885   // see osm/intersection.js, pathToTurn()
88886   //
88887   function actionUnrestrictTurn(turn) {
88888       return function(graph) {
88889           return actionDeleteRelation(turn.restrictionID)(graph);
88890       };
88891   }
88892
88893   /* Reflect the given area around its axis of symmetry */
88894   function actionReflect(reflectIds, projection) {
88895       var useLongAxis = true;
88896
88897
88898       // http://gis.stackexchange.com/questions/22895/finding-minimum-area-rectangle-for-given-points
88899       // http://gis.stackexchange.com/questions/3739/generalisation-strategies-for-building-outlines/3756#3756
88900       function getSmallestSurroundingRectangle(graph, nodes) {
88901           var points = nodes.map(function(n) { return projection(n.loc); }),
88902               hull = d3_polygonHull(points),
88903               centroid = d3_polygonCentroid(hull),
88904               minArea = Infinity,
88905               ssrExtent = [],
88906               ssrAngle = 0,
88907               c1 = hull[0];
88908
88909           for (var i = 0; i <= hull.length - 1; i++) {
88910               var c2 = (i === hull.length - 1) ? hull[0] : hull[i + 1],
88911                   angle = Math.atan2(c2[1] - c1[1], c2[0] - c1[0]),
88912                   poly = geoRotate(hull, -angle, centroid),
88913                   extent = poly.reduce(function(extent, point) {
88914                           return extent.extend(geoExtent$$1(point));
88915                       }, geoExtent$$1()),
88916                   area = extent.area();
88917
88918               if (area < minArea) {
88919                   minArea = area;
88920                   ssrExtent = extent;
88921                   ssrAngle = angle;
88922               }
88923               c1 = c2;
88924           }
88925
88926           return {
88927               poly: geoRotate(ssrExtent.polygon(), ssrAngle, centroid),
88928               angle: ssrAngle
88929           };
88930       }
88931
88932
88933       var action = function(graph, t) {
88934           if (t === null || !isFinite(t)) t = 1;
88935           t = Math.min(Math.max(+t, 0), 1);
88936
88937           var nodes = utilGetAllNodes(reflectIds, graph),
88938               ssr = getSmallestSurroundingRectangle(graph, nodes);
88939
88940           // Choose line pq = axis of symmetry.
88941           // The shape's surrounding rectangle has 2 axes of symmetry.
88942           // Reflect across the longer axis by default.
88943           var p1 = [(ssr.poly[0][0] + ssr.poly[1][0]) / 2, (ssr.poly[0][1] + ssr.poly[1][1]) / 2 ],
88944               q1 = [(ssr.poly[2][0] + ssr.poly[3][0]) / 2, (ssr.poly[2][1] + ssr.poly[3][1]) / 2 ],
88945               p2 = [(ssr.poly[3][0] + ssr.poly[4][0]) / 2, (ssr.poly[3][1] + ssr.poly[4][1]) / 2 ],
88946               q2 = [(ssr.poly[1][0] + ssr.poly[2][0]) / 2, (ssr.poly[1][1] + ssr.poly[2][1]) / 2 ],
88947               p, q;
88948
88949           var isLong = (geoVecLength(p1, q1) > geoVecLength(p2, q2));
88950           if ((useLongAxis && isLong) || (!useLongAxis && !isLong)) {
88951               p = p1;
88952               q = q1;
88953           } else {
88954               p = p2;
88955               q = q2;
88956           }
88957
88958           // reflect c across pq
88959           // http://math.stackexchange.com/questions/65503/point-reflection-over-a-line
88960           var dx = q[0] - p[0];
88961           var dy = q[1] - p[1];
88962           var a = (dx * dx - dy * dy) / (dx * dx + dy * dy);
88963           var b = 2 * dx * dy / (dx * dx + dy * dy);
88964           for (var i = 0; i < nodes.length; i++) {
88965               var node = nodes[i];
88966               var c = projection(node.loc);
88967               var c2 = [
88968                   a * (c[0] - p[0]) + b * (c[1] - p[1]) + p[0],
88969                   b * (c[0] - p[0]) - a * (c[1] - p[1]) + p[1]
88970               ];
88971               var loc2 = projection.invert(c2);
88972               node = node.move(geoVecInterp(node.loc, loc2, t));
88973               graph = graph.replace(node);
88974           }
88975
88976           return graph;
88977       };
88978
88979
88980       action.useLongAxis = function(_) {
88981           if (!arguments.length) return useLongAxis;
88982           useLongAxis = _;
88983           return action;
88984       };
88985
88986
88987       action.transitionable = true;
88988
88989
88990       return action;
88991   }
88992
88993   function actionDetachNode(nodeID) {
88994
88995       var action = function(graph) {
88996           var node = graph.entity(nodeID);
88997
88998           // Create a new node to replace the one we will detach
88999           var replacement = osmNode({ loc: node.loc });
89000           graph = graph.replace(replacement);
89001
89002           // Process each way in turn, updating the graph as we go
89003           graph = graph.parentWays(node)
89004               .reduce(function(accGraph, parentWay) {
89005                   return accGraph.replace(parentWay.replaceNode(nodeID, replacement.id));
89006               }, graph);
89007
89008           // Process any relations too
89009           return graph.parentRelations(node)
89010               .reduce(function(accGraph, parentRel) {
89011                   return accGraph.replace(parentRel.replaceMember(node, replacement));
89012               }, graph);
89013       };
89014
89015
89016       action.disabled = function(graph) {
89017           var node = graph.entity(nodeID);
89018           var parentRels = graph.parentRelations(node);
89019
89020           for (var i = 0; i < parentRels.length; i++) {
89021               var relation = parentRels[i];
89022               if (!relation.isValidRestriction()) continue;
89023
89024               for (var j = 0; j < relation.members.length; j++) {
89025                   var m = relation.members[j];
89026                   if (m.id === nodeID && (m.role === 'via' || m.role === 'location_hint')) {
89027                       return 'restriction';
89028                   }
89029               }
89030           }
89031
89032           return false;
89033       };
89034
89035
89036       return action;
89037   }
89038
89039
89040
89041   var index$6 = /*#__PURE__*/Object.freeze({
89042     d3combobox: d3combobox
89043   });
89044
89045   var Connection = services.osm;
89046
89047   var debug = false;
89048
89049   var iD = /*#__PURE__*/Object.freeze({
89050     Connection: Connection,
89051     debug: debug,
89052     lib: index$6,
89053     d3: index$3,
89054     Context: coreContext,
89055     setAreaKeys: setAreaKeys,
89056     Difference: coreDifference,
89057     Graph: coreGraph$$1,
89058     History: coreHistory,
89059     Tree: coreTree,
89060     geoCross: geoVecCross,
89061     geoInterp: geoVecInterp,
89062     geoRoundCoordinates: geoVecFloor,
89063     geoEuclideanDistance: geoVecLength,
89064     Entity: osmEntity$$1,
89065     Node: osmNode,
89066     Relation: osmRelation,
89067     Way: osmWay,
89068     BackgroundSource: rendererBackgroundSource,
89069     Background: rendererBackground,
89070     Features: rendererFeatures,
89071     Map: rendererMap,
89072     TileLayer: rendererTileLayer,
89073     Detect: utilDetect,
89074     uiPreset: uiPresetEditor,
89075     actionAddEntity: actionAddEntity,
89076     actionAddMember: actionAddMember,
89077     actionAddMidpoint: actionAddMidpoint,
89078     actionAddVertex: actionAddVertex,
89079     actionChangeMember: actionChangeMember,
89080     actionChangePreset: actionChangePreset,
89081     actionChangeTags: actionChangeTags,
89082     actionCircularize: actionCircularize,
89083     actionConnect: actionConnect,
89084     actionCopyEntities: actionCopyEntities,
89085     actionDeleteMember: actionDeleteMember,
89086     actionDeleteMultiple: actionDeleteMultiple,
89087     actionDeleteNode: actionDeleteNode,
89088     actionDeleteRelation: actionDeleteRelation,
89089     actionDeleteWay: actionDeleteWay,
89090     actionDeprecateTags: actionDeprecateTags,
89091     actionDiscardTags: actionDiscardTags,
89092     actionDisconnect: actionDisconnect,
89093     actionJoin: actionJoin,
89094     actionMerge: actionMerge,
89095     actionMergeNodes: actionMergeNodes,
89096     actionMergePolygon: actionMergePolygon,
89097     actionMergeRemoteChanges: actionMergeRemoteChanges,
89098     actionMove: actionMove,
89099     actionMoveNode: actionMoveNode,
89100     actionNoop: actionNoop,
89101     actionOrthogonalize: actionOrthogonalize,
89102     actionRestrictTurn: actionRestrictTurn,
89103     actionReverse: actionReverse,
89104     actionRevert: actionRevert,
89105     actionRotate: actionRotate,
89106     actionSplit: actionSplit,
89107     actionStraighten: actionStraighten,
89108     actionUnrestrictTurn: actionUnrestrictTurn,
89109     actionReflect: actionReflect,
89110     actionDetachNode: actionDetachNode,
89111     behaviorAddWay: behaviorAddWay,
89112     behaviorBreathe: behaviorBreathe,
89113     behaviorCopy: behaviorCopy,
89114     behaviorDrag: behaviorDrag,
89115     behaviorDrawWay: behaviorDrawWay,
89116     behaviorDraw: behaviorDraw,
89117     behaviorEdit: behaviorEdit,
89118     behaviorHash: behaviorHash,
89119     behaviorHover: behaviorHover,
89120     behaviorLasso: behaviorLasso,
89121     behaviorOperation: behaviorOperation,
89122     behaviorPaste: behaviorPaste,
89123     behaviorSelect: behaviorSelect,
89124     behaviorTail: behaviorTail,
89125     coreContext: coreContext,
89126     coreDifference: coreDifference,
89127     coreGraph: coreGraph$$1,
89128     coreHistory: coreHistory,
89129     coreTree: coreTree,
89130     data: data,
89131     dataWikipedia: wikipedia$2,
89132     dataAddressFormats: dataAddressFormats,
89133     dataDeprecated: dataDeprecated,
89134     dataDiscarded: dataDiscarded,
89135     dataLocales: dataLocales,
89136     dataPhoneFormats: dataPhoneFormats,
89137     dataShortcuts: dataShortcuts,
89138     dataImperial: dataImperial,
89139     dataDriveLeft: dataDriveLeft,
89140     dataEn: en,
89141     geoExtent: geoExtent$$1,
89142     geoLatToMeters: geoLatToMeters,
89143     geoLonToMeters: geoLonToMeters,
89144     geoMetersToLat: geoMetersToLat,
89145     geoMetersToLon: geoMetersToLon,
89146     geoMetersToOffset: geoMetersToOffset,
89147     geoOffsetToMeters: geoOffsetToMeters,
89148     geoScaleToZoom: geoScaleToZoom,
89149     geoSphericalDistance: geoSphericalDistance,
89150     geoZoomToScale: geoZoomToScale,
89151     geoAngle: geoAngle,
89152     geoChooseEdge: geoChooseEdge,
89153     geoEdgeEqual: geoEdgeEqual,
89154     geoHasLineIntersections: geoHasLineIntersections,
89155     geoHasSelfIntersections: geoHasSelfIntersections,
89156     geoRotate: geoRotate,
89157     geoLineIntersection: geoLineIntersection,
89158     geoPathHasIntersections: geoPathHasIntersections,
89159     geoPathIntersections: geoPathIntersections,
89160     geoPathLength: geoPathLength,
89161     geoPointInPolygon: geoPointInPolygon,
89162     geoPolygonContainsPolygon: geoPolygonContainsPolygon,
89163     geoPolygonIntersectsPolygon: geoPolygonIntersectsPolygon,
89164     geoViewportEdge: geoViewportEdge,
89165     geoRawMercator: geoRawMercator,
89166     geoVecAdd: geoVecAdd,
89167     geoVecAngle: geoVecAngle,
89168     geoVecCross: geoVecCross,
89169     geoVecDot: geoVecDot,
89170     geoVecEqual: geoVecEqual,
89171     geoVecFloor: geoVecFloor,
89172     geoVecInterp: geoVecInterp,
89173     geoVecLength: geoVecLength,
89174     geoVecSubtract: geoVecSubtract,
89175     geoVecScale: geoVecScale,
89176     modeAddArea: modeAddArea$$1,
89177     modeAddLine: modeAddLine$$1,
89178     modeAddPoint: modeAddPoint$$1,
89179     modeAddNote: modeAddNote$$1,
89180     modeBrowse: modeBrowse,
89181     modeDragNode: modeDragNode$$1,
89182     modeDragNote: modeDragNote$$1,
89183     modeDrawArea: modeDrawArea,
89184     modeDrawLine: modeDrawLine,
89185     modeMove: modeMove$$1,
89186     modeRotate: modeRotate$$1,
89187     modeSave: modeSave$$1,
89188     modeSelect: modeSelect,
89189     modeSelectData: modeSelectData$$1,
89190     modeSelectNote: modeSelectNote$$1,
89191     operationCircularize: operationCircularize,
89192     operationContinue: operationContinue,
89193     operationDelete: operationDelete,
89194     operationDisconnect: operationDisconnect,
89195     operationMerge: operationMerge,
89196     operationMove: operationMove,
89197     operationOrthogonalize: operationOrthogonalize,
89198     operationReflectShort: operationReflectShort,
89199     operationReflectLong: operationReflectLong,
89200     operationReverse: operationReverse,
89201     operationRotate: operationRotate,
89202     operationSplit: operationSplit,
89203     operationStraighten: operationStraighten,
89204     operationDetachNode: operationDetachNode,
89205     osmChangeset: osmChangeset,
89206     osmEntity: osmEntity$$1,
89207     osmNode: osmNode,
89208     osmNote: osmNote,
89209     osmRelation: osmRelation,
89210     osmWay: osmWay,
89211     osmIntersection: osmIntersection,
89212     osmTurn: osmTurn,
89213     osmInferRestriction: osmInferRestriction,
89214     osmLanes: osmLanes,
89215     osmIsSimpleMultipolygonOuterMember: osmIsSimpleMultipolygonOuterMember,
89216     osmSimpleMultipolygonOuterMember: osmSimpleMultipolygonOuterMember,
89217     osmJoinWays: osmJoinWays,
89218     osmOneWayTags: osmOneWayTags,
89219     osmPavedTags: osmPavedTags,
89220     osmIsInterestingTag: osmIsInterestingTag,
89221     presetCategory: presetCategory,
89222     presetCollection: presetCollection,
89223     presetField: presetField,
89224     presetPreset: presetPreset,
89225     presetIndex: presetIndex,
89226     rendererBackgroundSource: rendererBackgroundSource,
89227     rendererBackground: rendererBackground,
89228     rendererFeatures: rendererFeatures,
89229     rendererMap: rendererMap,
89230     rendererTileLayer: rendererTileLayer,
89231     services: services,
89232     serviceMapillary: serviceMapillary,
89233     serviceNominatim: serviceNominatim,
89234     serviceOpenstreetcam: serviceOpenstreetcam,
89235     serviceOsm: serviceOsm,
89236     serviceStreetside: serviceStreetside,
89237     serviceTaginfo: serviceTaginfo,
89238     serviceVectorTile: serviceVectorTile,
89239     serviceWikidata: serviceWikidata,
89240     serviceWikipedia: serviceWikipedia,
89241     svgAreas: svgAreas$$1,
89242     svgData: svgData$$1,
89243     svgDebug: svgDebug$$1,
89244     svgDefs: svgDefs,
89245     svgIcon: svgIcon,
89246     svgLabels: svgLabels,
89247     svgLayers: svgLayers,
89248     svgLines: svgLines$$1,
89249     svgMapillaryImages: svgMapillaryImages$$1,
89250     svgMapillarySigns: svgMapillarySigns$$1,
89251     svgMidpoints: svgMidpoints$$1,
89252     svgNotes: svgNotes$$1,
89253     svgMarkerSegments: svgMarkerSegments,
89254     svgOpenstreetcamImages: svgOpenstreetcamImages$$1,
89255     svgOsm: svgOsm,
89256     svgPassiveVertex: svgPassiveVertex,
89257     svgPath: svgPath,
89258     svgPointTransform: svgPointTransform,
89259     svgPoints: svgPoints$$1,
89260     svgRelationMemberTags: svgRelationMemberTags,
89261     svgSegmentWay: svgSegmentWay,
89262     svgStreetside: svgStreetside$$1,
89263     svgTagClasses: svgTagClasses,
89264     svgTouch: svgTouch,
89265     svgTurns: svgTurns,
89266     svgVertices: svgVertices$$1,
89267     uiFields: uiFields,
89268     uiFieldDefaultCheck: uiFieldCheck,
89269     uiFieldOnewayCheck: uiFieldCheck,
89270     uiFieldCheck: uiFieldCheck,
89271     uiFieldMultiCombo: uiFieldCombo,
89272     uiFieldNetworkCombo: uiFieldCombo,
89273     uiFieldSemiCombo: uiFieldCombo,
89274     uiFieldTypeCombo: uiFieldCombo,
89275     uiFieldCombo: uiFieldCombo,
89276     uiFieldUrl: uiFieldText,
89277     uiFieldNumber: uiFieldText,
89278     uiFieldTel: uiFieldText,
89279     uiFieldEmail: uiFieldText,
89280     uiFieldText: uiFieldText,
89281     uiFieldAccess: uiFieldAccess,
89282     uiFieldAddress: uiFieldAddress,
89283     uiFieldCycleway: uiFieldCycleway,
89284     uiFieldLanes: uiFieldLanes,
89285     uiFieldLocalized: uiFieldLocalized,
89286     uiFieldMaxspeed: uiFieldMaxspeed,
89287     uiFieldStructureRadio: uiFieldRadio,
89288     uiFieldRadio: uiFieldRadio,
89289     uiFieldRestrictions: uiFieldRestrictions,
89290     uiFieldTextarea: uiFieldTextarea,
89291     uiFieldWikidata: uiFieldWikidata,
89292     uiFieldWikipedia: uiFieldWikipedia,
89293     uiIntro: uiIntro,
89294     uiInfoPanels: uiInfoPanels,
89295     uiPanelBackground: uiPanelBackground,
89296     uiPanelHistory: uiPanelHistory,
89297     uiPanelLocation: uiPanelLocation,
89298     uiPanelMeasurement: uiPanelMeasurement,
89299     uiSettingsCustomBackground: uiSettingsCustomBackground,
89300     uiSettingsCustomData: uiSettingsCustomData,
89301     uiInit: uiInit,
89302     uiAccount: uiAccount,
89303     uiAttribution: uiAttribution,
89304     uiBackground: uiBackground,
89305     uiBackgroundDisplayOptions: uiBackgroundDisplayOptions,
89306     uiBackgroundOffset: uiBackgroundOffset,
89307     uiChangesetEditor: uiChangesetEditor,
89308     uiCmd: uiCmd,
89309     uiCommit: uiCommit,
89310     uiCommitChanges: uiCommitChanges,
89311     uiCommitWarnings: uiCommitWarnings,
89312     uiConfirm: uiConfirm,
89313     uiConflicts: uiConflicts,
89314     uiContributors: uiContributors,
89315     uiCurtain: uiCurtain,
89316     uiDataEditor: uiDataEditor$$1,
89317     uiDataHeader: uiDataHeader,
89318     uiDisclosure: uiDisclosure,
89319     uiEditMenu: uiEditMenu,
89320     uiEntityEditor: uiEntityEditor,
89321     uiFeatureInfo: uiFeatureInfo,
89322     uiFeatureList: uiFeatureList,
89323     uiField: uiField,
89324     uiFieldHelp: uiFieldHelp,
89325     uiFlash: uiFlash,
89326     uiFormFields: uiFormFields,
89327     uiFullScreen: uiFullScreen,
89328     uiGeolocate: uiGeolocate,
89329     uiHelp: uiHelp,
89330     uiInfo: uiInfo,
89331     uiInspector: uiInspector,
89332     uiLasso: uiLasso,
89333     uiLoading: uiLoading,
89334     uiMapData: uiMapData,
89335     uiMapInMap: uiMapInMap,
89336     uiModal: uiModal,
89337     uiModes: uiModes,
89338     uiNotice: uiNotice,
89339     uiNoteComments: uiNoteComments,
89340     uiNoteEditor: uiNoteEditor$$1,
89341     uiNoteHeader: uiNoteHeader,
89342     uiNoteReport: uiNoteReport,
89343     uiPresetEditor: uiPresetEditor,
89344     uiPresetIcon: uiPresetIcon,
89345     uiPresetList: uiPresetList,
89346     uiRadialMenu: uiRadialMenu,
89347     uiRawMemberEditor: uiRawMemberEditor,
89348     uiRawMembershipEditor: uiRawMembershipEditor,
89349     uiRawTagEditor: uiRawTagEditor,
89350     uiRestore: uiRestore,
89351     uiSave: uiSave,
89352     uiScale: uiScale,
89353     uiSelectionList: uiSelectionList,
89354     uiSidebar: uiSidebar$$1,
89355     uiSourceSwitch: uiSourceSwitch,
89356     uiSpinner: uiSpinner,
89357     uiSplash: uiSplash,
89358     uiStatus: uiStatus,
89359     uiSuccess: uiSuccess$$1,
89360     uiTagReference: uiTagReference,
89361     uiToggle: uiToggle,
89362     uiTooltipHtml: uiTooltipHtml,
89363     uiUndoRedo: uiUndoRedo,
89364     uiVersion: uiVersion,
89365     uiViewOnOSM: uiViewOnOSM,
89366     uiZoom: uiZoom,
89367     utilAsyncMap: utilAsyncMap,
89368     utilCallWhenIdle: utilCallWhenIdle,
89369     utilCleanTags: utilCleanTags,
89370     utilDisplayName: utilDisplayName,
89371     utilDisplayNameForPath: utilDisplayNameForPath,
89372     utilDisplayType: utilDisplayType,
89373     utilEditDistance: utilEditDistance,
89374     utilEntitySelector: utilEntitySelector,
89375     utilEntityOrMemberSelector: utilEntityOrMemberSelector,
89376     utilEntityOrDeepMemberSelector: utilEntityOrDeepMemberSelector,
89377     utilFastMouse: utilFastMouse,
89378     utilFunctor: utilFunctor,
89379     utilGetAllNodes: utilGetAllNodes,
89380     utilGetPrototypeOf: utilGetPrototypeOf,
89381     utilGetSetValue: utilGetSetValue,
89382     utilHashcode: utilHashcode,
89383     utilHighlightEntity: utilHighlightEntity,
89384     utilIdleWorker: utilIdleWorker,
89385     utilKeybinding: utilKeybinding,
89386     utilNoAuto: utilNoAuto,
89387     utilPrefixCSSProperty: utilPrefixCSSProperty,
89388     utilPrefixDOMProperty: utilPrefixDOMProperty,
89389     utilQsString: utilQsString,
89390     utilRebind: utilRebind,
89391     utilSetTransform: utilSetTransform,
89392     utilSessionMutex: utilSessionMutex,
89393     utilStringQs: utilStringQs,
89394     utilTagText: utilTagText,
89395     utilTiler: utilTiler,
89396     utilTriggerEvent: utilTriggerEvent,
89397     utilWrap: utilWrap,
89398     d3combobox: d3combobox,
89399     validationDeprecatedTag: validationDeprecatedTag,
89400     validationDisconnectedHighway: validationDisconnectedHighway,
89401     validationManyDeletions: validationManyDeletions,
89402     validationMissingTag: validationMissingTag,
89403     validationOldMultipolygon: validationOldMultipolygon,
89404     validationTagSuggestsArea: validationTagSuggestsArea
89405   });
89406
89407   window.iD = iD;
89408
89409 }());
89410 //# sourceMappingURL=iD.js.map